De mon côté, cela se produit en raison de ce que je considère comme un bogue ssh des clients plus récents (OpenSSH_7.9p1 et au-dessus), lorsqu'il essaie d'apprendre une clé de serveur ecdsa plus sûre alors qu'il existe déjà une clé de type rsa plus ancienne connue. Il présente alors ce message trompeur !
Je ne connais pas de bonne solution à ce problème, la seule solution que j'ai trouvée est de supprimer toutes les “bonnes mais anciennes clés rsa” de sorte que le client puisse réapprendre les “nouvelles clés ecdsa plus sûres”. Donc :
La première étape consiste à supprimer toutes les bonnes vieilles clés RSA ( Attention ! Cela perd la protection contre le MitM ) :
La deuxième étape consiste ensuite à réapprendre toutes les clés d'hôtes, ce qui doit être fait manuellement en se connectant à chaque IP à nouveau en utilisant ssh.
Voici ce que j'observe :
$ sftp test@136.243.197.100
Connected to test@136.243.197.100
sftp>
$ sftp test@valentin.hilbig.de
Connected to test@valentin.hilbig.de.
sftp>
Essayez maintenant de vous connecter à un alias nouvellement introduit de ce même bon serveur déjà connu :
$ sftp test@gcopy.net
Warning: the ECDSA host key for 'gcopy.net' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:44
Are you sure you want to continue connecting (yes/no)?
Veuillez regarder l'adresse IP. C'est la même adresse IP que ci-dessus ! Il semble donc que la (bonne) clé de l'IP (connue) s'offense soudainement (ce n'est pas le cas, car le client ssh mélange deux clés incompatibles, voir ci-dessous).
Maintenant, nous essayons de le réparer :
$ ssh-keygen -R 136.243.197.100
# Host 136.243.197.100 found: line 45
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Essayons à nouveau :
$ sftp test@gcopy.net
Warning: Permanently added the ECDSA host key for IP address '136.243.197.100' to the list of known hosts.
Connected to test@gcopy.net.
$ sftp test@valentin.hilbig.de
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
Are you sure you want to continue connecting (yes/no)?
WTF ? Que s'est-il passé ici ? La nouvelle clé fraîche apprise du serveur a encore échoué ? Et le problème a même changé de camp ?!?
Non, ce n'est pas la clé, ni le serveur. Tout est correct !
C'est le client ssh qui ne vérifie pas la bonne clé ! L'entrée 45 dans known_hosts porte maintenant une clé de type ecdsa-sha2-nistp256 alors que la clé, qui a été retirée du serveur par le client, est de type rsa-sha2-512 (et donc ne peut pas correspondre à l'autre clé !).
$ sftp -v test@valentin.hilbig.de
montre :
debug1: kex: host key algorithm: rsa-sha2-512
alors que
$ sftp -v test@gcopy.net
Apparemment le client ssh a un bug quelque part ! Il ne peut pas gérer une clé hôte existant dans plus d'une variante ! Ou alors il tombe dans le piège de demander une variante obsolète d'une clé.
Comment corriger ?
Je n'en ai vraiment aucune idée. Cela ne peut probablement être corrigé qu'en amont.
Mais il existe une solution de contournement manuelle mais maladroite :
Vous devez supprimer manuellement toutes les traces de l'ancienne clé de type rsa. La clé en question est affichée dans la sortie, mais elle n'est pas directement marquée comme étant le problème :
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
vérifier :
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
donne
awk 'NR==45 { print $2 }' /home/test/.ssh/known_hosts
awk 'NR==10 { print $2 }' /home/test/.ssh/known_hosts
Donc ici la clé hôte matching est la clé offensante et la clé offensante est la bonne qui doit être conservée ! Donc, retirons la mauvaise clé (correspondante) :
ecdsa-sha2-nistp256
ssh-rsa
Maintenant, vérifiez à nouveau :
ssh-keygen -R valentin.hilbig.de
# Host valentin.hilbig.de found: line 10
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
YAY ! Le problème a finalement disparu. Mais avec plusieurs centaines d'entrées dans .ssh/known_hosts, cette “solution” devient vraiment une PITA majeure (et un cauchemar de sécurité sujet aux erreurs sur Elm Street. YMMV.)