¿Determine si la clave privada pertenece al certificado?

38

Dado un certificado¹ y un archivo de clave privada², ¿cómo puedo determinar si la clave pública en el certificado coincide con la clave privada?

Mi idea inicial fue simplemente cifrar un texto con la clave pública en el certificado e intentar descifrarlo con la clave privada. Si es ida y vuelta, tenemos un ganador. Simplemente no puedo descubrir cómo hacer esto con OpenSSL.

Alternativamente, si pudiera generar la clave pública a partir de la clave privada, podría comparar sus huellas digitales. SSH parece tener un comando para esto ( ssh-keygen -y -f my_key > my_key.pub ), pero los hashes no coinciden. (Estoy casi seguro de que tengo la clave correspondiente al certificado, ya que el servidor web está sirviendo con él, pero me gustaría una forma más fácil que hacer girar un servidor para verificar).

¹ un archivo .crt, en formato x509, creo. OpenSSL puede leerlo con openssl x509 -text -in that_cert.crt
² Una clave privada RSA

    
pregunta Thanatos 26.04.2014 - 05:11
fuente

2 respuestas

48

Voy a asumir que tienes ssl.crt y ssl.key en tu directorio actual.

Si desea ver lo que está en su certificado, es

# openssl x509 -in ssl.crt -text -noout

Dos de las cosas aquí serán el Módulo y el Exponente de la clave pública RSA (en hexadecimal).

Si desea ver lo que está en su clave privada es

# openssl rsa -in ssl.key -text -noout

Tenga en cuenta que la clave pública suele estar allí (como mínimo, se requiere que el módulo esté allí para que la clave privada funcione, y el exponente público suele ser 65537 o 3). Así que simplemente puedes verificar si el módulo y el exponente público coinciden. Por supuesto, si desea comprobar que la clave privada es realmente válida (es decir, d y e son exponentes RSA válidos para el módulo m), deberá ejecutar

# openssl rsa -check -in ssl.key -noout

EDITAR (2018): Tenga en cuenta que si está comprobando que una clave privada proveniente de una fuente no confiable corresponde con un certificado, DEBE COMPROBAR que la clave privada sea válida. Vea aquí para ver un ejemplo donde no se comprueba la validez de una clave privada "filtrada" para que una CA revoque incorrectamente un certificado. Puede omitir este paso si sabe que ha generado válidamente el par de llaves.

Ahora puede simplemente generar la clave pública tanto del certificado como de la clave privada y luego usar diff para verificar que no sean diferentes:

# openssl x509 -in ssl.crt -pubkey -noout > from_crt.pub
# openssl rsa -in ssl.key -pubout > from_key.pub
# diff from_crt.pub from_key.pub

O como una línea que no crea archivos (utilizando sustitución de procesos ):

# diff  <(openssl x509 -in ssl.crt -pubkey -noout) <(openssl rsa -in ssl.key -pubout)

Si las teclas coinciden, diff no debería devolver nada. (Probablemente verá una salida de "escritura de clave RSA" en stderr desde el segundo comando).

Tenga en cuenta que su servidor web probablemente se quejaría en voz alta si el certificado y la clave privada no coincidieran. Por ejemplo, con nginx usando la clave incorrecta (mismo tamaño, mismo exponente público, pero la clave del año pasado) para el certificado nginx está usando:

# sudo /etc/init.d/nginx restart
* Restarting nginx nginx                                                                                         
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/private/wrong_key.key") failed 
(SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed
    
respondido por el dr jimbob 26.04.2014 - 06:03
fuente
10

La respuesta aceptada es correcta, pero solo funciona para claves RSA. Será necesario modificarlo para que coincida con otros tipos de claves.

En su lugar, aquí hay una sola línea que funciona para todo tipo de claves que admite openssl.

 cmp <(openssl x509 -pubkey -in certificate.pem -noout) <(openssl pkey -pubout -in private-key.pem -outform PEM)

Devolverá 'verdadero' si y solo si la clave privada coincide con la clave pública en el certificado.

    
respondido por el Manish 02.11.2016 - 18:44
fuente

Lea otras preguntas en las etiquetas