Мониторинг срока действия TLS-сертификатов и автопродления

Автопродление certbot работает надёжно ровно до первого случая, когда оно не сработало: закончилось место на диске, изменился путь для проверки домена, истёк срок действия другого компонента в цепочке. Сертификат истекает молча, сайт перестаёт открываться у части пользователей, а узнаёт об этом обычно сама компания — по жалобам клиентов. Отдельная, независимая от certbot проверка срока действия закрывает именно этот разрыв. Про сами параметры TLS (шифры, протоколы, заголовки) — отдельно: проверка TLS своего сайта и настройка TLS в nginx.
Статья опирается на логику направления «Сетевая безопасность» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Проверка логики выполнена с самоподписанными тестовыми сертификатами в контейнере, после неё всё удалено.
Что должно получиться
| Уровень | Что это значит на практике |
|---|---|
| 1. Начальный | Истечение срока действия сертификата обнаруживается заранее и автоматически, а не по факту неработающего сайта |
Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.
Быстрая проверка: да/нет
Самый простой и переносимый способ — встроенный ключ OpenSSL, который сам сравнивает срок действия с указанным интервалом и возвращает код завершения:
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -checkend 1209600
Интервал задаётся в секундах (1209600 — 14 дней). Код возврата 0 означает «сертификат не истечёт раньше указанного срока», 1 — «истечёт раньше» (в выводе при этом строка «Certificate will expire»). Этого достаточно для простого да/нет в скрипте мониторинга:
if ! openssl x509 -in "$CERT" -noout -checkend 1209600; then
echo "ПРЕДУПРЕЖДЕНИЕ: $CERT истекает менее чем через 14 дней"
fi
Точное число дней для отчёта
Если нужна не только проверка порога, но и цифра для дашборда или отчёта, посчитайте разницу дат явно:
end_epoch=$(date -d "$(openssl x509 -in "$CERT" -noout -enddate | cut -d= -f2)" +%s)
now_epoch=$(date +%s)
days_left=$(( (end_epoch - now_epoch) / 86400 ))
echo "осталось дней: $days_left"
На тестовом сертификате со сроком действия двое суток обе проверки дали согласованный результат: явный расчёт показал «осталось дней: 2», а -checkend с порогом 14 дней вернул код ошибки (сертификат истечёт раньше), с порогом в один день — код успеха.
Почему недостаточно только автопродления certbot
- Автопродление и проверка срока — разные механизмы. Таймер certbot может быть выключен, сломан или настроен на домен, который давно не используется, пока независимая проверка срока действия не завязана на certbot и видит фактическое состояние сертификата на диске или на самом сокете.
- Сертификат может лежать не там, где его ищет мониторинг. После смены пути или домена certbot продлевает один файл, а служба использует другой — отдельная проверка по реальному пути конфигурации веб-сервера находит такое расхождение.
- Прямая проверка самого соединения надёжнее проверки файла на диске, если нужно убедиться, что именно отдаётся клиентам:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -checkend 1209600
Порядок внедрения
- Составьте список доменов и сертификатов, включая внутренние сервисы, не только публичный сайт.
- Проверяйте оба уровня: файл на диске (быстро, без сети) и реальное соединение (медленнее, но видит то, что реально отдаётся клиенту).
- Задайте порог с запасом на случай, если автопродление не сработает с первого раза и понадобится время на ручное вмешательство (14 дней — разумный старт).
- Отправляйте предупреждение туда, где его увидят, а не только в журнал, который никто не читает: канал команды, система мониторинга, отдельное письмо.
- Включите в общий мониторинг, а не держите отдельным скриптом по расписанию cron без связи с остальной системой наблюдения.
Диагностика
| Симптом | Причина и что делать |
|---|---|
| Сертификат истёк, хотя автопродление настроено | Таймер или хук продления не отработал. Проверьте журнал certbot отдельно, независимая проверка срока — это сигнал, а не диагноз причины |
| Проверка файла на диске показывает «ок», а сайт отдаёт просроченный сертификат | Служба не перечитала обновлённый сертификат после продления. Добавьте перезапуск или reload службы в хук продления certbot |
date -d не понимает формат даты от openssl x509 -enddate |
Формат зависит от локали. Используйте -checkend для простой проверки порога, если точное число дней не требуется |
| Предупреждение срабатывает, но на него никто не реагирует | Сообщение уходит туда, где его не видят. Подключите к тому же каналу, что и остальные оповещения мониторинга |
Где это в модели зрелости
Материал относится к направлению «Сетевая безопасность» (материалы направления, карта зрелости). Начальный уровень требует, чтобы базовые отказы инфраструктуры обнаруживались заранее: истечение сертификата — один из самых предсказуемых и при этом самых частых по статистике инцидентов именно потому, что его слишком легко оставить без независимой проверки.
Как проверить
- Проверка срока действия не зависит от certbot и работает независимо от того, сломалось автопродление или нет.
- Проверяются и файл сертификата, и реальное TLS-соединение для публичных сервисов.
- Предупреждение приходит с запасом (например, за 14 дней), а не в последний день.
- Предупреждение доходит до канала, где его реально увидят и отреагируют.
Источники
- Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
- Документация OpenSSL, команда
x509: docs.openssl.org.


















