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<...
爬虫知识:补环境相关知识
学习目标:知道为什么要补环境,知道要补什么环境(使用Proxy检测)。没有讲解怎么补 本章没有动手去实操,只是纯理论知识 补环境介绍 DOM与BOM DOM主要关注文档内容和结构,而BOM关注浏览器窗口和功能。在浏…...

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 引言: crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…...
【Python】探索 Pandas 中的 where 方法:条件筛选的利器
那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 🎵 王心凌《那年夏天宁静的海》 在数据分析中,Pandas 是一个强大且…...

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

【Python从入门到进阶】59、Pandas库中Series对象的操作(二)
接上篇《58、Pandas库中Series对象的操作(一)》 上一篇我们讲解了Pandas库中Series对象的基本概念、对象创建和操作,本篇我们来继续学习Series对象的运算、函数应用、时间序列操作,以及Series的案例实践。 一、Series对象的运算 1. 数值型数据的算术运…...
【PYG】使用datalist定义数据集,创建一个包含多个Data对象的列表并使用DataLoader来加载这些数据
为了使用你提到的封装方式来创建一个包含多个 Data 对象的列表并使用 DataLoader 来加载这些数据,我们可以按照以下步骤进行: 创建数据:生成节点特征矩阵、边索引矩阵和标签。封装数据:使用 Data 对象将这些数据封装起来。使用 D…...
【设计模式】【创建型5-2】【工厂方法模式】
文章目录 工厂方法模式工厂方法模式的结构示例产品接口具体产品工厂接口具体工厂客户端代码 实际的使用 工厂方法模式 工厂方法模式的结构 产品(Product):定义工厂方法所创建的对象的接口。 具体产品(ConcreteProduct࿰…...

python API自动化(Pytest+Excel+Allure完整框架集成+yaml入门+大量响应报文处理及加解密、签名处理)
1.pytest数据参数化 假设你需要测试一个登录功能,输入用户名和密码后验证登录结果。可以使用参数化实现多组输入数据的测试: 测试正确的用户名和密码登录成功 测试正确的用户名和错误的密码登录失败 测试错误的用户名和正确的密码登录失败 测试错误的用户名和密码登…...
【Postman学习】
Postman是一个非常流行的API开发和测试工具,广泛用于Web服务的开发、测试和调试。它提供了一个图形界面,允许用户轻松地构建、发送和管理HTTP(S)请求,同时查看和分析响应。下面是对Postman接口测试工具的详细解释: 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
在当今竞争激烈的商业世界中,企业的数字化运营对网络和服务器的性能有着极高的要求。作为一家企业的 IT 主管,我深刻体会到了在网络和服务器配置方面所面临的种种挑战,以及 IBCS 虚拟专线带来的革命性改变。 我们企业在业务扩张的过程中&…...
驾驭巨龙:Perl中大型文本文件的处理艺术
驾驭巨龙:Perl中大型文本文件的处理艺术 Perl,这门被亲切称为“实用提取和报告语言”的编程语言,自从诞生之日起,就以其卓越的文本处理能力闻名于世。在面对庞大的文本文件时,Perl的强大功能更是得到了充分的体现。本…...

Kafka~特殊技术细节设计:分区机制、重平衡机制、Leader选举机制、高水位HW机制
分区机制 Kafka 的分区机制是其实现高吞吐和可扩展性的重要特性之一。 Kafka 中的数据具有三层结构,即主题(topic)-> 分区(partition)-> 消息(message)。一个 Kafka 主题可以包含多个分…...

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password
为了让spring admin 能正确获取到 spring config的actuator的信息,在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提供了丰富的插件来扩展其功能,本章介绍插件pytest-order,用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支,但是pytest-ordering已经不再维护了,建议大家直接使用pytest-order。 官方文…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...