Сертификат продлён, а службы его не подхватили
Продление сертификата и его применение — два разных шага. Файлы обновляются, но работающая служба держит в памяти прежний сертификат до перезагрузки настроек. Если действие после продления не выполнилось, клиенты увидят просроченный сертификат при обновлённых файлах на диске.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Действие после продления не выполнилось
Ошибка в команде или неверное имя службы означают, что перезагрузка настроек не произошла.
-
Служба держит прежний сертификат в памяти
Даже при обновлённых файлах работающий процесс отдаёт сертификат, прочитанный при запуске.
-
Продление не выполняется вовсе
Таймер продления может быть выключен или задача падать. Тогда сертификат просто истекает.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Сроки действия всех сертификатов на машине.
sudo certbot certificates 2>/dev/nullКакой сертификат служба отдаёт прямо сейчас.
openssl s_client -connect localhost:443 </dev/null 2>/dev/null | openssl x509 -noout -datesРаботает ли таймер продления.
systemctl list-timers "certbot*" --all --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Ошибка в команде или неверное имя службы означают, что перезагрузка настроек не произошла.
- Как проверить
-
Посмотрите результат продления и действия.
sudo journalctl -u "certbot*" -n 30 --no-pager | grep -iE "hook|deploy|reload" sudo ls -l /etc/letsencrypt/renewal-hooks/deploy/ 2>/dev/null
- Как исправить
- Исправьте действие после продления и проверьте его прогоном. Проверять надо именно прогоном, а не чтением: ошибки в таких действиях незаметны до следующего продления.
- Почему происходит
- Даже при обновлённых файлах работающий процесс отдаёт сертификат, прочитанный при запуске.
- Как проверить
-
Сравните сертификат на диске и отдаваемый службой.
sudo openssl x509 -in /etc/letsencrypt/live/example.org/cert.pem -noout -dates openssl s_client -connect localhost:443 </dev/null 2>/dev/null | openssl x509 -noout -dates
- Как исправить
- Перезагрузите настройки службы. Для веб-серверов это делается без разрыва соединений и должно быть частью действия после продления.
- Почему происходит
- Таймер продления может быть выключен или задача падать. Тогда сертификат просто истекает.
- Как проверить
-
Посмотрите таймер и последние попытки.
systemctl list-timers "certbot*" "snap.certbot*" --all --no-pager 2>/dev/null sudo certbot certificates 2>/dev/null | grep -iE "expiry|VALID"
- Как исправить
- Включите таймер продления и настройте оповещение об отказе задачи. Истёкший сертификат ломает доступ ко всем службам на этом имени.
Пример вывода
Продление прошло, служба отдаёт прежний сертификат. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
certbot[11000]: Congratulations, all renewals succeeded
certbot[11000]: Hook 'deploy-hook' reported error code 5
certbot[11000]: Hook 'deploy-hook' ran with error output: Failed to reload nginx.service: Unit nginx.service not found.
Связанные ошибки
- certbot: проверка владения доменом не проходит Обновление сертификата не удаётся: занят порт 80, недоступен каталог проверки, перехвачен редиректом.
- nginx: ошибки сертификата при запуске (SSL_CTX_use_PrivateKey) nginx не запускается из-за сертификата: не совпадает ключ, неполная цепочка, файл повреждён, нет прав на чтение ключа.
- logrotate: ошибка в действии после ротации Ротация журналов проходит, а служба не переоткрывает файлы: сбой действия после ротации.
- Прыжок системного времени сбивает таймеры и сертификаты После синхронизации времени таймеры срабатывают не вовремя, а проверка сертификатов отказывает. Почему и что делать.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- certificate verify failed в журнале службы Проверка сертификата не прошла: истёк срок, неполная цепочка, неверное имя, нет доверенных корневых сертификатов.
- clocksource: Marking clocksource unstable Ядро переключило источник времени. Службы видят скачки времени, таймеры срабатывают не тогда, когда ожидалось.
- nginx: SSL_do_handshake() failed и ошибки TLS Ошибки рукопожатия TLS в журнале nginx: несовпадение версий протокола, отсутствие поддерживаемых наборов шифров, обращение по http к https-порту.
Где встречается чаще всего
Источники
- Документация Certbot: действия при продлении
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено действием после продления с неверным именем службы.