Hace poco me pidieron generar un certificado SSL para un dominio .com, para que al acceder vía navegador mediante HTTPS a ese dominio, apareciera el certificado.
Para hacer tal cosa, empecé generando un archivo CSR y su clave privada (.key) y envié el CSR a la persona encargada de realizar los pagos en la empresa donde trabajo para que lo subiese a la entidad registradora de turno, realizase el pago y me devolviera el certificado en formato .crt.
Hasta aquí todo bien. El problema vino cuando obtuve el archivo .crt y lo quise usar en un nginx. Al hacer un reload de la configuración, nginx se quejó de que había un certificate mismatch entre la clave pública (.crt) y la clave privada (.key).
Buscando por internet, vi que la utilidad openssl dispone de una forma de verificar si los hashes de ambas claves coinciden o no. Para ello, basta con ejecutar un comando que devuelve el hash de cada uno de los archivos involucrados en un certificado y ver si coinciden entre ellos.
Empecemos por obtener el hash del archivo .crt (clave pública del certificado):
HOST:/ # openssl x509 -in cert.crt -pubkey -noout -outform pem | sha256sum 1157e76f78b0580e2a1f289552a6a45d9e7bc60bc37e57549034faaf2fb03f1z -
Del mismo modo, podemos ver el hash de la clave privada (.key):
HOST:/ # openssl pkey -in clave_privada.key -pubout -outform pem | sha256sum 1157e76f78b0580e2a1f289552a6a45d9e7bc60bc37e57549034faaf2fb03f1z -
E incluso podemos ver el hash del CSR original:
HOST:/ # openssl req -in CSR.csr -pubkey -noout -outform pem | sha256sum 1157e76f78b0580e2a1f289552a6a45d9e7bc60bc37e57549034faaf2fb03f1z -
En mi caso, el CSR y la clave privada (.key) hacían match, pero el crt tenía un hash distinto.
Para solucionar el problema, bastó con contactar con la entidad registradora y subir el CSR de nuevo. Esto generó un nuevo .crt que sí hacía match con los archivos anteriores. Subí este crt al servidor de nginx y este ya me permitió usar el certificado sin problema.
Fuentes:
https://www.sslshopper.com/certificate-key-matcher.html