Невозможно согласовать с XX.XXX.XX.XX: соответствующий тип ключа хоста не найден. Их предложение: ssh-dss


110

Я пытаюсь создать репозиторий git на своем веб-хосте и клонировать его на своем компьютере. Вот что я сделал:

  1. Я создал репозиторий на удаленном сервере.
  2. Я создал пару ключей: ssh-keygen -t dsa.
  3. Я добавил свой ключ в ssh-agent.
  4. Я скопировал на сервер публичный ключ в ~/.ssh.

А потом после попытки запустить команду git clone ssh://user@host/path-to-repositoryвыдает ошибку:

Невозможно согласовать с XX.XXX.XX.XX: соответствующий тип ключа хоста не найден. Их предложение: ssh-dss
fatal: не удалось прочитать из удаленного репозитория.
Убедитесь, что у вас есть правильные права доступа и репозиторий существует.

Что это значит?


Ответы:


171

В последней версии openssh по умолчанию не рекомендуется использовать ключи DSA. Вы должны предложить своему провайдеру GIT добавить какой-нибудь разумный ключ хоста. Полагаться только на DSA - не лучшая идея.

В качестве обходного пути вам необходимо сообщить своему sshклиенту, что вы хотите принять ключи хоста DSA, как описано в официальной документации для устаревшего использования . У вас есть несколько возможностей, но я рекомендую добавить эти строки в ваш ~/.ssh/configфайл:

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Другая возможность - использовать переменную среды GIT_SSHдля указания этих параметров:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository

1
Теперь он работал без указания имени хоста, просто с HostkeyAlgorithms +ssh-dss. Спасибо.
giovannipds

1
@giovannipds Это обязательно должен быть удаленный хост, к которому вы подключаетесь. @ downvoters Было бы неплохо объяснить отрицательные голоса.
Jakuje

@Jakuje, извини, я ошибся, и из-за невозможности изменить сразу я не смог обновить свой ответ.
giovannipds

1
@Jakuje Я уже обновил свой голос, просто чтобы вы знали. =)
giovannipds

Если в вашем каталоге .ssh нет такого файла, подойдет пустой текстовый файл с именем «config».
RMorrisey

78

Вы также можете добавить -oHostKeyAlgorithms=+ssh-dssв свою строку ssh:

ssh -oHostKeyAlgorithms=+ssh-dss user@host

Это самое быстрое решение +1, потому что оно также навсегда устраняет проблему для этого хоста. Еще одно предложение на долгосрочную перспективу состоит в том, что, если возможно, хост-система должна обновить свой демон SSH, поскольку кажется, что DSS больше не считается очень безопасным.
Ариб Су Ясир

20

Для меня это сработало: (добавлено в .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss

Второй вариант не имеет отношения к проблеме, а о первом уже упоминалось в моем ответе.
Jakuje

Host your-host у меня не работал, при условии, что your-host - это имя хоста, с которого я запускаю команду ssh (клиент). Но Host * работал у меня.
Krischu

2
@Krischu нет, yuor-hostэто хост, sshпротив которого вы работаете . Установка небезопасного по умолчанию для всех хостов - всегда плохая идея.
Jakuje

10

Если вы похожи на меня и предпочли бы не делать эту дыру в безопасности системной или общедоступной, то вы можете добавить параметр конфигурации в любые репозитории git, которые в этом нуждаются, запустив эту команду в этих репозиториях. (примечание работает только с версией git> = 2.10, выпущенной 04.09.2016)

git config core.sshCommand 'ssh -oHostKeyAlgorithms=+ssh-dss'

Однако это работает только после настройки репо. Если вам неудобно добавлять пульт вручную (и вы просто хотите клонировать), вы можете запустить клон следующим образом:

GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss' git clone ssh://user@host/path-to-repository

затем запустите первую команду, чтобы сделать ее постоянной.

Если у вас нет последней версии, но вы все же хотите, чтобы отверстие было как можно более локальным, я рекомендую поставить

export GIT_SSH_COMMAND='ssh -oHostKeyAlgorithms=+ssh-dss'

в файле где-нибудь, скажем git_ssh_allow_dsa_keys.sh, и sourceпри необходимости.


3

Хочу немного поработать с решением для серверной части. Итак, сервер сообщает, что не поддерживает DSA, потому что клиент openssh не активирует его по умолчанию :

OpenSSH 7.0 и выше аналогичным образом отключает алгоритм открытого ключа ssh-dss (DSA). Он тоже слаб, и мы не рекомендуем его использовать.

Итак, чтобы исправить это на стороне сервера, я должен активировать другие ключевые алгоритмы, такие как RSA или ECDSA. У меня просто была такая проблема с сервером в локальной сети. Предлагаю следующее:

Обновите openssh:

yum update openssh-server

Объедините новые конфигурации в sshd_config, если есть sshd_config.rpmnew.

Убедитесь, что в / etc / ssh / есть ключи хостов. Если не генерировать новые, см man ssh-keygen.

$ ll /etc/ssh/
total 580
-rw-r--r--. 1 root root     553185 Mar  3  2017 moduli
-rw-r--r--. 1 root root       1874 Mar  3  2017 ssh_config
drwxr-xr-x. 2 root root       4096 Apr 17 17:56 ssh_config.d
-rw-------. 1 root root       3887 Mar  3  2017 sshd_config
-rw-r-----. 1 root ssh_keys    227 Aug 30 15:33 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162 Aug 30 15:33 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387 Aug 30 15:33 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82 Aug 30 15:33 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1675 Aug 30 15:33 ssh_host_rsa_key
-rw-r--r--. 1 root root        382 Aug 30 15:33 ssh_host_rsa_key.pub

Проверьте в / etc / ssh / sshd_config конфигурацию HostKey. Это должно позволить настройку RSA и ECDSA. (Если все они закомментированы по умолчанию, это также разрешит RSA, см. В man sshd_configчасти HostKey).

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

Для клиентской стороны создайте ключ для ssh (не DSA, как в вопросе), просто выполнив следующие действия:

ssh-keygen

После этого, поскольку существует больше вариантов, чем ssh-dss (DSA), клиент openssh (> = v7) должен подключаться с помощью RSA или лучшего алгоритма.

Вот еще одна хорошая статья.

Это мой первый ответ на вопрос, я приветствую предложения: D.


1

Как указать несколько алгоритмов? Я спрашиваю, потому что git только что обновился на моем рабочем ноутбуке (Windows 10, с использованием официальной сборки Git для Windows), и я получил эту ошибку, когда попытался отправить ветку проекта на свой пульт Azure DevOps. Я попытался нажать --set-upstream и получил следующее:

Unable to negotiate with 20.44.80.98 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Итак, как бы реализовать приведенные выше предложения с учетом обоих? (В качестве быстрого решения я использовал решение @golvok с group14, и оно сработало, но я действительно не знаю, лучше ли 1 или 14 и т. Д.)


-3

Вы либо следуете вышеуказанному подходу, либо этому

Создайте файл конфигурации в каталоге .ssh и добавьте эти строки.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1

Это решает совершенно другую проблему.
Jakuje
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.