Это касается 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-сервер | (Удалось) |
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?
Была такая же проблема. Создание ключа ecdsa
для ответа GBark ниже сработало для меня. Ни один из ключей RSA не работал, в том числе сгенерированные Eclipse.
У меня такая же проблема.
См. 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
SCS, похоже, подписывает все ключи RSA с помощью SHA-1, по крайней мере, так кажется, поскольку все ключи RSA получают одну и ту же ошибку о подписи SHA-1. Однако, чтобы сгенерировать rsa, ssh-keygen -t rsa -b 4096 -m PEM
Спасибо @gbark, это работает как шарм! И кажется, что ECDSA — лучший выбор, чем RSA, с точки зрения безопасности, а длина ключа намного короче!
если вы ранее использовали 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. В основном это сменная замена. Вот какие изменения я сделал:
<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");
}
}
Можете ли вы добавить полную трассировку стека?