Сообщение об ошибке
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 отказывается загружать такую пару, поэтому сервер не запускается или не удаётся создать контекст. Каждый из файлов по отдельности в полном порядке.
Почему это происходит
Сертификат выпущен для более нового (или более старого) ключа
частоПри продлении были созданы новый ключ и CSR, но конфигурация по-прежнему указывает на старый файл ключа, или новый сертификат оказался в паре с прошлогодним ключом.
Пакет сертификатов начинается с промежуточного сертификата, а не с конечного
частоСерверы сравнивают ключ с первым сертификатом в файле. Если в файле цепочки сначала идёт промежуточный сертификат, а за ним конечный (или первым стоит корневой), возникает эта ошибка, хотя конечный сертификат и ключ составляют пару.
Перепутаны файлы разных хостов или окружений
иногдаПри копировании сертификатов между staging- и production-окружениями или между несколькими именами на одном сервере сертификат легко оказывается в паре с ключом другого хоста.
Как исправить
- 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.
Поставьте конечный сертификат первым в пакете
Выведите список субъектов в пакете: первым должен идти конечный сертификат для имени вашего хоста, за ним — промежуточные.
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.
Найдите подходящий ключ среди нескольких
Сравните хеш открытого ключа сертификата с каждым ключом-кандидатом; если ни один не подходит, ключ утерян и сертификат придётся перевыпустить с новым ключом.
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