Spring 云配置服务器 GitHub SHA-1 错误
Spring Cloud Config Server GitHub SHA-1 error
上下文
这是关于 Spring Cloud Config Server 业余项目(@EnableConfigServer
)。
昨天,应用程序可以启动。
今天,由于 Git 通信错误,应用程序无法启动。
来自 GitHub's official blog post,提到从 2022 年 3 月 15 日起不再支持 SHA-1。这解释了我这两天得到的结果。
March 15, 2022
Changes made permanent.
We’ll permanently stop accepting DSA keys. RSA keys uploaded after the cut-off point above will work only with SHA-2 signatures (but again, RSA keys uploaded before this date will continue to work with SHA-1). The deprecated MACs, ciphers, and unencrypted Git protocol will be permanently disabled.
即使我没有删除现有的SSH密钥,今天仍然无法启动。但无论如何,现在存储库设置的“部署密钥”部分下的唯一密钥是在 2022 年 3 月 15 日截止日期之后添加的 SSH 密钥。
依赖版本
依赖管理:
Dependency
Version
spring-cloud-dependencies
Hoxton.SR12
依赖性:
Dependency
Version
spring-cloud-config-server
(Managed)
Spring 应用配置
application.yml
:
spring:
cloud:
config:
server:
git:
ignore-local-ssh-settings: true
uri: git@github.com:xxx/xxx.git
private-key: |
-----BEGIN RSA PRIVATE KEY-----
(omitted)
-----END RSA PRIVATE KEY-----
附加信息
涉及的回购是一个 Git在“部署密钥”设置部分下配置了 SSH 密钥的集线器私人回购。
我一直在根据 Spring Cloud Config 官方文档生成 SSH 密钥对。
错误
从控制台日志中,我看到:
ERROR: You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type.
Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.
这来自 JGit 作为 org.eclipse.jgit.errors.NoRemoteRepositoryException
。
问题和我解决问题的尝试
我尝试将 Spring 云依赖管理版本升级到 Maven 存储库中可用的最新版本,即 2021.0.1
,因为它使用更新版本的 JGit.
但是,我仍然面临同样的错误。
如果我只是切换到具有完全相同配置的 GitLab,无论 Spring Cloud 依赖版本和 JGit 版本如何,它都可以正常工作。
如果我想使用 GitHub,我还能做什么?
我也有同样的问题。
见https://github.com/spring-cloud/spring-cloud-config/issues/2061
目前,我有一个肮脏的解决方法:使用 https uri、用户名和密码(可能是个人秘密令牌)。
spring:
cloud:
config:
server:
git:
uri: https://github.com/org/repo
username: ...
password: ...
使用 scs v2.1 测试了以下内容
使用 ecdsa:
获取hostKey
ssh-keyscan -t ecdsa github.com
# github.com:22 SSH-2.0-babeld-4f04c79d
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
生成新密钥
ssh-keygen -t ecdsa -b 256 -m PEM
将生成的 public 密钥添加到您的 github 存储库的部署密钥中。
使用主机密钥、主机密钥算法和生成的私钥创建或更新您的配置服务器。
cf create-service p-config-server standard <config-server-name> -c '{"git": { "uri": "git@github.com:<repo>.git", "privateKey": "<generated_key>", "hostKey": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=","hostKeyAlgorithm": "ecdsa-sha2-nistp256"} }'
如果您以前从本地主机使用过 ssh,则应使用 ecdsa 更改 RSA 密钥
命令:ssh-keygen -m PEM -t ecdsa -b 256
./ssh 文件夹中的配置文件应该类似于
Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_ecdsa
如果您覆盖 属性 个文件中的本地 ssh:
spring:
cloud:
config:
server:
git:
host-key: this can be found in know hosts example : AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIb...........
host-key-algorithm: ecdsa-sha2-nistp256
ignore-local-ssh-settings: false
private-key: |
-----BEGIN EC PRIVATE KEY-----
.................
.................
.........................
-----END EC PRIVATE KEY-----
参考:https://github.com/spring-cloud/spring-cloud-config/issues/2061#issuecomment-1070779477
Spring Cloud Config Server(此答案指的是 spring-cloud-starter-parent
版本 2020.0.4
)使用 org.eclipse.jgit
库进行其 git 操作,尽管它们包括最近的版本 5.1.3
它又包含“有问题的”库 com.jcraft.jsch
版本 0.1.55
,用于在检出存储库时基于 ssh 的通信。这里的问题是这个库落后了,不支持更新版本的 RSA 密钥 (sha2-256 / sha2-512)。
在这一点上,我将表示我不是这里的权威,但刚刚提出了这个问题的另一面,当 GitHub 在 2022 年 3 月 15 日关闭 RSA SHA-1 时,它就表现出来了。
因此,即使您可能有一个 RSA SHA-2 256/512 密钥对,public 密钥 GitHub,配置服务器的私钥,com.jcraft.jsch
库似乎降级到它所知道的,然后使用 sha-1 与 GitHub 通信并拒绝连接。
现在介绍适用于上述版本的解决方案。有一个 com.jcraft.jsch
的分支实现了 Github 接受的较新版本的 RSA。这主要是 drop-in 替换。以下是我所做的更改:
pom.xml: 切换出有问题的 jar
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<!-- Excluding this older, not maintained library that does not support newer versions of RSA -->
<exclusions>
<exclusion>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Adding this fork of com.jcraft.jsch, which supports newer versions of RSA (sha2-256 / sha2-512) -->
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.0</version>
</dependency>
然而,jgit 配置 com.jcraft.jsch
的方式仅通过单独配置 pom.xml 和 drop-in 是行不通的,我还必须添加一个 shim 配置class 修复问题:
import com.jcraft.jsch.JSch;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JschConfig {
//Shim to fix the way jGit configures JSch
static{
JSch.setConfig("signature.rsa", "com.jcraft.jsch.jce.SignatureRSA");
}
}
上下文
这是关于 Spring Cloud Config Server 业余项目(@EnableConfigServer
)。
昨天,应用程序可以启动。
今天,由于 Git 通信错误,应用程序无法启动。
来自 GitHub's official blog post,提到从 2022 年 3 月 15 日起不再支持 SHA-1。这解释了我这两天得到的结果。
March 15, 2022
Changes made permanent.
We’ll permanently stop accepting DSA keys. RSA keys uploaded after the cut-off point above will work only with SHA-2 signatures (but again, RSA keys uploaded before this date will continue to work with SHA-1). The deprecated MACs, ciphers, and unencrypted Git protocol will be permanently disabled.
即使我没有删除现有的SSH密钥,今天仍然无法启动。但无论如何,现在存储库设置的“部署密钥”部分下的唯一密钥是在 2022 年 3 月 15 日截止日期之后添加的 SSH 密钥。
依赖版本
依赖管理:
Dependency | Version |
---|---|
spring-cloud-dependencies | Hoxton.SR12 |
依赖性:
Dependency | Version |
---|---|
spring-cloud-config-server | (Managed) |
Spring 应用配置
application.yml
:
spring:
cloud:
config:
server:
git:
ignore-local-ssh-settings: true
uri: git@github.com:xxx/xxx.git
private-key: |
-----BEGIN RSA PRIVATE KEY-----
(omitted)
-----END RSA PRIVATE KEY-----
附加信息
涉及的回购是一个 Git在“部署密钥”设置部分下配置了 SSH 密钥的集线器私人回购。
我一直在根据 Spring Cloud Config 官方文档生成 SSH 密钥对。
错误
从控制台日志中,我看到:
ERROR: You're using an RSA key with SHA-1, which is no longer allowed. Please use a newer client or a different key type. Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.
这来自 JGit 作为 org.eclipse.jgit.errors.NoRemoteRepositoryException
。
问题和我解决问题的尝试
我尝试将 Spring 云依赖管理版本升级到 Maven 存储库中可用的最新版本,即 2021.0.1
,因为它使用更新版本的 JGit.
但是,我仍然面临同样的错误。
如果我只是切换到具有完全相同配置的 GitLab,无论 Spring Cloud 依赖版本和 JGit 版本如何,它都可以正常工作。
如果我想使用 GitHub,我还能做什么?
我也有同样的问题。
见https://github.com/spring-cloud/spring-cloud-config/issues/2061
目前,我有一个肮脏的解决方法:使用 https uri、用户名和密码(可能是个人秘密令牌)。
spring:
cloud:
config:
server:
git:
uri: https://github.com/org/repo
username: ...
password: ...
使用 scs v2.1 测试了以下内容
使用 ecdsa:
获取hostKey
ssh-keyscan -t ecdsa github.com
# github.com:22 SSH-2.0-babeld-4f04c79d
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
生成新密钥
ssh-keygen -t ecdsa -b 256 -m PEM
将生成的 public 密钥添加到您的 github 存储库的部署密钥中。
使用主机密钥、主机密钥算法和生成的私钥创建或更新您的配置服务器。
cf create-service p-config-server standard <config-server-name> -c '{"git": { "uri": "git@github.com:<repo>.git", "privateKey": "<generated_key>", "hostKey": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=","hostKeyAlgorithm": "ecdsa-sha2-nistp256"} }'
如果您以前从本地主机使用过 ssh,则应使用 ecdsa 更改 RSA 密钥
命令:ssh-keygen -m PEM -t ecdsa -b 256
./ssh 文件夹中的配置文件应该类似于
Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_ecdsa
如果您覆盖 属性 个文件中的本地 ssh:
spring:
cloud:
config:
server:
git:
host-key: this can be found in know hosts example : AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIb...........
host-key-algorithm: ecdsa-sha2-nistp256
ignore-local-ssh-settings: false
private-key: |
-----BEGIN EC PRIVATE KEY-----
.................
.................
.........................
-----END EC PRIVATE KEY-----
参考:https://github.com/spring-cloud/spring-cloud-config/issues/2061#issuecomment-1070779477
Spring Cloud Config Server(此答案指的是 spring-cloud-starter-parent
版本 2020.0.4
)使用 org.eclipse.jgit
库进行其 git 操作,尽管它们包括最近的版本 5.1.3
它又包含“有问题的”库 com.jcraft.jsch
版本 0.1.55
,用于在检出存储库时基于 ssh 的通信。这里的问题是这个库落后了,不支持更新版本的 RSA 密钥 (sha2-256 / sha2-512)。
在这一点上,我将表示我不是这里的权威,但刚刚提出了这个问题的另一面,当 GitHub 在 2022 年 3 月 15 日关闭 RSA SHA-1 时,它就表现出来了。
因此,即使您可能有一个 RSA SHA-2 256/512 密钥对,public 密钥 GitHub,配置服务器的私钥,com.jcraft.jsch
库似乎降级到它所知道的,然后使用 sha-1 与 GitHub 通信并拒绝连接。
现在介绍适用于上述版本的解决方案。有一个 com.jcraft.jsch
的分支实现了 Github 接受的较新版本的 RSA。这主要是 drop-in 替换。以下是我所做的更改:
pom.xml: 切换出有问题的 jar
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<!-- Excluding this older, not maintained library that does not support newer versions of RSA -->
<exclusions>
<exclusion>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Adding this fork of com.jcraft.jsch, which supports newer versions of RSA (sha2-256 / sha2-512) -->
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.0</version>
</dependency>
然而,jgit 配置 com.jcraft.jsch
的方式仅通过单独配置 pom.xml 和 drop-in 是行不通的,我还必须添加一个 shim 配置class 修复问题:
import com.jcraft.jsch.JSch;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JschConfig {
//Shim to fix the way jGit configures JSch
static{
JSch.setConfig("signature.rsa", "com.jcraft.jsch.jce.SignatureRSA");
}
}