Ошибка Spring Cloud Config Server GitHub SHA-1

Контекст

Это касается Spring Cloud Config Server хобби-проект@EnableConfigServer).

Вчера приложение удалось запустить.

Сегодня приложение не удалось запустить из-за ошибки связи Git.

В Официальный пост в блоге GitHub упоминается, что SHA-1 больше не поддерживается с 15 марта 2022 года. И это объясняет результаты, которые я получаю за эти 2 дня.

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, он все равно не запустился сегодня. Но в любом случае, теперь единственным ключом в разделе «Развертывание ключей» настроек репозитория является ключ SSH, который был добавлен после даты отключения 15 марта 2022 года.


Версии зависимостей

Управление зависимостями:

ЗависимостьВерсия
Spring-cloud-зависимостиХокстон.SR12

Зависимость:

ЗависимостьВерсия
spring-cloud-config-сервер(Удалось)

Конфигурации приложения Spring

application.yml:

spring:
  cloud:
    config:
      server:
        git:
          ignore-local-ssh-settings: true
          uri: [email protected]:xxx/xxx.git
          private-key: |
                        -----BEGIN RSA PRIVATE KEY-----
                        (omitted)
                        -----END RSA PRIVATE KEY-----

Дополнительная информация

Используемый репозиторий — это частный репозиторий GitHub, настроенный с помощью ключа SSH в разделе настроек «Развертывание ключей».

Я генерировал пары ключей SSH в соответствии с официальной документацией Spring Cloud Config.


Ошибка

В логе консоли вижу:

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 Cloud до последней доступной в репозитории Maven, т. е. 2021.0.1, поскольку она использует более новую версию JGit.

Тем не менее, я все еще сталкиваюсь с той же ошибкой.

Если я просто переключусь на GitLab с точно такими же конфигурациями, он просто будет работать независимо от версии зависимостей Spring Cloud и версии JGit.

Что еще я могу сделать, если я хочу использовать GitHub?

Можете ли вы добавить полную трассировку стека?

spencergibb 15.03.2022 22:48

Была такая же проблема. Создание ключа ecdsa для ответа GBark ниже сработало для меня. Ни один из ключей RSA не работал, в том числе сгенерированные Eclipse.

gene b. 17.03.2022 03:17
4
2
1 043
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

У меня такая же проблема.

См. 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:

Получить ключ хоста

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

Добавьте сгенерированный открытый ключ в ключи развертывания вашего репозитория github.

Создайте или обновите свой сервер конфигурации с помощью ключа хоста, алгоритма ключа хоста и сгенерированного закрытого ключа.

cf create-service p-config-server standard <config-server-name> -c '{"git": { "uri": "[email protected]:<repo>.git", "privateKey": "<generated_key>", "hostKey": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg = ","hostKeyAlgorithm": "ecdsa-sha2-nistp256"} }'

Не по теме: это ECDSA, как вы генерируете ключ RSA? Если я попробую вашу команду с RSA, ssh-keygen -t rsa -b 256 -m PEM, он скажет Invalid RSA key length: minimum is 1024 bits

gene b. 16.03.2022 20:21

SCS, похоже, подписывает все ключи RSA с помощью SHA-1, по крайней мере, так кажется, поскольку все ключи RSA получают одну и ту же ошибку о подписи SHA-1. Однако, чтобы сгенерировать rsa, ssh-keygen -t rsa -b 4096 -m PEM

gbark 16.03.2022 21:41

Спасибо @gbark, это работает как шарм! И кажется, что ECDSA — лучший выбор, чем RSA, с точки зрения безопасности, а длина ключа намного короче!

blackr1234 16.03.2022 23:36

если вы ранее использовали ssh с локального хоста, то ключ RSA следует изменить на ecdsa команда: 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 отключил RSA SHA-1 15.03.2022.

Таким образом, даже если у вас может быть пара ключей RSA SHA-2 256/512, открытый ключ в GitHub, закрытый ключ с вашим сервером конфигурации, библиотека com.jcraft.jsch, по-видимому, понижается до того, что она знает, а затем связывается с GitHub с помощью sha-1 и имеет соединение отклонено.

Теперь к решению, которое работало в версиях, указанных выше. Существует форк com.jcraft.jsch, который реализует более новые версии RSA, которые принимает Github. В основном это сменная замена. Вот какие изменения я сделал:

pom.xml: отключить проблемную банку

        <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 только с помощью раскрывающегося модуля, мне также пришлось добавить класс конфигурации shim, чтобы исправить ситуацию:

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

}

Другие вопросы по теме