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");
    }

}