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
O certificado foi emitido para uma chave mais nova (ou mais antiga)
comumA renovação criou uma nova chave e um novo CSR, mas a configuração ainda aponta para o arquivo da chave antiga, ou o novo certificado foi combinado com a chave do ano passado.
O bundle começa pelo intermediário, e não pelo certificado folha
comumOs servidores comparam a chave com o primeiro certificado do arquivo. Um arquivo de cadeia na ordem intermediário, folha (ou com a raiz primeiro) dispara este erro, embora o certificado folha e a chave correspondam.
Arquivos de hosts ou ambientes diferentes foram misturados
ocasionalCopiar certificados entre homologação e produção, ou entre vários nomes no mesmo servidor, facilmente combina um certificado com a chave de outro host.
Como corrigir
- 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.
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.
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