Истечение SSL-сертификата — одна из самых досадных причин простоя сайта. Браузеры блокируют доступ к ресурсам с просроченным сертификатом, пользователи видят предупреждение безопасности, а поисковые системы могут понизить сайт в выдаче. При этом проблема решается за 15 минут — если вы о ней знаете. В этой статье разберём, как выстроить надёжный мониторинг SSL и никогда не пропустить момент обновления.
Почему сертификаты истекают
SSL-сертификаты имеют ограниченный срок действия. Ориентируйтесь на поле notAfter сертификата, который фактически отдаёт нужный сервер: срок зависит от центра сертификации и профиля выпуска. Политики могут меняться, поэтому перед настройкой обновления сверяйте актуальные рекомендации своего CA. Короткий срок снижает риски при компрометации ключа и делает автоматическое обновление особенно важным.
Типичные сценарии сбоя
| Сценарий | Причина | Последствия |
|---|---|---|
| Забыли обновить | Ручное управление, нет напоминаний | Сайт недоступен до ручного обновления |
| Certbot не сработал | Cron отключён, ошибка в скрипте | Сертификат истекает незаметно |
| Wildcard на нескольких доменах | Один домен обновлён, другие — нет | Частичный простой |
| CDN или прокси | Сертификат на edge устарел | Ошибки при доступе через CDN |
Стратегии мониторинга
Ручная проверка: недостаточно
Периодическая проверка через браузер или openssl не масштабируется. При десяти и более доменах легко пропустить один. Ручной подход допустим только для 1–2 критичных доменов.
Автоматический мониторинг: минимум
Рекомендуемый минимум — автоматическая проверка срока действия с уведомлением за 30, 14 и 7 дней до истечения. Это даёт запас времени на обновление даже при сбое автоматики.
Полный цикл: проверка + обновление
Идеальная схема: мониторинг предупреждает о приближении истечения, а автоматическое обновление (Certbot, acme.sh) продлевает сертификат. Мониторинг страхует на случай сбоя автоматики.
Инструменты для проверки SSL
OpenSSL из командной строки
Быстрая проверка срока действия одного домена:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -datesУчебный пример вывода:
notBefore=Jan 1 00:00:00 2026 GMT
notAfter=Mar 31 23:59:59 2026 GMTСкрипт для нескольких доменов
#!/bin/bash
DOMAINS=("example.com" "www.example.com" "api.example.com")
DAYS_WARNING=14
for domain in "${DOMAINS[@]}"; do
expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
if [ -n "$expiry" ]; then
expiry_epoch=$(date -d "$expiry" +%s 2>/dev/null || date -j -f "%b %d %T %Y GMT" "$expiry" +%s)
now_epoch=$(date +%s)
days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
if [ "$days_left" -lt "$DAYS_WARNING" ]; then
echo "ВНИМАНИЕ: $domain истекает через $days_left дней"
fi
fi
doneОнлайн-сервисы
Для регулярного мониторинга без собственной инфраструктуры удобны специализированные сервисы. SSL Monitor на reChecker отслеживает срок действия сертификатов и отправляет уведомления заранее. После плановой проверки он также сохраняет сведения о цепочке и результате её проверки в среде мониторинга. Для разовой проверки используйте SSL Checker: он показывает даты, издателя, имена SAN и согласованные при одном соединении TLS-протокол и шифр. Это базовая проверка, без полного аудита цепочки доверия и перебора всех поддерживаемых протоколов или шифров.
Интеграция с CI/CD
GitHub Actions
name: SSL Check
on:
schedule:
- cron: '0 9 * * 1' # Каждый понедельник в 9:00
jobs:
ssl-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check SSL expiry
run: |
for domain in example.com www.example.com; do
expiry=$(echo | openssl s_client -servername $domain -connect $domain:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
echo "Сертификат $domain истекает: $expiry"
doneУведомления в Slack/Telegram
Добавьте в скрипт отправку в мессенджер при срабатывании порога. Пример для Telegram:
TELEGRAM_BOT_TOKEN="your_token"
TELEGRAM_CHAT_ID="your_chat"
MESSAGE="SSL сертификат $domain истекает через $days_left дней"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="${MESSAGE}"Рекомендуемые пороги уведомлений
| Дней до истечения | Действие | Канал |
|---|---|---|
| 30 | Информационное уведомление | |
| 14 | Напоминание, проверить автообновление | Email, мессенджер |
| 7 | Срочное, ручная проверка обязательна | Все каналы |
| 3 | Критическое, немедленные действия | Все каналы + эскалация |
Автоматическое обновление с Certbot
Для Let's Encrypt настройте автоматическое обновление:
# Установка (Ubuntu/Debian)
sudo apt install certbot python3-certbot-nginx
# Получение сертификата
sudo certbot --nginx -d example.com -d www.example.com
# Certbot автоматически добавляет cron/systemd timer
# Проверка: certbot renew --dry-runПроверьте, что таймер или cron регулярно запускает certbot renew, а certbot renew --dry-run проходит успешно. Следуйте расписанию ACME-клиента и актуальным рекомендациям центра сертификации, не закрепляйте интервал обновления в 60 дней для любого сертификата. После продления проверьте новый notAfter на фактическом HTTPS-адресе.
Мониторинг CDN и прокси
Если сайт отдаётся через Cloudflare, Fastly, AWS CloudFront или другой CDN, сертификат может находиться в нескольких местах:
- Оригинал на origin-сервере — ваш веб-сервер
- Edge-сертификат на CDN — выдаётся CDN-провайдером или загружается вами
Проверяйте оба. CDN может показывать пользователю свой сертификат, а origin — свой. Истечение edge-сертификата приведёт к ошибке для всех посетителей, даже если origin в порядке.
Cloudflare
Cloudflare по умолчанию использует Universal SSL (бесплатный сертификат на своих ключах). Срок действия управляется Cloudflare, но при использовании Full (Strict) или загрузке собственного сертификата — следите за датой истечения в панели SSL/TLS.
Собственный сертификат на CDN
При загрузке своего сертификата на edge настройте мониторинг отдельно. Добавьте домен CDN (например, cdn.example.com) в список проверяемых в SSL Monitor или в свой скрипт.
Мониторинг поддоменов и Wildcard
Wildcard-имя *.example.com покрывает один уровень поддоменов, например www.example.com или api.example.com. Оно не покрывает основной домен example.com и более глубокие имена вроде dev.api.example.com; нужные дополнительные имена должны быть отдельно включены в SAN. Правило одного уровня описано в RFC 9525.
Проверка основного домена не подтверждает состояние сертификатов поддоменов. Разные hostname могут обслуживаться разными серверами и отдавать разные сертификаты, даже если для них когда-то выпускали общий wildcard. Проверяйте каждое фактическое полное имя, которое должно работать по HTTPS, с соответствующим SNI, как в примере OpenSSL выше.
Добавляйте нужные домены, например api.example.com и blog.example.com, в SSL Monitor и сверяйте сохранённое имя в карточке. Текущий SSL Monitor приводит www.example.com к example.com; такая запись не подтверждает сертификат www.example.com. Этот hostname проверяйте отдельно через OpenSSL или собственный скрипт по полному имени.
Обработка ложных срабатываний
Иногда мониторинг сообщает об истечении, хотя сертификат обновлён. Причины:
- Кэш DNS — проверка идёт на старый IP. Обновите DNS или подождите TTL.
- Несколько серверов — балансировщик отдаёт запрос на сервер со старым сертификатом. Проверьте синхронизацию сертификатов на всех нодах.
- Разные окружения — staging обновлён, production — нет. Убедитесь, что мониторите production.
При получении уведомления сначала проверьте вручную через SSL Checker — возможно, это ложное срабатывание.
Стоимость мониторинга
| Решение | Стоимость | Ограничения |
|---|---|---|
| Собственный скрипт + cron | Бесплатно | Время на разработку и поддержку |
| GitHub Actions | Зависит от условий аккаунта | Проверьте актуальные лимиты и расписание запусков |
| UptimeRobot, Pingdom | Зависит от тарифа провайдера | Проверьте наличие SSL-проверок и нужных уведомлений |
| SSL Monitor (reChecker) | 30 ₽ за домен / 30 дней | Каждый домен оплачивается отдельно |
Выбирайте способ проверки по нужным hostname и SNI, надёжности запусков, доставке уведомлений и затратам на поддержку. Число доменов и наличие бесплатного тарифа сами по себе не подтверждают, что схема заметит сбой и сообщит о нём ответственному.
Чек-лист внедрения
- Составьте список всех доменов с HTTPS
- Настройте автоматическую проверку (скрипт, CI или сервис мониторинга)
- Настройте уведомления за 30, 14 и 7 дней
- Для Let's Encrypt — проверьте работу
certbot renew - Добавьте проверку SSL в ежемесячный операционный чек-лист
- Для CDN — добавьте домены edge в мониторинг
- Назначьте ответственного за реакцию на уведомления
Реакция на срабатывание
Когда приходит уведомление об истечении:
- Проверьте вручную — возможно, ложное срабатывание (кэш, другой сервер)
- Для Let's Encrypt — выполните
certbot renewвручную, проверьте логи - Для платных сертификатов — свяжитесь с провайдером, продлите и установите новый
- Перезапустите сервисы — Nginx, Apache после обновления сертификата
- Проверьте доступность — откройте сайт в браузере, проверьте через SSL Checker
- Задокументируйте — что произошло, как решили, как предотвратить в будущем
Имейте письменную инструкцию по действиям при срабатывании. В момент инцидента времени на поиск решений не будет.
Альтернативы Let's Encrypt
Let's Encrypt — не единственный вариант бесплатных сертификатов:
- ZeroSSL — бесплатные DV-сертификаты, совместим с ACME
- Buypass — закрыл приём заказов и продлений TLS/SSL-сертификатов 15 октября 2025 года, а выдачу завершил 31 октября. Старые рекомендации выбирать его бесплатный сертификат больше не актуальны; см. объявление центра сертификации.
- Платные CA (DigiCert, Sectigo, GlobalSign) — выбирайте по типу проверки, поддержке и условиям выпуска.
Мониторинг нужен для любого типа сертификата. Срок покупки услуги у CA не равен сроку действия отдельного TLS-сертификата. Проверяйте фактический notAfter, правила перевыпуска и доставку нового сертификата на каждый нужный сервер.
Резюме: минимальный набор действий
- Список всех HTTPS-доменов (включая CDN, поддомены)
- Автоматическая проверка раз в неделю (скрипт, CI или SSL Monitor)
- Уведомления за 30, 14, 7 дней до истечения
- Для Let's Encrypt — проверенный
certbot renew(cron или systemd) - Инструкция по действиям при срабатывании
- Ответственный за реакцию
Дополнительные проверки
Помимо срока действия, стоит отслеживать:
- Цепочка сертификатов — все промежуточные сертификаты должны быть валидны
- Алгоритм подписи — SHA-1 устарел, используйте SHA-256
- Протоколы — отключите SSLv3, TLS 1.0, TLS 1.1
SSL Checker помогает быстро посмотреть основные сведения сертификата и параметры одного согласованного TLS-соединения. SSL Monitor дополнительно фиксирует цепочку и результат её проверки при плановом соединении. Для самостоятельной проверки доверия используйте OpenSSL с верификацией цепочки, а для перебора поддерживаемых протоколов и шифров — отдельный TLS-сканер. Разбор типичных ошибок приведён в руководстве по SSL.
Итоговая памятка
- Автоматический мониторинг обязателен при 3+ доменах
- Уведомления за 30, 14, 7 дней до истечения
- Для Let's Encrypt — проверьте certbot renew
- CDN и поддомены — в отдельном мониторинге
- Имейте инструкцию по действиям при срабатывании
Настройка мониторинга занимает 1-2 часа. Регулярная проверка — минуты в неделю. Простой из-за просроченного сертификата — часы простоя и репутационные потери. Соотношение затрат и рисков очевидно.
Мониторинг SSL не требует больших затрат, но критически важен для стабильности. Потратьте час на настройку — и вы исключите один из самых неприятных сценариев простоя.