Che cos'è un'impronta digitale della chiave SSH e come viene generata?


131

Trovo sempre che ricevo questo messaggio quando sshentro in una nuova macchina:

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

Cosa significa? Ogni macchina avrà sempre la stessa impronta digitale?

Come vengono generate queste impronte digitali? Da quali parametri dipendono?

Risposte:


65

L'impronta digitale si basa sulla chiave pubblica dell'host, in genere basata su "/etc/ssh/ssh_host_rsa_key.pub" Generalmente è per una facile identificazione / verifica dell'host a cui ci si sta connettendo.

Se l'impronta digitale cambia, la macchina a cui ci si sta connettendo ha cambiato la propria chiave pubblica. Questo potrebbe non essere una cosa negativa (succede dalla reinstallazione di ssh), ma potrebbe anche indicare che ci si sta connettendo a una macchina diversa nello stesso dominio / IP (succede quando ci si connette attraverso qualcosa come il bilanciamento del carico) o che si vengono presi di mira con un attacco man-in-the-middle, in cui l'attaccante sta in qualche modo intercettando / reindirizzando la tua connessione ssh per connettersi a un host diverso che potrebbe ficcare il tuo utente / pw.

In conclusione: se vieni avvisato di un'impronta digitale modificata, fai attenzione e ricontrolla che ti stai effettivamente connettendo all'host corretto tramite una connessione sicura. Anche se il più delle volte questo è innocuo, può essere un'indicazione di un potenziale problema

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


5
"... fai attenzione e ricontrolla che ti stai effettivamente connettendo all'host corretto tramite una connessione sicura" - domanda stupida, ma come puoi farlo facilmente?
Savara,

1
@Savara Quando ci si connette a un server SSH a cui non si era precedentemente connessi, è necessario richiedere la chiave pubblica del server SSH all'amministratore del server. L'amministratore del server ti darà un pezzo di testo. È necessario aggiungere questo testo al file ~/.ssh/known_hosts. In questo modo, quando ti connetti al server, il tuo client SSH riconoscerà questo server, dal momento che hai salvato la sua chiave pubblica in known_hosts. Quindi, in realtà non dovresti mai dire "sì" quando il client SSH ti dice "L'autenticità dell'host non può essere stabilita". È sempre necessario aggiungere in anticipo la chiave pubblica del server.
Utku,

@Savara Se lo fai, saprai che sta succedendo qualcosa di sospetto quando il tuo client SSH ti dice "Impossibile stabilire l'autenticità del client" o quando ti dice "La chiave pubblica del server è stata cambiata". Quindi, dovresti sempre aggiungere la chiave pubblica del server al tuo ~/.ssh/known_hostsfile in anticipo e mai dire di sì quando il tuo client SSH ti dice "L'autenticità del client non può essere stabilita" o quando ti dice "La chiave pubblica del server è stata cambiato".
Utku,

3
Sì, sono pienamente consapevole di come funzionano i meccanismi di visualizzazione delle impronte digitali SSH, ma una grande percentuale delle volte non hai la possibilità di ottenere l'impronta digitale attraverso un altro canale. TOFU è purtroppo il migliore che spesso riceviamo.
Savara,

C'è un modo per verificare l'autenticità anche dopo aver risposto "sì"?
cambio

105

È possibile generare un'impronta digitale per una chiave pubblica usando in questo ssh-keygenmodo:

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

Esempio concreto (se si utilizza una chiave pubblica RSA):

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

La prima parte (2048)è la lunghezza della chiave in bit, la seconda parte (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)è l'impronta digitale della chiave pubblica e la terza parte è la posizione del file della chiave pubblica stessa.


sai come tradurre in 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 questo formato da quella chiave pubblica?
Kit Ho

@KitHo Non sono sicuro di aver capito la tua domanda. Ho aggiornato l'esempio, poiché penso ssh-keygen -lfche farà quello che vuoi.
Benjamin Oakes,

5
Quando si inserisce SSH in una nuova macchina, ciò che si vede non è l'impronta digitale del pubkey dell'utente, ma l'impronta digitale del pubkey dell'host. Quindi un esempio migliore per il contesto della domanda è ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Mostra l'impronta digitale che viene mostrata anche negli accessi SSH a localhost.
tanius,

60
Le mie impronte digitali ssh-keygensegnalate sha256. Al fine di ottenere le md5impronte digitali ho corso ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Giustino C,

6
(@JustinC) OpenSSH versioni 6.8 (marzo 2015) e successive modificate in SHA256, visualizzate in base64 anziché in esadecimale, per impostazione predefinita. Per l'uso client ssh -o FingerprintHash=md5o l'equivalente in ssh_confige su cose che usano sshcome scp.
dave_thompson_085,

72

L'impronta digitale è MD5 sui dati binari all'interno della chiave pubblica con codifica Base64.

$ 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

Il md5sum 6530389635564f6464e8e3a47d593e19 è l'impronta digitale visualizzata quando viene generata la chiave, solo senza i due punti di separazione.


Tuttavia, se hai a che fare con le impronte digitali che Amazon mostra nella console delle coppie di chiavi EC2, purtroppo potrebbe essere una bestia diversa . Se è una stringa esadecimale a 32 cifre, è l'impronta digitale della chiave pubblica SSH MD5 sopra riportata. Ma se ha 40 cifre esadecimali, in realtà è un'impronta digitale calcolata prendendo l'SHA1 della chiave privata in formato PKCS # 8:

$ 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

1
Ho trovato questa risposta utile nel seguente scenario. Il tuo sistema utilizza SHA1 per calcolare l'impronta digitale, ma il tuo amico usa md5. Ho condiviso un'impronta digitale che era SHA1 e non corrispondeva all'MD5 generato dal suo sistema. Questo ha aiutato - grazie! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa,

Questo è molto rilevante per capire perché questa impronta digitale non corrisponderà a quella nei record DNS SSHFP, perché usano digest SHA-1 o SHA-256.
Neirbowj,

1
@Liczyrzepa il campo chiave pubblica può avere o meno "==" alla fine a seconda del tipo di chiave e della dimensione dei bit; più sicuro e IMO più facile da usare awk '{print $2}' /path/to/keyfile.pubo simile.
dave_thompson_085,

13
Questa è l'unica risposta che spiega come viene calcolata l'impronta digitale
greuze,

2
Tuttavia in Linux Mint il comando è:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze

13

Se vuoi controllare un file chiave SSH per vedere se è lo stesso di quello che viene segnalato come "Distribuisci chiave" da github, questo è per te ...

Dall'URL privato: https://github.com/<username>/<repo_name>/settings/keys vedrai screenshot da github

Al 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 ec2-user@ip-10-2-1-16.ec2.internal (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 ec2-user@ip-10-2-1-16.ec2.internal (RSA)

Noterai che otterrai la stessa impronta digitale sia per le chiavi private che pubbliche.

Lo stesso comando può essere combinato con una funzionalità accurata di GitHub, che è il fatto che servono pubblicamente le chiavi pubbliche SSH degli utenti su https://github.com/<username>.keys

Ecco un one-liner che puoi usare per sfruttarlo.

$ 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

1
ssh-keygen -r host.name.com

Produrrà le impronte digitali per tutte le chiavi pubbliche configurate su un'istanza sshd.

Questi possono quindi essere inseriti nei record DNS SSHFP .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.