Mensaje de error
error:05800074:x509 certificate routines::key values mismatch
También se muestra como
- x509 certificate routines:ossl_x509_check_private_key:key values mismatch
- [X509: KEY_VALUES_MISMATCH] key values mismatch
- code: 'ERR_OSSL_X509_KEY_VALUES_MISMATCH'
nginx -t lo notifica como «[emerg] SSL_CTX_use_PrivateKey(\"<key file>\") failed (SSL: error:05800074:x509 certificate routines::key values mismatch)»; la CLI de openssl añade el nombre de la función («x509 certificate routines:ossl_x509_check_private_key:key values mismatch»); Python imprime «[X509: KEY_VALUES_MISMATCH] key values mismatch»; Node.js establece el código ERR_OSSL_X509_KEY_VALUES_MISMATCH. OpenSSL 1.1.1 usaba el código 0B080074.
OpenSSL 3 — X509_R_KEY_VALUES_MISMATCH when loading a certificate with a private key (nginx, Node.js, Python, openssl s_server)
Qué significa
Un servidor TLS (o una biblioteca) recibió un certificado y una clave privada que no forman pareja: la clave pública del certificado no es la mitad pública de la clave privada. OpenSSL se niega a cargar el par, así que el servidor no arranca o no se puede crear el contexto. Ninguno de los dos archivos tiene nada de malo por separado.
Por qué ocurre
El certificado se emitió para una clave más nueva (o más antigua)
frecuenteLa renovación creó una clave y una CSR nuevas, pero la configuración sigue apuntando al archivo de la clave antigua, o se emparejó el certificado nuevo con la clave del año pasado.
El bundle empieza por el intermedio, no por el certificado hoja
frecuenteLos servidores comparan la clave con el primer certificado del archivo. Un archivo de cadena en el orden intermedio, hoja (o con una raíz al principio) provoca este error aunque el certificado hoja y la clave coincidan.
Se mezclaron archivos de distintos hosts o entornos
ocasionalAl copiar certificados entre preproducción y producción, o entre varios nombres de un mismo servidor, es fácil emparejar un certificado con la clave de otro host.
Cómo solucionarlo
- 1.
Comparar las claves públicas
Calcula el hash de la clave pública extraída del certificado y el de la derivada de la clave privada; si los hashes son idénticos, forman pareja. Funciona igual con claves RSA, EC y Ed25519.
bash # The two hashes must be identical openssl x509 -in server.pem -noout -pubkey | openssl sha256 openssl pkey -in server.key -pubout | openssl sha256 - 2.
Poner el certificado hoja primero en el bundle
Enumera los sujetos del bundle; el certificado hoja de tu nombre de host debe ir primero, seguido de los intermedios.
bash # Servers match the key against the FIRST certificate of the file: make it the leaf openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout | grep subject= cat api.example.com.crt intermediate.crt > fullchain.pem - 3.
Encontrar la clave que coincide entre varias
Compara el hash de la clave pública del certificado con cada clave candidata; si ninguna coincide, la clave se perdió y hay que volver a emitir el certificado con una clave nueva.
bash # Which of several keys belongs to the certificate? cert=$(openssl x509 -in server.pem -noout -pubkey | openssl sha256) for k in /etc/ssl/private/*.key; do [ "$(openssl pkey -in "$k" -pubout 2>/dev/null | openssl sha256)" = "$cert" ] && echo "match: $k" done