Nginx: SSL_CTX_use_PrivateKey_file failed: key values mismatch — Решение
При попытке запуска Nginx или применении новой конфигурации с SSL-сертификатом сервер аварийно останавливается: SSL_CTX_use_PrivateKey_file("/etc/ssl/cert.key") failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch).
| Компонент SSL | Директива Nginx | Суть несовпадения |
|---|---|---|
| Публичный сертификат | ssl_certificate | Содержит публичный ключ и подпись Удостоверяющего Центра (CA) |
| Закрытый ключ | ssl_certificate_key | Сгенерирован от другого CSR или другого приватного ключа |
| Математический модуль (Modulus) | Хеш модуля RSA/ECDSA | Модуль сертификата НЕ совпадает с модулем ключа |
- Веб-сервер не может пройти валидацию криптографической пары при инициализации SSL-контекста.
- Сбой часто происходит после ручного перевыпуска SSL-сертификата без обновления соответствующего файла закрытого ключа.
- Проверьте пути к файлам сертификата и закрытого ключа в конфигурационном файле виртуального хоста:
ssl_certificate /etc/ssl/certs/example.com.crt; ssl_certificate_key /etc/ssl/private/example.com.key; - Сравните MD5-хеши модулей открытого сертификата и закрытого ключа с помощью утилиты
openssl:# Хеш публичного сертификата: openssl x509 -noout -modulus -in /etc/ssl/certs/example.com.crt | openssl md5 # Хеш закрытого ключа: openssl rsa -noout -modulus -in /etc/ssl/private/example.com.key | openssl md5 - Если хеши НЕ совпадают, этот ключ физически не принадлежит данному сертификату. Найдите правильный
.keyфайл, который использовался при создании CSR-запроса. - Если используется сертификат на базе эллиптических кривых (ECDSA):
openssl ec -noout -modulus -in /etc/ssl/private/example.com.key | openssl md5 openssl x509 -noout -pubkey -in /etc/ssl/certs/example.com.crt | openssl md5 - Если правильный ключ утерян, выполните процедуру Reissue (перевыпуск) сертификата в вашем УЦ (Let's Encrypt / Sectigo / DigiCert), создав новую пару ключей.
- После установки корректной пары перезапустите Nginx:
sudo nginx -t && sudo systemctl restart nginx.
/etc/letsencrypt/live/domain/: fullchain.pem в качестве ssl_certificate и privkey.pem в качестве ssl_certificate_key. Никогда не указывайте cert.pem вместо fullchain.pem!Частые вопросы (FAQ)
Почему модули ключа и сертификата должны быть одинаковыми?
Открытый сертификат содержит публичный ключ, который является математической парой закрытого ключа. Совпадение их хешей modulus доказывает, что сертификат и ключ принадлежат одной ключевой паре.
Можно ли восстановить закрытый ключ из имеющегося сертификата?
Математически невозможно восстановить приватный ключ из публичного сертификата благодаря стойкости алгоритмов асимметричной криптографии (RSA/ECC).
В чем разница между cert.pem и fullchain.pem?
cert.pem содержит только сертификат вашего домена. fullchain.pem включает ваш сертификат плюс всю цепочку промежуточных сертификатов (Intermediate CA), необходимых для доверия со стороны браузеров.
Как проверить дату истечения срока действия SSL сертификата через CLI?
Выполните команду: openssl x509 -enddate -noout -in /path/to/certificate.crt.