当前位置: 首页 > news >正文

springcloud-config git配置源加载(部署公钥问题)

使用gitUrl作为配置源

gitee 或者github 中有类似于发布密钥的功能,允许通过私钥只读访问指定的仓库,文档中说的是 限制了git的操作为pull 和 clone。生成私钥的方式文档连接在此 https://gitee.com/help/articles/4181#article-header0
spring config只支持PEM格式的私钥,所以在利用ssh-keygen进行生成的时候需要指定格式
ssh-keygen -m PEM -f id_rsa ,执行成功之后,可以在 ~./ssh/ 目录下找到id_rsa.pub id_rsa两个文件,一个公钥,一个私钥。然后对应平台的公钥管理中,添加公钥,将对应的.pub文件中的内容复制进去,选择好对应的仓库。可以使用已下指令进行测试,这里以gitee平台为例子
文档中使用ssh -T git@gitee.com进行测试,但是尝试之后发现,报错ssh: Could not resolve hostname gitee.com: Name or service not known我使用的另外一个指令 git@gitee.com:your_username/config-repo.git这个地址是从对应仓库的ssh地址复制过来的

git ls-remote git@gitee.com:your_username/config-repo.git
39e47b3xxxxxxxxxxxxxxxxxxxxxxxxxxx2f6101d	HEAD
39e47bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6101d	refs/heads/master

如果成功的话会提示你远程分支的情况。
后面又尝试了一次 ssh -T git@gitee.com又可以成功了,成功之后输出如下

ssh -T git@gitee.com
Hi Anonymous (DeployKey)! You've successfully authenticated, but GITEE.COM does not provide shell access.
Note: Perhaps the current use is DeployKey.
Note: DeployKey only supports pull/fetch operations

以上验证时间为2024年6月24日
以上步骤能通过就说明部署公钥的配置没有问题了,接着在springcloud config 的微服务中将
spring.cloud.config.server.git.uri=git@gitee.com:your_username/config-repo.git设置为实际仓库地址,spring.cloud.config.server.git.private-key=xxxx这是为上述步骤生成的 id_rsa私钥内容地址,这里有一个坑,如果使用的是properties格式的配置文件在配置的时候需要保留输出格式


-----BEGIN RSA PRIVATE KEY-----
...密钥内容
...密钥内容
...密钥内容
-----END RSA PRIVATE KEY-----

比如这是在cat ~/ssh/id_rsa出来的内容,在复制到配置文件中的时候需要在每一行的末尾追加\n

spring.cloud.config.server.git.private-key=-----BEGIN RSA PRIVATE KEY-----\n\
密钥内容\n\
密钥内容\n\
密钥内容\n\
-----END RSA PRIVATE KEY-----

不然spring config会认为不是一个正确的privatekey报错
Reason: Property 'spring.cloud.config.server.git.privateKey' is not a valid private key

使用Java 生成SSH-RSA格式密钥对

该方法可以用在你没有linux系统的情况下生成密钥对,代码使用4o老师进行生成。

package com.fengxiang.cloudconfig.utils;import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;public class KeyPairGeneratorProcess {public static void main(String[] args) {try {// 1. 创建KeyPairGenerator对象,指定算法为RSAKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");// 2. 初始化KeyPairGenerator,指定密钥长度keyPairGenerator.initialize(2048);// 3. 生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 4. 获取公钥和私钥PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 5. 打印密钥(以十六进制编码或Base64编码)System.out.println("Public Key: " + bytesToHex(publicKey.getEncoded()));System.out.println("Private Key: " + bytesToHex(privateKey.getEncoded()));// 5. 以ssh-rsa格式输出公钥String sshPublicKey = encodeSSHRSAPublicKey(publicKey, "git@gitee.com");System.out.println("SSH Public Key: " + sshPublicKey);// 6. 以PEM格式输出私钥String pemPrivateKey = encodePEMPrivateKey(privateKey);System.out.println("PEM Private Key:\n" + pemPrivateKey);} catch (Exception e) {e.printStackTrace();}}private static String encodeSSHRSAPublicKey(PublicKey publicKey, String comment) throws Exception {RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;byte[] sshRsaPrefix = new byte[] {0x00, 0x00, 0x00, 0x07, 's', 's', 'h', '-', 'r', 's', 'a'};byte[] exponent = rsaPublicKey.getPublicExponent().toByteArray();byte[] modulus = rsaPublicKey.getModulus().toByteArray();byte[] result = new byte[sshRsaPrefix.length + 4 + exponent.length + 4 + modulus.length];int i = 0;System.arraycopy(sshRsaPrefix, 0, result, i, sshRsaPrefix.length);i += sshRsaPrefix.length;result[i++] = (byte) ((exponent.length >> 24) & 0xff);result[i++] = (byte) ((exponent.length >> 16) & 0xff);result[i++] = (byte) ((exponent.length >> 8) & 0xff);result[i++] = (byte) (exponent.length & 0xff);System.arraycopy(exponent, 0, result, i, exponent.length);i += exponent.length;result[i++] = (byte) ((modulus.length >> 24) & 0xff);result[i++] = (byte) ((modulus.length >> 16) & 0xff);result[i++] = (byte) ((modulus.length >> 8) & 0xff);result[i++] = (byte) (modulus.length & 0xff);System.arraycopy(modulus, 0, result, i, modulus.length);String base64Key = Base64.getEncoder().encodeToString(result);return "ssh-rsa " + base64Key + " " + comment;}private static String encodePEMPrivateKey(PrivateKey privateKey) {byte[] keyBytes = privateKey.getEncoded();String base64Key = Base64.getMimeEncoder(64, new byte[] {'\n'}).encodeToString(keyBytes);return "-----BEGIN PRIVATE KEY-----\n" + base64Key + "\n-----END PRIVATE KEY-----";}// 将字节数组转换为十六进制字符串的辅助方法public static String bytesToHex(byte[] bytes) {StringBuilder hexString = new StringBuilder();for (byte b : bytes) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();}
}

需要注意的一点是使用这种方式生成的privatekey进行配置的时候
spring.cloud.config.server.git.private-key=-----BEGIN PRIVATE KEY-----这部分的字符串是没有RSA的

加密

对于配置文件在修改和配置的过程中都需要存放到第三方的或者自建的git服务中,这个过程中可能会导致密钥的泄露,可以使用spring.cloud.config.server.git.private-key={cipher}95376ecf73615297e072fe0819d9cefd85f这种形式来避免明文泄露,同时在configserver的bootstrap.yml设置好对应的参数,该文件不必暴露到git仓库中

encrypt.key=123456
encrypt.salt=123456
spring.cloud.config.server.encrypt.enabled=true

然后在使用明文请求该服务的/encrypt 接口,即可获取到加密之后的密文。只要妥善保存好encrypt.key salt就可以将任何password privateKey通过第三方或者公开的git 仓库进行共享

相关文章:

springcloud-config git配置源加载(部署公钥问题)

使用gitUrl作为配置源 gitee 或者github 中有类似于发布密钥的功能,允许通过私钥只读访问指定的仓库,文档中说的是 限制了git的操作为pull 和 clone。生成私钥的方式文档连接在此 https://gitee.com/help/articles/4181#article-header0 spring config只…...

华为OD机考题HJ24 合唱队

前言 应广大同学要求,开始以OD机考题作为练习题,看看算法和数据结构掌握情况。有需要练习的可以关注下。 描述 N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。 设𝐾K位同学从左到…...

基于bootstrap的12种登录注册页面模板

基于bootstrap的12种登录注册页面模板,分三种类型,默认简单的登录和注册,带背景图片的登录和注册,支持弹窗的登录和注册页面html下载。 微信扫码下载...

【劳德巴赫 Trace32 高阶系列 3.1 -- trace32 svf 文件操作与 InitState】

文章目录 SVF InitStateJTAG 状态机JTAG Test-Logic-ResetJTAG Run-Test-IdleSVF InitState Format: JTAG.PROGRAM.SVF <file> [/<option>] <option>: IRPRE <value>IRPOST <value>DRPRE <value>DRPOST <value<...

爬虫知识:补环境相关知识

学习目标&#xff1a;知道为什么要补环境&#xff0c;知道要补什么环境&#xff08;使用Proxy检测&#xff09;。没有讲解怎么补 本章没有动手去实操&#xff0c;只是纯理论知识 补环境介绍 DOM与BOM DOM主要关注文档内容和结构&#xff0c;而BOM关注浏览器窗口和功能。在浏…...

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 引言&#xff1a; crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…...

【Python】探索 Pandas 中的 where 方法:条件筛选的利器

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 在数据分析中&#xff0c;Pandas 是一个强大且…...

Pikachu靶场--Sql Inject

参考借鉴 pikachu靶场练习&#xff08;详细&#xff0c;完整&#xff0c;适合新手阅读&#xff09;-CSDN博客 数字型注入(post) 这种类型的SQL注入利用在用户输入处插入数值&#xff0c;而不是字符串。攻击者试图通过输入数字来修改SQL查询的逻辑&#xff0c;以执行恶意操作。…...

【Python从入门到进阶】59、Pandas库中Series对象的操作(二)

接上篇《58、Pandas库中Series对象的操作(一)》 上一篇我们讲解了Pandas库中Series对象的基本概念、对象创建和操作&#xff0c;本篇我们来继续学习Series对象的运算、函数应用、时间序列操作&#xff0c;以及Series的案例实践。 一、Series对象的运算 1. 数值型数据的算术运…...

【PYG】使用datalist定义数据集,创建一个包含多个Data对象的列表并使用DataLoader来加载这些数据

为了使用你提到的封装方式来创建一个包含多个 Data 对象的列表并使用 DataLoader 来加载这些数据&#xff0c;我们可以按照以下步骤进行&#xff1a; 创建数据&#xff1a;生成节点特征矩阵、边索引矩阵和标签。封装数据&#xff1a;使用 Data 对象将这些数据封装起来。使用 D…...

【设计模式】【创建型5-2】【工厂方法模式】

文章目录 工厂方法模式工厂方法模式的结构示例产品接口具体产品工厂接口具体工厂客户端代码 实际的使用 工厂方法模式 工厂方法模式的结构 产品&#xff08;Product&#xff09;&#xff1a;定义工厂方法所创建的对象的接口。 具体产品&#xff08;ConcreteProduct&#xff0…...

python API自动化(Pytest+Excel+Allure完整框架集成+yaml入门+大量响应报文处理及加解密、签名处理)

1.pytest数据参数化 假设你需要测试一个登录功能&#xff0c;输入用户名和密码后验证登录结果。可以使用参数化实现多组输入数据的测试: 测试正确的用户名和密码登录成功 测试正确的用户名和错误的密码登录失败 测试错误的用户名和正确的密码登录失败 测试错误的用户名和密码登…...

【Postman学习】

Postman是一个非常流行的API开发和测试工具&#xff0c;广泛用于Web服务的开发、测试和调试。它提供了一个图形界面&#xff0c;允许用户轻松地构建、发送和管理HTTP(S)请求&#xff0c;同时查看和分析响应。下面是对Postman接口测试工具的详细解释&#xff1a; 1. Postman简介…...

【Linux】IO多路复用——select,poll,epoll的概念和使用,三种模型的特点和优缺点,epoll的工作模式

文章目录 Linux多路复用1. select1.1 select的概念1.2 select的函数使用1.3 select的优缺点 2. poll2.1 poll的概念2.2 poll的函数使用2.3 poll的优缺点 3. epoll3.1 epoll的概念3.2 epoll的函数使用3.3 epoll的优点3.4 epoll工作模式 Linux多路复用 IO多路复用是一种操作系统的…...

IBCS 虚拟专线——让企业用于独立IP

在当今竞争激烈的商业世界中&#xff0c;企业的数字化运营对网络和服务器的性能有着极高的要求。作为一家企业的 IT 主管&#xff0c;我深刻体会到了在网络和服务器配置方面所面临的种种挑战&#xff0c;以及 IBCS 虚拟专线带来的革命性改变。 我们企业在业务扩张的过程中&…...

驾驭巨龙:Perl中大型文本文件的处理艺术

驾驭巨龙&#xff1a;Perl中大型文本文件的处理艺术 Perl&#xff0c;这门被亲切称为“实用提取和报告语言”的编程语言&#xff0c;自从诞生之日起&#xff0c;就以其卓越的文本处理能力闻名于世。在面对庞大的文本文件时&#xff0c;Perl的强大功能更是得到了充分的体现。本…...

Kafka~特殊技术细节设计:分区机制、重平衡机制、Leader选举机制、高水位HW机制

分区机制 Kafka 的分区机制是其实现高吞吐和可扩展性的重要特性之一。 Kafka 中的数据具有三层结构&#xff0c;即主题&#xff08;topic&#xff09;-> 分区&#xff08;partition&#xff09;-> 消息&#xff08;message&#xff09;。一个 Kafka 主题可以包含多个分…...

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息&#xff0c;在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…...

云计算 | 期末梳理(中)

1. 经典虚拟机的特点 多态(Polymorphism):支持多种类型的OS。重用(Manifolding):虚拟机的镜像可以被反复复制和使用。复用(Multiplexing):虚拟机能够对物理资源时分复用。2. 系统接口 最基本的接口是微处理器指令集架构(ISA)。应用程序二进制接口(ABI)给程序提供使用硬件资源…...

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍插件pytest-order&#xff0c;用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支&#xff0c;但是pytest-ordering已经不再维护了&#xff0c;建议大家直接使用pytest-order。 官方文…...

别再手动写矩阵运算了!C++项目里用Eigen库的正确姿势(附性能对比)

别再手动写矩阵运算了&#xff01;C项目里用Eigen库的正确姿势&#xff08;附性能对比&#xff09; 在计算机视觉、机器人控制或物理仿真领域&#xff0c;C开发者经常需要处理复杂的矩阵运算。我曾见过一个SLAM项目的前端代码&#xff0c;仅为了计算两个坐标系之间的变换矩阵&a…...

【ElevenLabs尼泊尔文语音实战指南】:20年AI语音工程师亲授7大避坑要点与本地化部署全流程

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs尼泊尔文语音技术概览与核心价值 ElevenLabs 自 2023 年起逐步扩展其多语言语音合成能力&#xff0c;尼泊尔文&#xff08;Nepali, ISO 639-1: ne&#xff09;作为首批支持的南亚语系之一&am…...

从PAM到BanditPAM:k-Medoids聚类算法的演进、优化与实战选型指南

1. 为什么需要k-Medoids算法&#xff1f; k-Means算法大家应该都不陌生&#xff0c;它简单高效&#xff0c;是很多数据科学项目的入门首选。但我在实际项目中经常遇到这样的情况&#xff1a;当数据集中存在异常值或噪声点时&#xff0c;k-Means的表现就会大打折扣。这是因为k-M…...

[实战] 2026年CNC加工质量控制:从工程图纸数字化到检验计划生成的全流程解析

在 2026 年的精密制造环境中&#xff0c;cnc 加工&#xff08;CNC machining&#xff09;已不再仅仅是切削工艺的竞争&#xff0c;更是数字化协作与质量控制能力的较量。随着多品种、小批量生产模式成为主流&#xff0c;如何快速解析复杂的工程图纸并制定高精度的检验计划&…...

通过Taotoken用量看板直观掌握团队API消耗情况

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken用量看板直观掌握团队API消耗情况 对于依赖大模型API进行开发的团队而言&#xff0c;清晰、准确地掌握资源消耗情况是…...

输入输出:iostream 为什么不是 printf 的替代品

文章目录引言一、printf 的优雅与致命缺陷1.1 printf 为什么好用1.2 三个致命缺陷二、iostream 的哲学&#xff1a;类型安全 可扩展2.1 基本用法2.2 标准流一览2.3 输入&#xff1a;cin 为什么比 scanf 安全三、自定义类型的输出&#xff1a;让 printf 永远做不到的事四、格式…...

Power Query处理月度报表,遇到数据有null怎么办?详解【标准】运算与自定义列的计算逻辑差异

Power Query空值处理实战&#xff1a;标准运算与自定义列的计算逻辑深度解析 财务总监Lisa盯着屏幕上满是错误标记的月度汇总报表&#xff0c;眉头紧锁。她刚刚用Power Query合并了六个部门的销售数据&#xff0c;却发现总金额列出现了大量意料之外的null值——这直接导致季度预…...

PangoDesign Suite与Modelsim协同仿真:从库编译到实战排错全解析

1. 为什么需要PangoDesign Suite与Modelsim协同仿真 第一次接触FPGA仿真时&#xff0c;我也被各种专业术语绕晕了。直到某次项目出现时序问题&#xff0c;才发现仿真工具就像汽车的"安全气囊"——平时感觉不到存在&#xff0c;关键时刻能救命。PangoDesign Suite&…...

STM32驱动MAX31855测温模块:从SPI时序到代码实现的保姆级避坑指南

STM32驱动MAX31855测温模块&#xff1a;从SPI时序到代码实现的保姆级避坑指南 在嵌入式开发领域&#xff0c;精确的温度测量往往是项目成败的关键。MAX31855作为一款集成冷端补偿的热电偶数字转换器&#xff0c;凭借其2℃的高精度和-200℃至700℃的宽测温范围&#xff0c;成为工…...

生物信息学新手必看:用K-means和WGCNA分析转录组数据的保姆级流程(附R代码)

生物信息学实战&#xff1a;从K-means到WGCNA的转录组分析全流程指南 第一次接触转录组数据分析时&#xff0c;我盯着满屏的基因表达矩阵完全无从下手。那些论文里看似流畅的分析流程&#xff0c;在实际操作时却处处是坑——数据格式报错、参数设置不合理、结果解读模糊...这正…...