Huella digital de la clave ssh PEM

30

Tengo un archivo PEM que agrego a un agente ssh en ejecución:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

¿Cómo puedo obtener la huella digital de la clave (que veo en ssh-agent) directamente del archivo? Sé que ssh-keygen -l -f some_keyfunciona para claves ssh "normales", pero no para archivos PEM.

Si intento ssh-keygen en el archivo .pem, obtengo:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Esta clave comienza con:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

a diferencia de una clave privada "normal", que se ve así:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
Desconocido
fuente
¿Por qué crees que no funciona para archivos PEM? ¿Qué error obtienes cuando lo pruebas? Un .ssh/id_rsaarchivo generado por OpenSSH usando todos los valores predeterminados ES un archivo PEM. Las claves privadas están codificadas por PEM de forma predeterminada. De hecho, puede usar claves RSA que genere con OpenSSL directamente con OpenSSH.
Zoredache
descripción actualizada con salida de ssh-keygen en .pem
Desconocido el
(tarde pero necroed) @Zoredache: Antes de 7.2 (en 2016, después de esta Q) ssh-keygen -lno puedo leer un archivo de clave privada, aunque otras ssh-keygen(y ssh*) operaciones sí lo hacen. Pero cuando ssh-keygen genera una clave, escribe tanto el archivo de clave privada, por ejemplo, id_rsa y un archivo de clave pública correspondiente con, .pubpor ejemplo, agregado id_rsa.pub. Más viejos ssh-keygen -l se trate de añadir .pubal nombre de archivo que especifique y leer ese archivo de clave pública.
dave_thompson_085

Respuestas:

34

Si desea recuperar la huella digital de su archivo de clave pública perdido, puede recuperarlo del archivo de clave privada :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Entonces puede determinar la huella digital pública:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

En algunos sistemas más nuevos, esto imprime la huella digital SHA256 de la clave. Puede imprimir la huella digital MD5 de la clave (la forma de los dos puntos) usando la opción -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

O como una línea de comando :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
fuente
La respuesta de @ MikeD es en realidad la respuesta "correcta" para lo que estaba buscando el OP (y lo que estaba buscando). AWS proporciona la huella digital en el formato que mostró, con los pares de dígitos separados por dos puntos. Su solución (tomada de la página AWS proporcionada) también genera la huella digital de la misma manera, para que pueda verificarla correctamente.
Mike Williamson
50

La " Verificación de la huella digital de su par de claves " de AWS proporciona dos frases que resuelven el problema, dependiendo de cómo se creó su clave.

Si creó su par de claves con AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

O, si creó su par de claves con una herramienta de terceros:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(huellas digitales redactadas en la salida anterior)

Mike D
fuente
6

Aquí hay una línea que debe hacer lo que desea sin requerir la creación de un archivo de clave pública localmente.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Esto utiliza la cadena bash here <<<para tener stdin disponible como un archivo normal ( /dev/stdin) en lugar de una tubería, ya ssh-keygenque solo funcionará en un archivo.

A partir de la versión 7.2 de openssh ssh-keygen admite las huellas digitales de la entrada estándar:

  • ssh-keygen (1): permite la toma de huellas digitales desde la entrada estándar, por ejemplo, "ssh-keygen -lf -"

Tenga en cuenta que este comando se romperá con claves privadas que usan una frase de contraseña y no están usando un agente. Debería funcionar con archivos pem generados por AWS u OpenStack que no usan frases de contraseña.

Consulte https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin para obtener más información.

htaccess
fuente
Las notas de la versión no decían, pero según la fuente a partir de 7.2 -ltambién admite la lectura de un archivo de clave privada (pero no de stdin).
dave_thompson_085
2

No obtiene la huella digital del archivo de clave privada sino del archivo de clave pública.

De hecho, ssh-keygen ya te dijo esto:

./query.pem no es un archivo de clave pública.

Ejecútelo contra la mitad pública de la clave y debería funcionar.

Más generalmente hablando

Piénselo: la razón por la que existe la huella digital es que puede identificar la clave pública. De hecho, obtener un hash de la clave privada es un problema de seguridad potencial además de ser inútil para el servidor (que ni siquiera TIENE la clave privada en cuestión).

Una vez que tenga la clave pública, el proceso consiste en verificar que el cliente tenga una retención en la mitad privada correspondiente. Como ya sabe qué claves está tratando de verificar, no necesita la huella digital.

Stephane
fuente
El problema es que no tengo una clave pública para esta privada :( Y otra cosa, ssh-keygenfunciona en un archivo de clave privada RSA que tiene la información adicional al inicio (ver mi publicación inicial), pero no en este. .
Desconocido
Entonces no hay nada que puedas hacer al respecto. No puede obtener la mitad pública de la clave de la parte privada más de lo que puede hacer lo contrario.
Stephane
3
Eso es incorrecto Como @ominug señaló anteriormente, ssh-keygen -yfhace esto.
Steve Bennett
44
@Stephane Si bien es correcto en un nivel RSA puro, en la práctica la forma en que las claves se almacenan en la especificación PKCS, el formato para claves privadas en realidad incluye ambas claves. Comparar especificaciones para privado versus público
Håkan Lindqvist
"No se puede obtener la mitad pública de la clave de la parte privada ..." - oh sí, probablemente sí. Tome el módulo de la clave privada y use 65537 como exponente público, y es probable que haya encontrado la clave pública.
Jim Flood