Мониторинг срока действия SSL-сертификатов
Истёкший сертификат кладёт сайт не хуже упавшего сервера: браузеры показывают предупреждение на всю страницу, API-клиенты отказываются подключаться, мобильные приложения ломаются. Автоматическое продление сделало это реже, но не невозможным. Задачи продления ломаются молча, а сертификаты становятся всё короче. Разберём, как проверить срок, понять, почему продление остановилось, и получать предупреждение за несколько дней до проблемы.
Почему это важнее с каждым годом
- CA/Browser Forum проголосовал за поэтапное сокращение максимального срока публичных TLS-сертификатов: 200 дней с 15 марта 2026 года, 100 дней с 15 марта 2027-го и 47 дней с 15 марта 2029-го. Чем больше продлений, тем больше шансов, что одно из них не сработает.
- Сертификаты Let’s Encrypt действуют 90 дней, и Let’s Encrypt тоже собирается их сократить.
- В июне 2025 года Let’s Encrypt перестал присылать письма об истечении срока. Если вы полагались на них, больше вас никто не предупредит.
Когда истекает сертификат
С любой машины с OpenSSL, для сертификата, который сайт отдаёт на самом деле:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 -noout -enddate -issuer -subject
На сервере с certbot, для сертификатов, которыми он управляет:
sudo certbot certificates
Если даты расходятся, certbot продлил сертификат, а веб-сервер всё ещё отдаёт старый.
Почему автопродление останавливается
- Задача продления не запускается. Таймер certbot или строка в cron потерялись при пересборке сервера, либо certbot установлен способом, который их не создаёт. Есть ли расписание, покажет
systemctl list-timers | grep certbot. - Не проходит проверка домена. Для HTTP-01 путь
/.well-known/acme-challenge/должен быть доступен на 80-м порту: правило файрвола, принудительный редирект на другой хост или CDN перед сайтом это ломают. DNS-01 ломается, когда истекает API-токен DNS-провайдера. - Продлили, но не перезагрузили. nginx, Apache или HAProxy отдают старый сертификат из памяти, пока их не перезагрузят.
- Сертификат живёт ещё где-то. Копию на балансировщике, CDN, почтовом сервере или железке загрузили вручную, и её никто не продлевает.
- Лимиты. Сломанная настройка, которая слишком часто повторяет попытки, упирается в лимиты удостоверяющего центра, и потом даже исправленной приходится ждать.
Проверьте продление, ничего не меняя:
sudo certbot renew --dry-run
Перезагружайте веб-сервер после продления
Deploy-хук выполняется, только когда сертификат действительно продлён:
sudo certbot renew --deploy-hook "systemctl reload nginx"
Чтобы это работало всегда, положите скрипт в /etc/letsencrypt/renewal-hooks/deploy/. certbot запускает каждый исполняемый файл оттуда после каждого успешного продления.
Следите за задачей продления
certbot завершается с кодом 0, когда продлевать ещё нечего, поэтому пинг после него значит «задача отработала, ошибок нет». Если в системе работает таймер certbot, добавьте пинг в его сервис командой sudo systemctl edit certbot.service:
[Service] ExecStartPost=/usr/bin/curl -fsS -m 10 --retry 3 -o /dev/null https://ping.heartcron.com/<uuid>
Или в обычном cron вместо таймера:
17 */12 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx" && curl -fsS -m 10 --retry 3 -o /dev/null https://ping.heartcron.com/<uuid>
Задайте проверке период 12 часов и запас в несколько часов. Если задача пропадёт или certbot начнёт падать, вы узнаете об этом за недели до истечения сертификата, а не в тот же день. Как сразу сообщать об ошибках через OnFailure, рассказано в руководстве мониторинг таймеров systemd.
Следите за самим сертификатом
Успешная задача ещё не доказывает, что сайт отдаёт свежий сертификат: может не хватать перезагрузки, или сертификат отдаёт CDN либо балансировщик, который вы не продлеваете сами. Поэтому проверяйте и снаружи. Добавьте в Heartcron SSL-проверку для хоста и выберите, за сколько дней предупреждать, например за 14. Heartcron подключается к сайту так же, как браузер, и присылает алерт, когда отдаваемый сертификат скоро истечёт или уже недействителен.
Заведите проверку для каждого имени со своим сертификатом: example.com, api.example.com, почтовый сервер, статус-страница на своём домене. Заодно проверка домена предупредит до окончания регистрации самого домена — а это кладёт сразу всё.