¿Qué es una huella digital de clave SSH y cómo se genera?

129

Siempre encuentro que recibo este mensaje cuando entro sshen una nueva máquina:

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

Que significa? ¿Cada máquina tendrá la misma huella digital cada vez?

¿Cómo se generan estas huellas digitales? ¿De qué parámetros dependen?

Kit Ho
fuente

Respuestas:

65

La huella digital se basa en la clave pública del host, generalmente basada en "/etc/ssh/ssh_host_rsa_key.pub". Generalmente es para una fácil identificación / verificación del host al que se está conectando.

Si la huella digital cambia, la máquina a la que se está conectando ha cambiado su clave pública. Esto puede no ser algo malo (sucede al reinstalar ssh), pero también podría indicar que se está conectando a una máquina diferente en el mismo dominio / IP (sucede cuando se está conectando a través de algo como el equilibrador de carga) o que están siendo atacados con un ataque man-in-the-middle, donde el atacante de alguna manera está interceptando / redirigiendo su conexión ssh para conectarse a un host diferente que podría estar husmeando a su usuario / pw.

En pocas palabras: si se le advierte de una huella digital cambiada, tenga cuidado y verifique que realmente se esté conectando al host correcto a través de una conexión segura. Aunque la mayoría de las veces esto es inofensivo, puede ser una indicación de un problema potencial

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

laberinto
fuente
55
"... tenga cuidado y verifique que realmente se está conectando al host correcto a través de una conexión segura" - pregunta estúpida, pero ¿cómo puede hacer esto fácilmente?
Savara
1
@Savara Cuando se conecta a un servidor SSH que no se conectó antes, debe solicitar la clave pública del servidor SSH al administrador del servidor. El administrador del servidor le dará un fragmento de texto. Debe agregar este texto al archivo ~/.ssh/known_hosts. De esta manera, cuando se conecta al servidor, su cliente SSH reconocerá este servidor, ya que ha guardado su clave pública en known_hosts. Por lo tanto, en realidad nunca debe decir "sí" cuando el cliente SSH le dice "No se puede establecer la autenticidad del host". Siempre debe agregar la clave pública del servidor de antemano.
Utku
@Savara Si hace esto, sabrá que está ocurriendo algo sospechoso cuando su cliente SSH le dice "No se puede establecer la autenticidad del cliente" o cuando le dice "La clave pública del servidor ha cambiado". Por lo tanto, siempre debe agregar la clave pública del servidor a su ~/.ssh/known_hostsarchivo de antemano y nunca decir sí cuando su cliente SSH le dice "No se puede establecer la autenticidad del cliente" o cuando le dice "La clave pública del servidor ha sido cambiado ".
Utku
3
Sí, soy plenamente consciente de cómo funciona la mecánica de ver las huellas digitales SSH, pero un gran porcentaje de las veces no tienes la opción de obtener la huella digital a través de otro canal. TOFU es, lamentablemente, lo mejor que solemos obtener.
Savara
¿Hay alguna forma de verificar la autenticidad incluso después de responder "sí"?
intercambio el
104

Puede generar una huella digital para una clave pública usando ssh-keygenasí:

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

Ejemplo concreto (si usa una clave pública 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 primera parte (2048)es la longitud de la clave en bits, la segunda parte (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)es la huella digital de la clave pública y la tercera parte es la ubicación del archivo de clave pública en sí.

Benjamin Oakes
fuente
¿sabe cómo traducir a 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 este formato de esa clave pública?
Kit Ho
@ KitHo No estoy seguro si entiendo tu pregunta. Actualicé el ejemplo, ya que creo ssh-keygen -lfque hará lo que quieras.
Benjamin Oakes
55
Cuando se SSH en una nueva máquina, lo que uno ve no es la huella digital de la clave pública de un usuario, sino la huella digital de la clave pública del host. Entonces, un mejor ejemplo para el contexto de la pregunta es ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Muestra la huella digital que también se muestra en los inicios de sesión SSH en localhost.
tanius
58
Mis huellas digitales ssh-keygenreportadas sha256. Para obtener md5huellas digitales corrí ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C
66
(@JustinC) OpenSSH versiones 6.8 (marzo de 2015) y versiones posteriores cambiaron a SHA256, que se muestra en base64 en lugar de hexadecimal, de forma predeterminada. Para el uso del cliente ssh -o FingerprintHash=md5o su equivalente en ssh_configy sobre cosas que usan sshcomo scp.
dave_thompson_085
72

La huella digital es el MD5 sobre los datos binarios dentro de la clave pública codificada en 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

El md5sum 6530389635564f6464e8e3a47d593e19 es la huella digital que se muestra cuando se genera la clave, solo sin los dos puntos de separación.


Sin embargo, si está lidiando con las huellas digitales que Amazon muestra en la consola EC2 Key Pairs, desafortunadamente esa puede ser una bestia diferente . Si se trata de una cadena hexadecimal de 32 dígitos, es la huella dactilar de clave pública MD5 SSH estándar anterior. Pero si son 40 dígitos hexadecimales, en realidad es una huella digital calculada tomando el SHA1 de la clave privada en 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
andrew.n
fuente
1
Encontré esta respuesta útil en el siguiente escenario. Su sistema usa SHA1 para calcular la huella digital, pero el de su amigo usa md5. Compartí una huella digital que era SHA1 y no coincidía con el MD5 que generó su sistema. Esto ayudó, ¡gracias! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa
Esto es muy relevante para entender por qué esta huella digital no coincidirá con las de los registros DNS SSHFP, porque usan resúmenes SHA-1 o SHA-256.
neirbowj
1
@Liczyrzepa, el campo de clave pública puede tener o no '==' al final según el tipo de clave y el tamaño de bits; más seguro e IMO más fácil de usar awk '{print $2}' /path/to/keyfile.pubo similar.
dave_thompson_085
13
Esta es la única respuesta que explica cómo se calcula la huella digital
greuze
2
Sin embargo, en Linux Mint el comando es:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Si desea verificar un archivo de clave SSH para ver si es lo mismo que lo que informa github como "Implementar clave", esto es para usted ...

Desde la URL privada: https://github.com/<username>/<repo_name>/settings/keys verá captura de pantalla de github

En la 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)

Notará que obtiene la misma huella digital para las claves privadas y públicas.

Ese mismo comando se puede combinar con una característica ordenada de GitHub, que es el hecho de que sirven públicamente las claves públicas SSH de los usuarios en https://github.com/<username>.keys

Aquí hay una línea que puede usar para aprovecharla.

$ 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
fuente
1
ssh-keygen -r host.name.com

Producirá las huellas digitales para todas las claves públicas configuradas en una instancia de sshd.

Estos se pueden colocar en los registros DNS SSHFP .

Mike Schroll
fuente