¿Cómo se prueba un par de claves DSA público / privado?

168

¿Hay alguna manera fácil de verificar que una clave privada determinada coincida con una clave pública determinada? Tengo unos pocos archivos * .pub y unos pocos * .key, y necesito verificar con qué.

Nuevamente, estos son archivos pub / key, DSA.

Realmente preferiría una línea de algún tipo ...

Loki
fuente

Respuestas:

260

Encontré una forma que parece funcionar mejor para mí:

ssh-keygen -y -f <private key file>

ese comando generará la clave pública para la clave privada dada, por lo tanto, simplemente compare la salida con cada archivo * .pub.

Loki
fuente
2
¿Qué hace esto exactamente? ¿Por qué ssh?
sammiwei
2
probablemente porque está usando
pares de claves
2
En mi caso, un servidor de trabajo central tiene unas pocas docenas de id_rsa.pub.blahhostarchivos y no sabía cuál coincidía con la id_rsaclave privada solitaria y estoy configurando scp sin contraseña para poder migrar de sitios web antiguos. Hacer un nuevo par de claves no es una opción; Tengo mis llaves bien configuradas y no voy a estropear eso.
Chris K
1
Esta solución parece funcionar para todos los tipos de claves SSH. Incluso logré recuperar una clave pública fuera de lugar con este enfoque.
Jari Turkia
53

Siempre comparo un hash MD5 del módulo usando estos comandos:

Certificate: openssl x509 -noout -modulus -in server.crt | openssl md5
Private Key: openssl rsa -noout -modulus -in server.key | openssl md5
CSR: openssl req -noout -modulus -in server.csr | openssl md5

Si los hashes coinciden, esos dos archivos van juntos.

Robert
fuente
48

Para claves DSA, use

 openssl dsa -pubin -in dsa.pub -modulus -noout

para imprimir las claves públicas, luego

 openssl dsa -in dsa.key -modulus -noout

para mostrar las claves públicas correspondientes a una clave privada, luego compárelas.

Martin v. Löwis
fuente
18

Suponiendo que tiene las claves públicas dentro de los certificados x.509, y suponiendo que son claves RSA, entonces, para cada clave pública, haga

    openssl x509 -in certfile -modulus -noout

Para cada clave privada, haga

    openssl rsa -in keyfile -modulus -noout

Luego haga coincidir las teclas por módulo.

Martin v. Löwis
fuente
17

El control se puede hacer más fácil con diff:

diff <(ssh-keygen -y -f <private_key_file>) <public key file>

Lo único extraño es que diff no dice nada si los archivos son iguales, por lo que solo se le informará si lo público y lo privado no coinciden.

John D.
fuente
3
Para obtener salida cuando los archivos coinciden:diff -s
Roland
3
Esta es una excelente respuesta. (1) diff -qsdevuelve una simple "respuesta idéntica / no idéntica. (2) debe eliminar el comentario en el archivo de clave pública antes de ejecutar el diff.
emory
7

Elimine las claves públicas y genere nuevas a partir de las claves privadas. Guárdelos en directorios separados o use una convención de nomenclatura para mantenerlos en orden.

Bill el lagarto
fuente
3
La pregunta es cómo verificar y el dispositivo en el que lo verificaremos podría no tener las facilidades para generar uno nuevo.
ArmenB
5

Ingrese el siguiente comando para verificar si una clave privada y una clave pública son un conjunto coincidente (idéntico) o no un conjunto coincidente (diferente) en el directorio $ USER / .ssh. El comando de corte evita que se comparen los comentarios al final de la línea en la clave pública, lo que permite comparar solo la clave.

ssh-keygen -y -f ~/.ssh/id_rsa | diff -s - <(cut -d ' ' -f 1,2 ~/.ssh/id_rsa.pub)

La salida se verá como cualquiera de estas líneas.

Files - and /dev/fd/63 are identical

Files - and /dev/fd/63 differ

Escribí un script de shell que los usuarios usan para verificar el permiso de los archivos ~ / .ssh / y el conjunto de claves coincidentes. Resuelve mis desafíos con incidentes de usuario que configuran ssh. Te puede ayudar. https://github.com/BradleyA/docker-security-infrastructure/tree/master/ssh

Nota: Mi respuesta anterior (en marzo de 2018) ya no funciona con las últimas versiones de openssh. Respuesta anterior: diff -qs <(ssh-keygen -yf ~ / .ssh / id_rsa) <(cut -d '' -f 1,2 ~ / .ssh / id_rsa.pub)

Bradley Allen
fuente
Supongo que deberías dar más detalles, tu publicación está muy cerca de stackoverflow.com/a/22595408/3102264
mpromonet el
Cross publicado en Server Fault: Cómo verificar si un par de claves públicas / privadas de RSA coincide
Peter Mortensen
4

Si está en Windows y quiere usar una GUI, con puttygen puede importar su clave privada:

ingrese la descripción de la imagen aquí

Una vez importado, puede guardar su clave pública y compararla con la suya.

Zac
fuente
1

Cifre algo con la clave pública y vea qué clave privada lo descifra.

Este artículo del proyecto de código de nada menos que Jeff Atwood implementa un contenedor simplificado alrededor de las clases de cifrado .NET. Suponiendo que estas claves se crearon para usar con RSA, use la clase asimétrica con su clave pública para cifrar, y lo mismo con su clave privada para descifrar.

Trigo Mitch
fuente
Estoy buscando algo un poco más simple. Digamos, un revestimiento de un caparazón o similar. Estoy en Linux, y tengo las cosas normales como openssl instalado.
Loki
3
Eso es casi tan útil como decir agregar una clave pública a su archivo Author_keys y usar ssh para ver qué clave privada funciona. El método funciona, pero es un dolor.
Bradley Kreider
0

Si no devuelve nada, entonces coinciden:

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
RoutesMaps.com
fuente
-2

Simplemente use puttygen y cargue su clave privada en él. Ofrece diferentes opciones, por ejemplo, exportar la clave pública de coressponding.

usuario2987067
fuente
1
esto no permite probar el par de claves público-privado
MatFiz