Nie można negocjować z XX.XXX.XX.XX: nie znaleziono zgodnego typu klucza hosta. Ich oferta: ssh-dss

110

Próbuję utworzyć repozytorium git na moim hoście internetowym i sklonować je na moim komputerze. Oto co zrobiłem:

  1. Utworzyłem repozytorium na zdalnym serwerze.
  2. I wygenerował parę kluczy: ssh-keygen -t dsa.
  3. Dodałem mój klucz do ssh-agent.
  4. Skopiowałem na serwer klucz publiczny w formacie ~/.ssh.

A potem po próbie uruchomienia polecenia wyskakuje git clone ssh://user@host/path-to-repositorymi błąd:

Nie można negocjować z XX.XXX.XX.XX: nie znaleziono zgodnego typu klucza hosta. Ich oferta: ssh-dss
fatal: Nie można odczytać ze zdalnego repozytorium.
Upewnij się, że masz odpowiednie prawa dostępu i repozytorium istnieje.

Co to znaczy?

Nikita Gorshkov
źródło

Odpowiedzi:

171

Najnowsza wersja openssh domyślnie wycofała klucze DSA. Powinieneś zasugerować swojemu dostawcy GIT dodanie rozsądnego klucza hosta. Poleganie wyłącznie na DSA nie jest dobrym pomysłem.

Aby obejść ten problem, musisz podać plik ssh klientowi, że chcesz akceptować klucze hosta DSA, zgodnie z opisem w oficjalnej dokumentacji użytkowania starszego typu . Masz kilka możliwości, ale radzę dodać te linie do swojego ~/.ssh/configpliku:

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Inną możliwością jest użycie zmiennej środowiskowej GIT_SSHdo określenia tych opcji:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository
Jakuje
źródło
1
Teraz działało bez określania nazwy hosta, po prostu z HostkeyAlgorithms +ssh-dss. Dzięki.
giovannipds,
1
@giovannipds Z pewnością musi to być zdalny host, z którym się łączysz. @ downvoters Wyjaśnienie głosów przeciwnych byłoby miłe.
Jakuje
@Jakuje przepraszam stary, źle kliknąłem, az powodu braku możliwości zmiany od razu nie mogłem zaktualizować odpowiedzi.
giovannipds
1
@Jakuje Zaktualizowałem już swój głos, żebyś wiedział. =)
giovannipds
Jeśli nie ma takiego pliku w Twoim katalogu .ssh, wystarczy pusty plik tekstowy o nazwie „config”.
RMorrisey
78

Możesz również dodać -oHostKeyAlgorithms=+ssh-dssw swoim wierszu ssh:

ssh -oHostKeyAlgorithms=+ssh-dss user@host
Guillaume
źródło
Jest to najszybsze rozwiązanie +1, ponieważ trwale rozwiązuje problem dla tego hosta. Kolejną sugestią na dłuższą metę jest to, że jeśli to możliwe, system hosta powinien mieć zaktualizowanego demona SSH, ponieważ wydaje się, że DSS nie jest już uważany za bardzo bezpieczny.
Areeb Soo Yasir
20

U mnie to zadziałało: (dodane do .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss
user2885534
źródło
Druga opcja nie jest związana z problemem, a pierwsza jest już wspomniana w mojej odpowiedzi.
Jakuje
Host your-host nie działał dla mnie, pod warunkiem, że twój-host to nazwa hosta, z którego uruchamiam polecenie ssh (klient). Ale Host * pracował dla mnie.
Krischu
2
@Krischu nie, yuor-hostto host, z którym walczysz ssh. Ustawienie niebezpiecznych ustawień domyślnych dla wszystkich hostów jest zawsze złym pomysłem.
Jakuje,
10

Jeśli jesteś podobny do mnie i wolisz nie tworzyć tego systemu luk w zabezpieczeniach lub całego użytkownika, możesz dodać opcję konfiguracji do dowolnego repozytorium git, które tego potrzebuje, uruchamiając to polecenie w tych repozytoriach. (uwaga działa tylko z wersją git> = 2.10, wydana 04.09.2016)

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

Działa to jednak tylko po skonfigurowaniu repozytorium. Jeśli nie czujesz się komfortowo, dodając pilota ręcznie (i po prostu chcesz sklonować), możesz uruchomić klon w następujący sposób:

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

następnie uruchom pierwsze polecenie, aby stało się trwałe.

Jeśli nie masz najnowszej wersji, a nadal chciałbyś, aby dziura była jak najbardziej lokalna, polecam wprowadzenie

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

powiedzmy w jakimś pliku git_ssh_allow_dsa_keys.shi sourcewstawiam go w razie potrzeby.

golvok
źródło
3

Chcę trochę współpracować z rozwiązaniem po stronie serwera. Tak więc serwer twierdzi, że nie obsługuje DSA, ponieważ klient openssh nie aktywuje go domyślnie :

OpenSSH 7.0 i nowsze podobnie wyłączają algorytm klucza publicznego ssh-dss (DSA). Jest również słaby i odradzamy jego stosowanie.

Aby to naprawić po stronie serwera, powinienem aktywować inne algorytmy klucza, takie jak RSA lub ECDSA. Właśnie miałem ten problem z serwerem w sieci LAN. Proponuję co następuje:

Zaktualizuj openssh:

yum update openssh-server

Scal nowe konfiguracje w sshd_config, jeśli istnieje sshd_config.rpmnew.

Sprawdź, czy w / etc / ssh / są klucze hostów. Jeśli nie, wygeneruj nowe, zobacz 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

Sprawdź w / etc / ssh / sshd_config konfigurację HostKey. Powinien umożliwiać konfigurację RSA i ECDSA. (Jeśli wszystkie z nich są domyślnie komentowane, pozwoli to również na RSA, zobacz w man sshd_configczęści 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

Po stronie klienta utwórz klucz dla ssh (nie DSA, jak w pytaniu), wykonując po prostu następujące czynności:

ssh-keygen

Po tym, ponieważ jest więcej opcji niż ssh-dss (DSA), klient openssh (> = v7) powinien łączyć się z algorytmem RSA lub lepszym.

Tutaj kolejny dobry artykuł.

To jest moje pierwsze pytanie, na które odpowiedziano, przyjmuję sugestie: D.

Gus Calca
źródło
1

Jak można określić wiele algorytmów? Pytam, ponieważ właśnie zaktualizowałem git na moim laptopie roboczym (Windows 10, używając oficjalnej kompilacji Git dla systemu Windows) i otrzymałem ten błąd, gdy próbowałem przekazać gałąź projektu do mojego pilota Azure DevOps. Próbowałem push --set-upstream i otrzymałem to:

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.

Jak więc wdrożyć powyższe sugestie, uwzględniając obie te możliwości? (Jako szybki sposób na zrobienie tego, użyłem rozwiązania @ golvok z group14 i zadziałało, ale naprawdę nie wiem, czy 1 czy 14 jest lepsze itd.)

Janet
źródło
-3

Możesz postępować zgodnie z powyższym podejściem lub tym

Utwórz plik konfiguracyjny w katalogu .ssh i dodaj te linie.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1
ashokhein
źródło
To jest rozwiązanie zupełnie innego problemu.
Jakuje