Message d’erreur
ssh: handshake failed: knownhosts: key is unknown
Également affiché sous la forme
- ssh: handshake failed: knownhosts: key mismatch
- ssh: must specify HostKeyCallback
`*knownhosts.KeyError` possède un champ `Want` : vide pour « key is unknown », non vide pour « key mismatch ». Le message « ssh: must specify HostKeyCallback » signifie que le `ClientConfig` ne prévoit aucune vérification de la clé d’hôte.
golang.org/x/crypto/ssh/knownhosts (Go) — *knownhosts.KeyError from the HostKeyCallback
Ce que cela signifie
La fonction de rappel `knownhosts` n’a trouvé aucune entrée pour cet hôte (et ce port) dans votre fichier known_hosts : elle a donc refusé de faire confiance à la clé présentée par le serveur. C’est l’authentification de l’hôte qui fonctionne comme prévu : sans clé connue, le client ne peut pas distinguer le vrai serveur d’un imposteur. L’erreur « key mismatch » est le cas voisin, plus grave : l’hôte figure dans le fichier, mais avec une clé différente.
Pourquoi cela se produit
L’hôte n’a jamais été ajouté
fréquenteEn mode interactif, OpenSSH demande « Are you sure you want to continue connecting? » et enregistre la clé. Les programmes Go ne posent pas de question : un hôte jamais ajouté (ou un conteneur neuf dont le known_hosts est vide) échoue donc ici.
Mauvais format de nom d’hôte ou de port
fréquentePour les ports autres que 22, les entrées s’écrivent sous la forme `[host]:port`. Une simple entrée `host` ne correspond pas à une connexion au port 2222, et une adresse IP ne correspond pas à une entrée enregistrée sous le nom DNS.
La clé du serveur a changé (key mismatch)
occasionnelleLes serveurs réinstallés, les adresses IP cloud réattribuées et les répartiteurs de charge placés devant plusieurs hôtes présentent de nouvelles clés. Une clé différente peut aussi signaler une interception : le problème doit donc être résolu en vérifiant la nouvelle empreinte, et non en supprimant la vérification.
Comment corriger l’erreur
- 1.
Ajouter la clé d’hôte après l’avoir vérifiée
`ssh-keyscan` se contente de récupérer ce que le réseau vous fournit. Comparez l’empreinte avec une source de confiance avant de l’ajouter ; intégrez les entrées vérifiées dans les images ou dans le provisionnement.
bash # Fetch the host key, then compare its fingerprint with one obtained out of band # (cloud console, provisioning output, the server's /etc/ssh/*.pub). ssh-keyscan -t ed25519 -p 22 server.example.com > /tmp/hostkey ssh-keygen -lf /tmp/hostkey cat /tmp/hostkey >> ~/.ssh/known_hosts # only after the fingerprints match - 2.
Utiliser la forme entre crochets pour les ports personnalisés
knownhosts compare l’hôte et le port exactement comme le fait OpenSSH. `knownhosts.Normalize` et `knownhosts.Line` produisent depuis Go des entrées correctement formatées.
text # known_hosts entry for a non-default port: brackets and the port are part of the name [server.example.com]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...