Impossible de négocier avec XX.XXX.XX.XX: aucun type de clé d'hôte correspondant n'a été trouvé. Leur offre: ssh-dss

110

J'essaie de créer un référentiel git sur mon hôte Web et de le cloner sur mon ordinateur. Voici ce que j'ai fait:

  1. J'ai créé un référentiel sur le serveur distant.
  2. Je généré une paire de clés: ssh-keygen -t dsa.
  3. J'ai ajouté ma clé à ssh-agent.
  4. J'ai copié sur la clé publique du serveur dans ~/.ssh.

Et puis, après une tentative d'exécuter la commande git clone ssh://user@host/path-to-repository, j'obtiens une erreur:

Impossible de négocier avec XX.XXX.XX.XX: aucun type de clé d'hôte correspondant n'a été trouvé. Leur offre: ssh-dss
fatal: impossible de lire à partir du référentiel distant.
Veuillez vous assurer que vous disposez des droits d'accès appropriés et que le référentiel existe.

Qu'est-ce que ça veut dire?

Nikita Gorshkov
la source

Réponses:

171

Les clés DSA obsolètes par défaut dans la version récente d'OpenSh Vous devriez suggérer à votre fournisseur GIT d'ajouter une clé d'hôte raisonnable. Se fier uniquement à DSA n'est pas une bonne idée.

Pour contourner ce problème, vous devez indiquer à votre sshclient que vous souhaitez accepter les clés d'hôte DSA, comme décrit dans la documentation officielle pour l'utilisation héritée . Vous avez peu de possibilités, mais je recommande d'ajouter ces lignes dans votre ~/.ssh/configfichier:

Host your-remote-host
    HostkeyAlgorithms +ssh-dss

Une autre possibilité est d'utiliser la variable d'environnement GIT_SSHpour spécifier ces options:

GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone ssh://user@host/path-to-repository
Jakuje
la source
1
Maintenant, cela a fonctionné sans spécifier le nom d'hôte, juste avec HostkeyAlgorithms +ssh-dss. Merci.
giovannipds
1
@giovannipds Il doit certainement s'agir de l'hôte distant auquel vous vous connectez. @ downvoters Expliquer les votes négatifs serait bien.
Jakuje
@Jakuje désolé mec, j'ai mal cliqué, et à cause de l'impossibilité de changer tout de suite, je n'ai pas pu mettre à jour ma réponse.
giovannipds
1
@Jakuje J'ai déjà mis à jour mon vote, juste pour vous le faire savoir. =)
giovannipds
S'il n'y a pas de tel fichier dans votre répertoire .ssh, un fichier texte vide nommé "config" fera l'affaire.
RMorrisey
78

Vous pouvez également ajouter -oHostKeyAlgorithms=+ssh-dssdans votre ligne ssh:

ssh -oHostKeyAlgorithms=+ssh-dss user@host
Guillaume
la source
C'est la solution la plus rapide +1 car elle résout également définitivement le problème pour cet hôte. Une autre suggestion pour le long terme est que si possible, le système hôte devrait avoir son démon SSH mis à jour car il semble que DSS ne soit plus considéré comme très sécurisé.
Areeb Soo Yasir le
20

Pour moi, cela a fonctionné: (ajouté dans .ssh\config)

Host *
HostkeyAlgorithms +ssh-dss
PubkeyAcceptedKeyTypes +ssh-dss
user2885534
la source
La deuxième option n'est pas liée au problème et la première est déjà mentionnée dans ma réponse.
Jakuje
Host your-host ne fonctionnait pas pour moi, à condition que votre hôte soit le nom de l'hôte à partir duquel j'exécute la commande ssh (client). Mais Host * a travaillé pour moi.
Krischu
2
@Krischu non, yuor-hostc'est l'hôte sshcontre lequel vous exécutez . Définir une valeur par défaut non sûre pour tous les hôtes est toujours une mauvaise idée.
Jakuje
10

Si vous êtes comme moi et que vous préférez ne pas créer ce système de failles de sécurité ou à l'échelle de l'utilisateur, vous pouvez ajouter une option de configuration à tous les dépôts git qui en ont besoin en exécutant cette commande dans ces dépôts. (note ne fonctionne qu'avec la version git> = 2.10, publiée le 04/09/2016)

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

Cependant, cela ne fonctionne qu'une fois le dépôt configuré. Si vous n'êtes pas à l'aise d'ajouter manuellement une télécommande (et que vous voulez simplement cloner), vous pouvez exécuter le clone comme ceci:

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

puis exécutez la première commande pour le rendre permanent.

Si vous n'avez pas la dernière version et que vous souhaitez toujours garder le trou aussi local que possible, je vous recommande de mettre

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

dans un fichier quelque part, par exemple git_ssh_allow_dsa_keys.sh, et sourcesi nécessaire.

Golvok
la source
3

Je souhaite collaborer un peu avec la solution côté serveur. Donc, le serveur dit qu'il ne prend pas en charge DSA, c'est parce que le client openssh ne l'active pas par défaut :

OpenSSH 7.0 et supérieur désactivent de manière similaire l'algorithme de clé publique ssh-dss (DSA). Il est également faible et nous déconseillons son utilisation.

Donc, pour résoudre ce problème du côté serveur, je devrais activer d'autres algorithmes clés tels que RSA ou ECDSA. Je viens d'avoir ce problème avec un serveur dans un réseau local. Je suggère ce qui suit:

Mettez à jour l'openssh:

yum update openssh-server

Fusionner les nouvelles configurations dans sshd_config s'il existe un sshd_config.rpmnew.

Vérifiez qu'il existe des clés d'hôtes dans / etc / ssh /. Sinon, en générer de nouveaux, voir 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

Vérifiez dans le fichier / etc / ssh / sshd_config la configuration HostKey. Il doit permettre la configuration de RSA et ECDSA. (Si tous sont commentés par défaut cela autorisera aussi le RSA, voir dans man sshd_configla partie 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

Pour le côté client, créez une clé pour ssh (pas un DSA comme dans la question) en faisant simplement ceci:

ssh-keygen

Après cela, comme il y a plus d'options que ssh-dss (DSA), le client openssh (> = v7) doit se connecter avec RSA ou un algorithme supérieur.

Voici un autre bon article.

C'est ma première question répondue, je salue les suggestions: D.

Gus Calca
la source
1

Comment spécifier plusieurs algorithmes? Je demande parce que git vient de se mettre à jour sur mon ordinateur portable de travail (Windows 10, en utilisant la version officielle de Git pour Windows) et j'ai eu cette erreur lorsque j'ai essayé de pousser une branche de projet sur ma télécommande Azure DevOps. J'ai essayé de pousser --set-upstream et j'ai obtenu ceci:

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.

Alors, comment mettre en œuvre les suggestions ci-dessus en tenant compte des deux? (Pour faire vite, j'ai utilisé la solution de @ golvok avec group14 et cela a fonctionné, mais je ne sais vraiment pas si 1 ou 14 est meilleur, etc.)

Janet
la source
-3

Vous suivez l'approche ci-dessus ou celle-ci

Créez le fichier de configuration dans le répertoire .ssh et ajoutez ces lignes.

host xxx.xxx
 Hostname xxx.xxx
 IdentityFile ~/.ssh/id_rsa
 User xxx
 KexAlgorithms +diffie-hellman-group1-sha1
Ashokhein
la source
Cela résout un problème complètement différent.
Jakuje