Saltar al contenido
ecdsa.com
OpenSSL 3CLI de OpenSSL

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

Cómo solucionarlo

  1. 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. 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. 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

Errores relacionados

Explorar toda la base de datos de errores de firma