¿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 ...

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.


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.


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.


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.


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.


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.


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)


Supongo que deberías dar más detalles, tu publicación está muy cerca de stackoverflow.com/a/22595408/3102264
mpromonet el


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.


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.


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

-2

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


1
esto no permite probar el par de claves público-privado
MatFiz
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.