Cómo verificar si un par de claves públicas / privadas RSA coincide

72

Tengo dos archivos id_rsay id_rsa.pub. ¿Qué comando se puede usar para validar si son un par válido ?

Ryan
fuente
Confirmaré la respuesta de Michuelnik; me salvó de tener que hacer un nuevo par de llaves, gracias. ssh -vAyuda mucho también.
Chris K

Respuestas:

93

Preferiría el ssh-keygen -y -e -f <private key>camino en lugar de la respuesta aceptada de ¿Cómo se prueba un par de claves DSA público / privado? en desbordamiento de pila.

ssh-keygen -y -e -f <private key>toma una clave privada e imprime la clave pública correspondiente que se puede comparar directamente con sus claves públicas disponibles. (Sugerencia: tenga cuidado con los comentarios o las opciones clave).

(¿Cómo demonios está haciendo eso? Solo puedo esperar que la clave pública esté codificada directa o indirectamente en la clave privada ...)

Yo mismo necesitaba esto y usé el siguiente Bash one-liner. No debería mostrar nada si las teclas van juntas. Aplique un poco -qal diff en scripts y diff solo establece el código de retorno de manera adecuada.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Michuelnik
fuente
1
@MichaelHampton: ahora entiendo tu comentario. "la respuesta aceptada" debería referirse a la pregunta sobre stackoverflow, no a esta pregunta ...
Michuelnik
1
@Sirch: pensé que la decisión de qué clave es privada y cuál es pública es puramente aleatoria ya que las dos claves son iguales. Lo que una clave cifra solo se puede descifrar con la otra. Y si se pudiera obtener una clave de la otra, todo esto no funcionaría.
Michuelnik
1
@Michuelnik Puede derivar la clave pública de la clave privada. No puede derivar la clave privada de la clave pública. No estábamos hablando del material que encripta.
Sirch
1
@Michuelnik en mi humilde opinión, la pregunta está fuera del tema en SO y en el tema aquí (y / o Superusuario). En mi opinión, no debe marcarse como duplicado y, en su lugar, marcarse allí para la migración. Pero está cubierto en ambos, así que me gusta el intercambio más completo de información.
Chris K
10
Mientras exista id_rsa.pub, ssh-keygen -y -e -f id_rsano comprobará id_rsa en absoluto, sino que solo devolverá el valor de id_rsa.pub. Entonces, por ejemplo, si echo 5 > id_rsaborra la clave privada, haga la diferencia, ¡la diferencia pasará! Además, ejecutar ssh-keygen -yef foodonde foo no es una clave válida (y no tiene foo.pub correspondiente) bloqueará la espera de la entrada del usuario, así que tenga cuidado al usar esto en un script.
32

Dependiendo de dónde obtenga el archivo de clave pública que está probando, la respuesta aceptada puede dar resultados falsos positivos. Esto se debe al comportamiento descrito en el comentario de @drewbenn. Específicamente, cuando la opción -e se usa con el archivo de clave privada como el parámetro de opción -f, simplemente repite (pero reformatea) lo que está en el archivo de clave pública asociado.

En otras palabras,

ssh-keygen -y -f id_rsa

(aparentemente) genera el valor de clave pública, y

ssh-keygen -y -e -f id_rsa

simplemente y genera (y reformatea) la clave en el id_rsa.pub existente, sea lo que sea .

En mi caso, tengo que verificar que el par no haya sido dañado. Entonces, decidí comparar lo siguiente:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

con

cut -d' ' -f 2 id_rsa.pub

Por lo tanto:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Quizás esto no sea tan flexible, pero es mejor para mis necesidades. Quizás ayude a alguien más.

twildfarmer
fuente
55
Esto realmente debería reemplazar la respuesta aceptada o al menos superarla en términos de votos positivos.
thomanski
¡Gracias! Este comando no funciona con claves con una frase de contraseña, no lo solicita de forma interactiva. Extraje el contenido del comando two () a los archivos y los diferencié, eso funciona.
Yaroslav Nikitenko
5

Si están en su sistema local, manténgase id_rsa.puben su $HOME/.ssh/authorized_keysy sshpara localhostusar la id_rsaclave. Si funciona, entonces coinciden.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
Michael Hampton
fuente