Was ist ein SSH-Schlüsselfingerabdruck und wie wird er generiert?

128

Ich finde immer, dass ich diese Nachricht bekomme, wenn ich sshin eine neue Maschine einsteige :

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

Für was steht das? Hat jedes Gerät jedes Mal den gleichen Fingerabdruck?

Wie werden diese Fingerabdrücke erzeugt? Von welchen Parametern hängen sie ab?

Kit Ho
quelle

Antworten:

65

Der Fingerabdruck basiert auf dem öffentlichen Schlüssel des Hosts, normalerweise auf "/etc/ssh/ssh_host_rsa_key.pub". Im Allgemeinen dient dies zur einfachen Identifizierung / Überprüfung des Hosts, zu dem Sie eine Verbindung herstellen.

Wenn sich der Fingerabdruck ändert, hat der Computer, zu dem Sie eine Verbindung herstellen, seinen öffentlichen Schlüssel geändert. Dies ist möglicherweise keine schlechte Sache (wenn Sie ssh neu installieren), kann jedoch auch darauf hinweisen, dass Sie eine Verbindung zu einem anderen Computer mit derselben Domäne / IP herstellen (wenn Sie eine Verbindung über einen Load Balancer herstellen) oder dass Sie dies tun werden mit einem Man-in-the-Middle-Angriff angegriffen, bei dem der Angreifer irgendwie Ihre SSH-Verbindung abfängt / umleitet, um eine Verbindung zu einem anderen Host herzustellen, der Ihren Benutzer / pw beschnüffeln könnte.

Fazit: Wenn Sie vor einem geänderten Fingerabdruck gewarnt werden, sollten Sie vorsichtig sein und überprüfen, ob Sie tatsächlich über eine sichere Verbindung eine Verbindung zum richtigen Host herstellen. Obwohl dies die meiste Zeit harmlos ist, kann es ein Hinweis auf ein potenzielles Problem sein

Siehe: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
und: http://en.wikipedia.org/ wiki / Public_key_fingerprint

Madmaze
quelle
5
"... seien Sie vorsichtig und überprüfen Sie, ob Sie tatsächlich über eine sichere Verbindung eine Verbindung zum richtigen Host herstellen" - eine dumme Frage, aber wie können Sie das einfach tun?
Savara,
1
@Savara Wenn Sie eine Verbindung zu einem SSH-Server herstellen, den Sie zuvor noch nicht hergestellt haben, sollten Sie den öffentlichen Schlüssel des SSH-Servers vom Serveradministrator anfordern. Der Serveradministrator gibt Ihnen einen Text. Sie sollten diesen Text an die Datei anhängen ~/.ssh/known_hosts. Auf diese Weise erkennt Ihr SSH-Client diesen Server, wenn Sie eine Verbindung zum Server herstellen, da Sie seinen öffentlichen Schlüssel unter gespeichert haben known_hosts. Daher sollten Sie eigentlich niemals "Ja" sagen, wenn der SSH-Client Ihnen mitteilt, dass die Authentizität des Hosts nicht festgestellt werden kann. Sie sollten immer vorher den öffentlichen Schlüssel des Servers hinzufügen.
Utku
@Savara Wenn Sie dies tun, werden Sie wissen, dass etwas faul ist, wenn Ihr SSH-Client Ihnen mitteilt, dass die Authentizität des Clients nicht festgestellt werden kann, oder wenn er Ihnen mitteilt, dass der öffentliche Schlüssel des Servers geändert wurde. Daher sollten Sie den öffentlichen Schlüssel des Servers immer ~/.ssh/known_hostsvorher zu Ihrer Datei hinzufügen und niemals Ja sagen, wenn Ihr SSH-Client Ihnen mitteilt, dass die Authentizität des Clients nicht festgestellt werden kann, oder wenn er Ihnen mitteilt, dass der öffentliche Schlüssel des Servers vorhanden ist geändert".
Utku
3
Ja, ich weiß genau, wie die Mechanismen zum Anzeigen von SSH-Fingerabdrücken funktionieren, aber in einem großen Teil der Zeit haben Sie nicht die Möglichkeit, den Fingerabdruck über einen anderen Kanal abzurufen. TOFU ist leider das Beste, was wir oft bekommen.
Savara
Gibt es eine Möglichkeit, die Echtheit zu überprüfen, auch wenn Sie mit "Ja" geantwortet haben?
Austausch
104

Sie können einen Fingerabdruck für einen öffentlichen Schlüssel folgendermaßen generieren ssh-keygen:

ssh-keygen -lf /path/to/key.pub

Konkretes Beispiel (wenn Sie einen öffentlichen RSA-Schlüssel verwenden):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

Der erste Teil (2048)ist die Schlüssellänge in Bits, der zweite Teil (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)ist der Fingerabdruck des öffentlichen Schlüssels und der dritte Teil ist der Speicherort der öffentlichen Schlüsseldatei selbst.

Benjamin Oakes
quelle
Weißt du, wie man dieses Format von diesem öffentlichen Schlüssel in 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 übersetzt?
Kit Ho
@KitHo Ich bin mir nicht sicher, ob ich deine Frage verstehe. Ich habe das Beispiel aktualisiert, da ich denke, ssh-keygen -lfdass Sie tun werden, was Sie wollen.
Benjamin Oakes
5
Beim SSH-Vorgang auf einem neuen Computer wird nicht der Pubkey-Fingerabdruck eines Benutzers, sondern der Pubkey-Fingerabdruck des Hosts angezeigt. Ein besseres Beispiel für den Kontext der Frage ist ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Es zeigt den Fingerabdruck, der auch bei SSH-Anmeldungen bei localhost angezeigt wird.
Tanius
57
Meine ssh-keygengemeldeten sha256Fingerabdrücke. Um md5Fingerabdrücke zu bekommen, rannte ich los ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C
5
(@JustinC) OpenSSH-Versionen 6.8 (März 2015) und höher wurden in SHA256 geändert und werden standardmäßig in base64 statt hex angezeigt. Für den Kunden zu verwenden ssh -o FingerprintHash=md5oder das Äquivalent in ssh_configund auf Dinge, die sshwie verwenden scp.
Dave_thompson_085
72

Der Fingerabdruck ist der MD5 über den Binärdaten im Base64-codierten öffentlichen Schlüssel.

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

Bei der md5sum 6530389635564f6464e8e3a47d593e19 handelt es sich um den Fingerabdruck, der beim Generieren des Schlüssels nur ohne die Trennzeichen angezeigt wird.


Wenn Sie sich jedoch mit den Fingerabdrücken befassen, die Amazon in der EC2-Schlüsselpaarkonsole anzeigt , ist dies möglicherweise ein anderes Biest . Wenn es sich um eine 32-stellige Hex-Zeichenfolge handelt, handelt es sich um den oben angegebenen Standard-Fingerabdruck des öffentlichen MD5-SSH-Schlüssels. Wenn es sich jedoch um 40 Hexadezimalstellen handelt, handelt es sich tatsächlich um einen Fingerabdruck, der berechnet wird, indem der SHA1 des privaten Schlüssels im PKCS # 8-Format verwendet wird:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
andrew.n
quelle
1
Ich fand diese Antwort im folgenden Szenario hilfreich. Ihr System berechnet den Fingerabdruck mit SHA1, der Ihres Freundes mit md5. Ich teilte einen Fingerabdruck mit, der SHA1 lautete und nicht mit dem von ihrem System generierten MD5 übereinstimmte. Das hat geholfen - danke! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa
Dies ist sehr wichtig, um zu verstehen, warum dieser Fingerabdruck nicht mit dem in DNS-SSHFP-Einträgen übereinstimmt, da sie SHA-1- oder SHA-256-Digests verwenden.
Neirbowj
1
@Liczyrzepa Das Feld publickey kann je nach Schlüsseltyp und Bitgröße "==" am Ende haben oder auch nicht. sicherer und IMO einfacher zu bedienen awk '{print $2}' /path/to/keyfile.puboder ähnlich.
Dave_thompson_085
13
Dies ist die einzige Antwort, die erklärt, wie der Fingerabdruck berechnet wird
greuze
2
In Linux Mint lautet der Befehl jedoch:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Wenn Sie eine SSH-Schlüsseldatei überprüfen möchten, um festzustellen, ob sie mit der Datei identisch ist, die von github als "Bereitstellungsschlüssel" gemeldet wird, ist dies das Richtige für Sie ...

Von der privaten URL: https://github.com/<username>/<repo_name>/settings/keys werden Sie sehen Screenshot von Github

Am Terminal:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

Sie werden feststellen, dass Sie für den privaten und den öffentlichen Schlüssel denselben Fingerabdruck erhalten.

Derselbe Befehl kann mit einer netten Funktion von GitHub kombiniert werden, nämlich der Tatsache, dass sie die öffentlichen SSH-Schlüssel der Benutzer unter https://github.com/<Benutzername>.keys öffentlich bereitstellen

Hier ist ein Einzeiler, mit dem Sie die Vorteile nutzen können.

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Bruno Bronosky
quelle
1
ssh-keygen -r host.name.com

Gibt die Fingerabdrücke für alle konfigurierten öffentlichen Schlüssel auf einer sshd-Instanz aus.

Diese können dann in DNS-SSHFP- Einträge eingefügt werden.

Mike Schroll
quelle