«key values mismatch»: cuando certificado y clave no van juntos

Tras instalar un certificado nuevo, el servidor web no arranca. El mensaje suena críptico, pero la causa casi siempre es una de cuatro.

Cómo se ve el error

# nginx (OpenSSL 3)
SSL_CTX_use_PrivateKey("/etc/ssl/private/server.key") failed
(SSL: error:05800074:x509 certificate routines::key values mismatch)

# Apache
AH02565: Certificate and private key www.ejemplo.es:443:0 from
/etc/ssl/certs/server.crt and /etc/ssl/private/server.key do not match

# HAProxy
inconsistencies between private key and certificate loaded from PEM file

En Windows/IIS el mismo problema se manifiesta de otra forma: al vincular el certificado aparece «A specified logon session does not exist» (mensaje de Windows en inglés), o el certificado no muestra el icono de clave en la consola.

Qué comprueba el servidor

Un certificado contiene la clave pública. El servidor guarda la clave privada correspondiente. Al arrancar comprueba que ambas forman un par. Si no es así, se niega a servir, porque ningún cliente podría establecer la conexión.

Las cuatro causas más habituales

1. El certificado pertenece a otro CSR

El clásico: para la renovación se creó un CSR nuevo con una clave nueva, pero se instaló la clave antigua. O el CSR se creó en otro servidor o lo hizo un compañero.

2. Orden incorrecto en el archivo de certificados

nginx y HAProxy comparan la clave con el primer certificado del archivo. Si el intermedio va primero porque los archivos se unieron en el orden equivocado, la clave no puede coincidir.

# correcto: primero el certificado del servidor, después los intermedios
cat server.crt intermediate.crt > fullchain.pem

3. La configuración apunta al archivo equivocado

Un error tipográfico en la ruta, un enlace simbólico a un archivo antiguo, o certificado y clave intercambiados en la configuración.

4. Windows: certificado sin clave privada

Si se importó un archivo .cer aunque el CSR se creó en otro equipo, falta la clave. Si el CSR se creó en el mismo servidor, a menudo se puede restaurar el vínculo con la clave:

certutil -repairstore my <número de serie del certificado>

Cómo averiguar qué va junto

Lo más rápido es la coincidencia de clave: suelta en el campo el certificado, la clave y el CSR si lo tienes. La herramienta calcula la huella de la clave pública de cada objeto e indica con letras qué va junto. Funciona con claves RSA y ECC, archivos DER y claves cifradas. No se sube nada.

En la línea de comandos se hace así. Los tres resultados deben ser idénticos:

openssl x509 -in server.crt -noout -pubkey | openssl sha256
openssl pkey -in server.key -pubout       | openssl sha256
openssl req  -in server.csr -noout -pubkey | openssl sha256

La comparación del módulo (-modulus), que se recomienda a menudo, solo funciona con RSA. La comparación de la clave pública también sirve para ECDSA.

Si hay varias claves sueltas, así encuentras la correcta:

for k in /etc/ssl/private/*.key; do
  echo "$(openssl pkey -in "$k" -pubout 2>/dev/null | openssl sha256 | cut -d' ' -f2)  $k"
done

La solución

FAQ

¿Puedo recuperar la clave privada a partir del certificado?

No. El certificado solo contiene la clave pública. Si la clave privada se ha perdido, solo ayuda una clave nueva con un CSR nuevo y una reemisión.

¿Por qué la clave coincide con el CSR pero no con el certificado?

Entonces el certificado se emitió para otro CSR, por ejemplo tras varios intentos. Comprueba en tu cuenta de la CA qué CSR se usó o pide la reemisión con el CSR correcto.

¿Es seguro soltar la clave privada en una herramienta web?

Con la coincidencia de clave de hollop.net no se transmite nada; el cálculo se hace con JavaScript en tu navegador. Si quieres máxima seguridad, usa los comandos OpenSSL de arriba.