¿Cómo puede verificar si una clave privada y un certificado coinciden en OpenSSL con ECDSA?

7

Sé cómo hacer esto con claves RSA (consulte este artículo: ¿Determinar si la clave privada pertenece al certificado? ) sin embargo, no sé cómo hacerlo para el certificado / pares de claves ECDSA.

Con las claves RSA, el módulo se puede utilizar para esto. Sin embargo, no estoy seguro de cuál es el "equivalente" para ECDSA

Gracias

    
pregunta Jeff 18.11.2014 - 15:57
fuente

2 respuestas

6

Los datos equivalentes para ECDSA, o cualquier ECC, incluyendo ECDH, son el valor del punto público y una especificación de la curva utilizada. En la práctica, para la interoperabilidad, las personas usan una de las curvas identificadas por un OID estandarizado (NIST, SECG, etc.) y en su mayoría solo las dos "bendecidas" por NSA Suite B, a saber nistp256 y nistp384, aunque los formatos ASN.1 (y la biblioteca de openssl ) puede soportar cualquier (?) curva de forma de Weierstrass.

Pero los métodos sencillos son efectivamente los mismos que en ¿Determinar si la clave privada pertenece al certificado? , a la que agrego algunas posibles mejoras:

  1. Utilice openssl x509 -in cert -pubkey para obtener el campo del certificado y compárelo con (toda) la clave pública (en la misma codificación SPKI) obtenida de la clave privada con openssl ec -in key -pubout

    1A. En lugar de diferentes comandos para claves privadas RSA y ECC, ya que openssl 1.0.0 en 2010 puede usar el algoritmo genérico openssl pkey -in key -pubout para ambos.

  2. Configure un programa basado en openssl para (intentar) usar la clave y el certificado "propio". Si no coinciden, la biblioteca openssl devolverá un error que el programa debería mostrar.

    2A. En lugar de configurar un entorno de servidor completo o tomar temporalmente uno existente, simplemente puede ejecutar openssl s_server -accept X -cert cfile -key kfile donde X es cualquier puerto que se pueda usar en su máquina = no está restringido y no está vinculado ni conectado actualmente. Si comienza bien (cert & key match), solo control-C (o equivalente).

respondido por el dave_thompson_085 18.11.2014 - 17:25
fuente
3

Para dar una implementación concreta de lo que dijo @ dave_thompson_085, esto hace el truco: extrae la clave pública de cada certificado y la clave privada, luego calcula su hash md5, lo que le permite compararlos fácilmente:

# openssl x509 -pubkey -in mydomain-ecc.crt -noout | openssl md5
(stdin)= 77e16c92c1a4907c7da34e72a1c5b879
# openssl pkey -pubout -in mydomain-ecc.key | openssl md5
(stdin)= 77e16c92c1a4907c7da34e72a1c5b879

Desde que se publicó esta pregunta, se ha agregado una respuesta a la pregunta vinculada por el OP, proporcionando un one-liner que también funcionará con certificados ECC (utilizando pkey en lugar de rsa ), pero no proporciona una confirmación visible.

    
respondido por el Synchro 30.11.2016 - 11:59
fuente

Lea otras preguntas en las etiquetas