Mit welchem ​​Befehl kann ich den ECDSA-Schlüsselfingerabdruck meines Servers anzeigen?

75

Ich sehe überall in Google Informationen darüber, wie der Fingerabdruck des RSA-Schlüssels angezeigt wird, nicht jedoch der ECDSA-Fingerabdruck.

trusktr
quelle

Antworten:

122

Warten Sie, ich habe es gefunden. Führen Sie den folgenden Befehl aus:

ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
trusktr
quelle
4
Beachten Sie, dass dies berechnet wird, um den Hash des Fingerabdrucks im bevorzugten Format Ihres Server-Betriebssystems zu berechnen. Abhängig von Ihrem lokalen Betriebssystem müssen Sie möglicherweise das alte Hash-Format verwenden: ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub Dies wird beispielsweise benötigt, wenn Sie eine Verbindung von Ubuntu 12.04 zu Ubuntu 16.04
Jeff
Dies funktioniert auch unter Mac OS (nützlich, um die Authentizität bei der Remote-Anmeldung zu überprüfen).
Jorge Leitao
15

Mit einem aktuellen ssh (OpenSSH_6.0p1, OpenSSL 1.0.0j, 10. Mai 2012) habe ich es wie folgt geschrieben:

ssh-keyscan -t ecdsa localhost 2>&1 | grep ecdsa
localhost ecdsa-sha2-nistp256 AAAAE2VlongKey...=

Anmerkungen:

  • Wenn Ihr SSHD auf einem benutzerdefinierten Port ausgeführt wird, fügen Sie -p portNumberdem ssh-keyscanBefehl ' ' hinzu. )
  • ssh-keyscanschreibt weiter stderr, nicht stdout(!), daher die bashUmleitung ' 2>&1' (die je nach Shell variieren kann)

Dies ist die Zeile, die ich meiner ~/.ssh/known_hostsDatei hinzugefügt habe, um SSH- Anfragen von localhost für meine Tests zu autorisieren (hauptsächlich für Gitolite, das SSH verwendet ).


Daniel Böhmer bestätigt in den Kommentaren :

  • ssh-keyscan stellt die vollständigen öffentlichen Schlüssel des SSH-Servers bereit
  • Die Ausgabe von ssh-keygenist nahezu identisch mit dem Format der öffentlichen Schlüsseldateien.
    Entfernen Sie einfach die erste Spalte (IP-Adresse oder Hostname) und speichern Sie diese oder leiten Sie sie an ssh-keygen -lden Fingerabdruck weiter.

Daniel fügt hinzu:

Fingerabdrücke aller öffentlichen Serverschlüssel anzeigen in ~/.ssh/know_hosts:

cut -d' ' -f2- ~/.ssh/known_hosts | while read line; do echo "$line" | ssh-keygen -lf-; done
VonC
quelle
1
Die Frage betrifft den Fingerabdruck des Schlüssels. ssh-keyscan stellt nur den (öffentlichen) Schlüssel bereit.
Aleb
1
Stellt in ssh-keyscander Tat die vollständigen öffentlichen Schlüssel des SSH-Servers bereit. Ich habe einen Speicherauszug der Ausgabe und möchte diesen nun mit dem Fingerabdruck vergleichen, der sshwährend der ersten Verbindung angezeigt wird . Wie geht das?
Daniel Böhmer
Ich habe gerade herausgefunden: Die Ausgabe von ssh-keygenist fast identisch mit dem Format der öffentlichen Schlüsseldateien. Entfernen Sie einfach die erste Spalte (IP-Adresse oder Hostname) und speichern Sie diese oder leiten Sie sie an ssh-keygen -lden Fingerabdruck weiter. Ich möchte immer noch wissen, wie sshder vollständige öffentliche Schlüssel des Servers angezeigt wird, wenn ich um Bestätigung gebeten werde.
Daniel Böhmer
@ DanielBöhmer Vielen Dank für Ihr Feedback. Ich habe es in die Antwort für mehr Sichtbarkeit aufgenommen.
VonC
Zeigen Sie Fingerabdrücke aller öffentlichen Serverschlüssel an, die gespeichert sind in ~/.ssh/know_hosts:cut -d' ' -f2- ~/.ssh/known_hosts | while read line; do echo "$line" | ssh-keygen -lf-; done
Daniel Böhmer
8

Auf meinem System muss ich anstelle des Standard-SHA256 einen MD5-Schlüssel angeben:

ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub

Dies gab eine Zeichenfolge in einem Format aus, das dem Fehler entsprach, den ich auf dem Client sah.

David Elrod
quelle
1
Das -EFlag wurde in OpenSSH> 6.6 eingeführt, ungefähr zu der Zeit, als standardmäßig auf SHA256-Fingerabdruck umgeschaltet wurde. In den Fällen, in denen der Client SHA256-Fingerabdrücke anzeigt, kann dieses Format nicht auf dem Server ausgegeben werden. Ein Weg , um diese: superuser.com/a/1030779
tanius
3

Verwendete Befehle

  • Zeigen Sie ASCII-Art des auf dem Server gespeicherten öffentlichen Hostschlüssels an (auf der Serverseite, die Sie über ssh verbinden):

    ssh-keygen -l -v -f /etc/ssh/ssh_host_ecdsa_key.pub
    

    -l : Fingerabdruck der angegebenen öffentlichen Schlüsseldatei anzeigen.

    -v : visuell (ASCII-Kunst)

    -f : Datei

  • Anzeige der ASCII-Art des öffentlichen Hostschlüssels des Remoteservers (auf der Clientseite, die Sie über ssh verbinden):

    ssh -o visualhostkey=yes -o FingerprintHash=md5 <host_server_to_connect>
    

    : Option

    VisualHostkey : Visual (ASCII-Kunst)

    FingerprintHash : Hash Algo zu verwenden

Was tun, um die Authentizität eines Hosts / Servers zu überprüfen?

Erstens muss 1. lokal auf dem Server ausgeführt werden (derjenige, mit dem Sie über ssh eine Verbindung herstellen möchten): Sie erhalten eine erste ASCII-Grafik. Drucken Sie es aus oder machen Sie ein Foto.

Zweitens ist 2. bei der ersten SSH-Verbindung durchzuführen; es wird eine zweite ASCII-Kunst angezeigt. Wenn die ASCII-Kunst dieselbe ist, können Sie das "Vertraue ich?" Mit Ja beantworten. Frage (dhAre you sure you want to continue connecting (yes/no) ).

Beispiel

  • Serverseite
$ ssh-keygen -l -v -f /etc/ssh/ssh_host_ecdsa_key.pub
256 2e:a6:b3:27:14:12:0b:79:df:9a:7f:bd:4d:b1:e0:b6   (ECDSA)
+--[ECDSA  256]---+
| .               |
|o o              |
| o + .           |
|  o o .          |
|   . +  S . .    |
|    +  . . . o   |
|   . .o ..o o    |
|    ooo....+     |
|    o= .  E..    |
+-----------------+
  • Client-Seite
$ ssh -o visualhostkey=yes -o FingerprintHash=md5 192.168.12.211
The authenticity of host '192.168.12.211 (192.168.12.211)' can't be established.
ECDSA key fingerprint is MD5:2e:a6:b3:27:14:12:0b:79:df:9a:7f:bd:4d:b1:e0:b6.
+---[ECDSA 256]---+
| .               |
|o o              |
| o + .           |
|  o o .          |
|   . +  S . .    |
|    +  . . . o   |
|   . .o ..o o    |
|    ooo....+     |
|    o= .  E..    |
+------[MD5]------+
Are you sure you want to continue connecting (yes/no)? 

Noch eine Erklärung

Der erste Befehl zeigt die ASCII-Grafik an, die dem Fingerabdruck der Datei entspricht, die Sie als Eingabe angeben. Die Datei, die Sie als Eingabe angeben, ist öffentlich Hostschlüssel des Servers. Wenn ein Client eine Verbindung herstellt (nicht nur zum ersten Mal), sendet der Server seinen öffentlichen Hostschlüssel. Dieser öffentliche Hostschlüssel wird in gesucht~/.ssh/known_hosts. Wenn sich der öffentliche Schlüssel in der Datei befindet, ist dies in Ordnung: Der Host (Server) ist bekannt, und wir fahren mit dem nächsten Schritt fort, um den Benutzer zu authentifizieren (die Benutzerauthentifizierung wird in diesem Beitrag nicht beschrieben). Wenn der öffentliche Schlüssel nicht in der Datei enthalten ist, berechnet der Client den Fingerabdruck dieses öffentlichen Hostschlüssels mit einem Hash-Algorithmus (ein anderer Hash-Algorithmus gibt einen anderen Fingerabdruck). Dieser zuvor berechnete Fingerabdruck wird angezeigt (zusammen mit der ASCII-Grafik, falls die entsprechende Option angegeben ist) und Sie müssen mit Ja oder Nein antworten, je nachdem, ob Sie diesen Fingerabdruck oder Nein erkennen (dieser Fingerabdruck ist das Bild / der Hash des öffentlichen Host-Schlüssels des Server). Wenn Sie "Ja" sagen, wird der öffentliche Schlüssel des Servers (nicht sein Fingerabdruck) zur Datei hinzugefügt ~/.ssh/known_hosts.

Wir können feststellen, dass ~/.ssh/known_hostssich das unter Ihrem Home-Verzeichnis (~) befindet, da Sie diesem Host (Server) vertrauen, ein anderer Benutzer jedoch möglicherweise nicht dem gleichen wie Ihnen vertraut. Außerdem ist der öffentliche Hostschlüssel des Servers nicht benutzerabhängig, sodass er in gespeichert wird /etc/ssh/.

Der zweite Befehl zeigt den Fingerabdruck und die ASCII- Grafik des öffentlichen Schlüssels an, der vom host_server_to_connect empfangen wurde (gemäß dem in den Optionen angegebenen Hash-Algo). Es ist dasselbe wie nur ssh, jedoch mit mehr visuellen Optionen, sodass die Verbindung auf die gleiche Weise wie bei einer normalen ssh-Verbindung fortgesetzt wird.

Nicolas VERHELST
quelle