¿La información de clave pública del sujeto debe ser la misma en 2 certificados diferentes creados desde la misma CSR?

3

Recientemente, he trabajado en la configuración de la fijación de certificados para nuestra aplicación móvil. Estoy usando el hash de la información de clave pública del sujeto (SPKI) para el anclaje. Ahora, tenía la impresión de que SPKI será el mismo si crearé otro certificado desde la misma clave privada. Así que lo probé: creé una clave privada usando SSL y una CSR coincidente. Ahora, firmé este CSR dos veces usando diferentes claves privadas, y para mi sorpresa, el SPKI (y el pin hash) no era el mismo. ¿Es ese el comportamiento esperado? ¿O es algo que me falta? ¿Está también firmada la PKI en el certificado?

Esos son los comandos openssl que he usado:

Para generar un CSR:

openssl req -new -sha256 -key private.key -out private.csr

Para generar la clave privada de CA:

openssl genrsa -des3 -out ca.key 2048

Para firmar el CSR:

openssl x509 -req -days 365 -in private.csr -signkey ca.key -out test.crt

Este es el comienzo del SPKI desde el primer certificado:

BA 86 D3 0E E8 CC F3 C0 A2 B9 1E 8B BA 45 80 11 EF 13 CB 4F 76 CE A8 6A

Y este es el comienzo del SPKI a partir del segundo certificado:

CC 96 B3 AB EA 0D FC 66 91 D8 E2 50 2B A7 8F 63 91 4C 7E 10 A3 48 1E 9F

Para calcular los hashes, utilicé la forma más sencilla: importé los certificados al llavero mac y los abrí:

Tambiénuséeste secuencia de comandos de python de TrustKit para obtener el hash del pin de certificado, y También fue diferente.

    
pregunta Omer Levi Hevroni 21.12.2017 - 07:06
fuente

1 respuesta

4
  

Para firmar el CSR:

 openssl x509 -req -days 365 -in private.csr -signkey ca.key -out test.crt

De man x509 :

  

-signkey nombre de archivo
... Si el   la entrada es una solicitud de certificado luego un certificado autofirmado es   creado usando la clave privada suministrada usando el nombre del sujeto en el   solicitud

En otras palabras: está creando un certificado autofirmado con ca.key como la clave y no un certificado con private.key como la clave que desea. Como está utilizando una clave de ca diferente, obtendrá diferentes claves dentro del certificado generado y, por lo tanto, información de clave pública de sujeto diferente.

Lo que debes hacer en su lugar es crear una CA y usarla para firmar la CSR de esta manera:

$ openssl req -x509 -newkey rsa:4096 -keyout c0.pem -out c0.pem -days 365
$ openssl x509 -req -days 365 -in private.csr -CA c0.pem -CAcreateserial -out test0.crt

Si haces esto con una CA diferente pero con la misma CSR, verás que todos los certificados resultantes tienen la misma información de clave pública del sujeto, usando la clave incluida en la CSR.

    
respondido por el Steffen Ullrich 21.12.2017 - 07:34
fuente

Lea otras preguntas en las etiquetas