nginx: ошибки сертификата при запуске (SSL_CTX_use_PrivateKey)
Сообщения вида SSL_CTX_use_PrivateKey_file(... ) failed или PEM_read_bio_X509 означают проблему с файлами сертификата: ключ не соответствует сертификату, файл не в том формате или недоступен для чтения. nginx проверяет это при запуске и без сертификата не поднимается.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Ключ не соответствует сертификату
После повторного выпуска сертификата легко оставить старый ключ. Файлы по отдельности корректны, но пара не совпадает.
-
Файл в неверном формате или повреждён
nginx ждёт формат PEM. Файл в DER, файл с лишними строками или обрезанный при копировании не читается.
-
Нет прав на чтение ключа
Ключ читает главный процесс nginx от root, но если каталог закрыт для него (например по метке SELinux) или файл принадлежит другому пользователю с правами 0600, чтение не пройдёт.
-
Отдан только сертификат без промежуточных
Браузеры сообщат о недоверенной цепочке, а сам nginx запустится. Это не отказ запуска, но частая ошибка при ручной установке сертификата.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Показывает, какой файл сертификата не удалось загрузить.
sudo nginx -tРазбирает сертификат: кому выдан, кем и до какого числа.
sudo openssl x509 -in /путь/cert.pem -noout -subject -issuer -enddateКакой сертификат сервер отдаёт фактически: полезно после обновления.
echo | openssl s_client -connect localhost:443 -servername example.org 2>/dev/null | openssl x509 -noout -subject -enddateРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- После повторного выпуска сертификата легко оставить старый ключ. Файлы по отдельности корректны, но пара не совпадает.
- Как проверить
-
Сравните отпечатки открытой части.
sudo openssl x509 -noout -modulus -in /etc/ssl/certs/site.crt | openssl md5 sudo openssl rsa -noout -modulus -in /etc/ssl/private/site.key | openssl md5
- Как исправить
- Возьмите ключ и сертификат из одной выдачи: отпечатки должны совпадать.
- Почему происходит
- nginx ждёт формат PEM. Файл в DER, файл с лишними строками или обрезанный при копировании не читается.
- Как проверить
-
Попробуйте разобрать файлы.
sudo openssl x509 -in /etc/ssl/certs/site.crt -noout -subject -enddate sudo head -1 /etc/ssl/private/site.key
- Как исправить
- Переконвертируйте в PEM или скачайте файлы заново. Первая строка ключа должна начинаться с «-----BEGIN».
- Почему происходит
- Ключ читает главный процесс nginx от root, но если каталог закрыт для него (например по метке SELinux) или файл принадлежит другому пользователю с правами 0600, чтение не пройдёт.
- Как проверить
-
Проверьте права по пути.
namei -l /etc/ssl/private/site.key
- Как исправить
- Оставьте права 0600 с владельцем root и убедитесь, что каталог доступен главному процессу.
- Почему происходит
- Браузеры сообщат о недоверенной цепочке, а сам nginx запустится. Это не отказ запуска, но частая ошибка при ручной установке сертификата.
- Как проверить
-
Посмотрите число сертификатов в файле.
sudo grep -c "BEGIN CERTIFICATE" /etc/ssl/certs/site.crt
- Как исправить
- Соберите файл с полной цепочкой: сначала сертификат домена, затем промежуточные. Для Let’s Encrypt это fullchain.pem.
Пример вывода
Ключ не соответствует сертификату. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nginx[7120]: nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/ssl/private/site.key") failed (SSL: error:05800074:x509 certificate routines::key values mismatch)
nginx[7120]: nginx: configuration file /etc/nginx/nginx.conf test failed
Связанные ошибки
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- certbot: проверка владения доменом не проходит Обновление сертификата не удаётся: занят порт 80, недоступен каталог проверки, перехвачен редиректом.
- nginx 403 Forbidden и Permission denied на файлы сайта nginx отдаёт 403: нет прав на файлы сайта, закрыт каталог по пути, мешает SELinux или AppArmor, нет индексного файла.
- nginx 502 Bad Gateway: connect() failed к приложению nginx работает, а приложение недоступно: connect() failed, connection refused, no such file or directory для сокета. Разбор 502.
- nginx 504 Gateway Time-out: upstream timed out nginx не дождался ответа приложения. Разбор таймаутов proxy_read_timeout и fastcgi_read_timeout, поиск медленных мест.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
Где встречается чаще всего
Источники
- Документация nginx: настройка HTTPS
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено подменой ключа от другой выдачи сертификата.