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.)