Перейти к содержимому
ecdsa.com
OpenSSL 3OpenSSL CLI

Сообщение об ошибке

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

Также выводится как

  • 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 выводит её как «[emerg] SSL_CTX_use_PrivateKey(\"<key file>\") failed (SSL: error:05800074:x509 certificate routines::key values mismatch)»; CLI-утилита openssl добавляет имя функции («x509 certificate routines:ossl_x509_check_private_key:key values mismatch»); Python выводит «[X509: KEY_VALUES_MISMATCH] key values mismatch»; Node.js выставляет код ERR_OSSL_X509_KEY_VALUES_MISMATCH. В OpenSSL 1.1.1 использовался код 0B080074.

OpenSSL 3 — X509_R_KEY_VALUES_MISMATCH when loading a certificate with a private key (nginx, Node.js, Python, openssl s_server)

Что это означает

TLS-серверу (или библиотеке) передали сертификат и закрытый ключ, которые не составляют пару: открытый ключ в сертификате — не открытая половина этого закрытого ключа. OpenSSL отказывается загружать такую пару, поэтому сервер не запускается или не удаётся создать контекст. Каждый из файлов по отдельности в полном порядке.

Почему это происходит

Как исправить

  1. 1.

    Сравните открытые ключи

    Вычислите хеш открытого ключа, извлечённого из сертификата, и хеш открытого ключа, полученного из закрытого ключа; одинаковые хеши означают, что ключ и сертификат составляют пару. Это одинаково работает для ключей RSA, EC и 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.

    Поставьте конечный сертификат первым в пакете

    Выведите список субъектов в пакете: первым должен идти конечный сертификат для имени вашего хоста, за ним — промежуточные.

    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.

    Найдите подходящий ключ среди нескольких

    Сравните хеш открытого ключа сертификата с каждым ключом-кандидатом; если ни один не подходит, ключ утерян и сертификат придётся перевыпустить с новым ключом.

    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

Связанные ошибки

Открыть всю базу ошибок подписей