Pular para o conteúdo
ecdsa.com
OpenSSL 3CLI do OpenSSL

Mensagem de erro

error:05800074:x509 certificate routines::key values mismatch

Também aparece 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'

O nginx -t informa o erro como “[emerg] SSL_CTX_use_PrivateKey(\"<key file>\") failed (SSL: error:05800074:x509 certificate routines::key values mismatch)”; a CLI do openssl acrescenta o nome da função (“x509 certificate routines:ossl_x509_check_private_key:key values mismatch”); o Python imprime “[X509: KEY_VALUES_MISMATCH] key values mismatch”; o Node.js define o código ERR_OSSL_X509_KEY_VALUES_MISMATCH. O OpenSSL 1.1.1 usava o 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)

O que significa

Um servidor TLS (ou uma biblioteca) recebeu um certificado e uma chave privada que não formam um par: a chave pública dentro do certificado não é a metade pública da chave privada. O OpenSSL se recusa a carregar o par, então o servidor não inicia ou o contexto não pode ser criado. Nenhum dos dois arquivos tem problema por si só.

Por que acontece

Como corrigir

  1. 1.

    Comparar as chaves públicas

    Calcule o hash da chave pública extraída do certificado e o da chave pública derivada da chave privada; hashes idênticos significam que elas formam um par. Isso funciona da mesma forma para chaves RSA, EC e 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.

    Colocar o certificado folha primeiro no bundle

    Liste os titulares do bundle; o certificado folha do seu nome de host precisa vir primeiro, seguido dos intermediários.

    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 a chave correspondente entre várias

    Compare o hash da chave pública do certificado com cada chave candidata; se nenhuma corresponder, a chave foi perdida e o certificado precisa ser reemitido com uma nova chave.

    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

Erros relacionados

Ver toda a base de erros de assinatura