Fehlermeldung
ssh: handshake failed: knownhosts: key is unknown
Auch ausgegeben als
- ssh: handshake failed: knownhosts: key mismatch
- ssh: must specify HostKeyCallback
`*knownhosts.KeyError` hat ein Feld `Want`: leer bei „key is unknown“, nicht leer bei „key mismatch“. „ssh: must specify HostKeyCallback“ bedeutet, dass die `ClientConfig` überhaupt keine Prüfung des Host-Schlüssels hat.
golang.org/x/crypto/ssh/knownhosts (Go) — *knownhosts.KeyError from the HostKeyCallback
Was der Fehler bedeutet
Der Callback `knownhosts` hat in deiner known_hosts-Datei keinen Eintrag für diesen Host (und Port) gefunden und deshalb dem Schlüssel, den der Server präsentiert hat, nicht vertraut. Hier funktioniert die Host-Authentifizierung: Ohne bekannten Schlüssel kann der Client den echten Server nicht von einem falschen unterscheiden. „key mismatch“ ist der ernstere verwandte Fehler – der Host ist eingetragen, aber mit einem anderen Schlüssel.
Warum der Fehler auftritt
Der Host wurde nie hinzugefügt
häufigDas interaktive OpenSSH fragt „Are you sure you want to continue connecting?“ und speichert den Schlüssel. Go-Programme fragen nicht nach, deshalb scheitert hier ein Host, der nie hinzugefügt wurde – oder ein frischer Container mit leerer known_hosts-Datei.
Falsches Format von Hostname oder Port
häufigFür andere Ports als 22 werden Einträge als `[host]:port` geschrieben. Ein einfacher Eintrag `host` passt nicht zu einer Verbindung auf Port 2222, und eine IP-Adresse passt nicht zu einem Eintrag, der unter dem DNS-Namen gespeichert wurde.
Der Schlüssel des Servers hat sich geändert (key mismatch)
gelegentlichNeu installierte Server, wiederverwendete Cloud-IPs und Load Balancer vor mehreren Hosts präsentieren neue Schlüssel. Eine Abweichung kann auch bedeuten, dass die Verbindung abgefangen wird; sie muss deshalb durch Prüfen des neuen Fingerabdrucks gelöst werden, nicht durch Entfernen der Prüfung.
So behebst du den Fehler
- 1.
Host-Schlüssel erst nach der Prüfung hinzufügen
`ssh-keyscan` holt nur, was dir das Netzwerk liefert. Vergleiche den Fingerabdruck mit einer vertrauenswürdigen Quelle, bevor du ihn hinzufügst; übernimm geprüfte Einträge fest in Images oder ins Provisioning.
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.
Für eigene Ports die Form mit eckigen Klammern verwenden
knownhosts vergleicht Host und Port genau so wie OpenSSH. `knownhosts.Normalize` und `knownhosts.Line` erzeugen aus Go heraus korrekt formatierte Einträge.
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...