ESPN DeportesMessi y Cristiano Ronaldo, diferentes hasta para irsePunchPolice arrest fake fertility doctor in OyoESPNJudge 'just hating every single moment of' watching Yankees' eliminationThe Jerusalem PostIran says Strait of Hormuz could reopen within a week as Tehran weighs US responseBollywood HungamaMirzapur duo Abhishek Banerjee and Divyenndu reunite for an ‘Empire’ style drama web show on Amazon Prime VideoDaily MaverickHOME SERIES: Kagiso Rabada ruled out of first Test tussle against AustraliaRTP DesportoI Liga: Suárez, Zalazar e Maxi “preparados”, mas Borges não garante titularidadeZDF heuteEntdecken Sie das ZDF-NachrichtenstudioStraits Times SportRallying-US back on world championship calendar for first time since 1988Rolling StoneBad Bunny, Lana Del Rey to Light Up the Leonida Airwaves as ‘GTA 6’ Radio HostsVanguardCollapsed towers disrupt power supply in NasarawaGolem.deAnzeige: Nach dem Prime Day - Gaming-Tastatur mit Hall-Effect für nur 159 Euro
The Daily Newsstand · Free, Always
Thursday, October 8, 2026

Мониторинг SSL: как не пропустить истекающий сертификат

Translate

Максимальный срок публичных сертификатов с марта этого года сократился с 398 до 200 дней. С 2029 года они будут действительны всего 47 дней, а забыть о продлении проще простого, ведь есть и более важные дела. Под катом собрал семь способов удобно следить за сроками SSL.

SSL-сертификат — это то, что даёт вашему сайту тот самый «замочек» в адресной строке. Если серьёзнее, то он даёт браузеру установить с сайтом защищенное HTTPS-соединение и проверить, что сертификат выдан для нужного домена. У сертификата есть срок годности, и когда он кончается, браузер начинает показывать посетителям красное предупреждение про небезопасное соединение… 

Какие бывают сертификаты

Раз уж заговорили про перевыпуск, кратко разложу по полочкам, что вообще продаётся на рынке. Сертификаты отличаются по трём осям. 

Первая — глубина проверки. Domain Validation (DV) подтверждает контроль над доменом и подходит для большинства обычных сайтов. Organization Validation (OV) дополнительно проверяет сведения об организации. EV идёт ещё дальше в проверке компании, хотя современные браузеры больше не выделяют такие сертификаты отдельной заметной плашкой в адресной строке.

Вторая — покрытие: 

  • Single-domain защищает один домен. 

  • Wildcard вида *.site.ru закрывает основной домен и все его поддомены первого уровня, site.ru и хоть api.site.ru, хоть grafana.site.ru. Сам site.ru должен быть указан в сертификате отдельно. 

  • Multi-domain позволяет включить в один сертификат несколько разных доменных имён через поле SAN.

Третья — как подтверждается владение. Классически удостоверяющий центр кладёт вам файл, вы размещаете его по специальному пути, робот приходит и проверяет. Как альтернативу можно использовать DNS-запись — добавляете TXT в зону и не трогаете файлы сайта, что удобно, когда сайт на конструкторе.

Почему за сертификатами теперь придётся смотреть чаще

Если раньше сертификаты надо было перевыпускать раз в год, то сейчас уже раз в 200 дней, с 2027 года — раз в 100 дней, а с 2029 года, как я уже сказал, раз в полтора месяца. Всё это из-за того, что в апреле 2025 года CA/Browser Forum принял бюллетень SC-081v3. Напоминалки тут не работают — нужен постоянный мониторинг. 

Прежде чем строить системы, полезно изучить базовую команду, которая показывает сроки любого сертификата:

openssl s_client \

 -servername example.com \

 -connect example.com:443 \

 </dev/null 2>/dev/null \

| openssl x509 -noout -dates -subject -ext subjectAltName

В ответ прилетят notBefore, notAfter, Subject и список имен из SAN. Этого хватает, чтобы проверить один сайт за несколько секунд. 

Помните, что сертификаты живут не только на 443-м порту. Протухший сертификат на почтовом сервере  может сломать подключения клиентов и взаимодействие с другими системами. Та же openssl-команда работает и там, просто добавляется ключ -starttls:

openssl s_client \

 -starttls smtp \

 -servername mail.example.com \

 -connect mail.example.com:25 \

 </dev/null 2>/dev/null \

| openssl x509 -noout -dates

И раз с самим сертификатом разобрались, теперь перейдём к тому, как не забыть его продлить. Дальше к мониторингу. 

Способ 1. Скрипт на bash, который пишет в TG

Для чего: поднять мониторинг через bash и видеть оповещения в телеге. 

Для тех, кто не хочет поднимать лишние сервисы, классика жанра — скрипт в кроне. Openssl умеет отвечать кодом возврата, на этом всё и строится:

#!/bin/bash

set -uo pipefail

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

TOKEN="123456:ABC_токен_бота"

CHAT_ID="123456789"

DAYS=14

for DOMAIN in site1.ru site2.ru shop.site1.ru; do

    if ! CERT=$(

        timeout 15 openssl s_client \

            -servername "$DOMAIN" \

            -connect "$DOMAIN:443" \

            </dev/null 2>/dev/null \

        | openssl x509 -outform PEM 2>/dev/null

    ); then

        echo "Не удалось получить сертификат $DOMAIN" >&2

        continue

    fi

    if ! printf '%s\n' "$CERT" \

        | openssl x509 \

            -noout \

            -checkend "$((DAYS * 86400))" \

            >/dev/null 2>&1

    then

        MSG="⚠️ У $DOMAIN сертификат протухнет в ближайшие $DAYS дней (или уже протух)"

        curl -fsS \

            --max-time 10 \

            -X POST \

            "https://api.telegram.org/bot${TOKEN}/sendMessage" \

            --data-urlencode "chat_id=${CHAT_ID}" \

            --data-urlencode "text=${MSG}" \

            >/dev/null

    fi

done

Кладём в:

sudo nano /usr/local/bin/ssl-watch.sh

Делаем исполняемым:

sudo chmod +x /usr/local/bin/ssl-watch.sh

Проверяем:

/usr/local/bin/ssl-watch.sh

И вешаем на 09:00 каждый день:

0 9 * * * /usr/local/bin/ssl-watch.sh

Раз в день скрипт проходит по списку доменов, и если сертификат истекает — сигналит сообщением. Бот заводится через @BotFather за пару минут, токен и ID чата подставляются в начало скрипта. 

Минус — всё живёт на одном сервере, и если упадёт он сам, письмо счастья не придёт. Лечится просто, запускайте скрипт с соседнего сервера или добавьте мёртвую руку вроде healthchecks.io.

Способ 2. Uptime Kuma

Для чего: следить за сроком сертификата через простой веб-интерфейс.

Самый быстрый путь к нормальному мониторингу, когда у вас до пяти сайтов — поднять Uptime Kuma, самохостенную «панель доступности» с очень приятным интерфейсом: 

docker run -d \

  --restart=always \

  -p 3001:3001 \

  -v uptime-kuma:/app/data \

  --name uptime-kuma \

  louislam/uptime-kuma:2

Дальше добавляете HTTP(s)-монитор, указываете адрес сайта, и Kuma начинает показывать по каждому домену срок жизни сертификата в днях. Не забудьте в настройках поставить галочку для отправки уведомлений об истечении срока. 

Письма счастья отправляются в TG, Slack, Discord, на почту и в некоторые сторонние сервисы. Заодно Kuma проверяет сами сайты, поэтому одним монитором также закрываются доступность и TLS.

Минус — Kuma это отдельный сервис, который сам надо мониторить. Если у вас три домена — отличный вариант, а если триста, нужно что-то более инфраструктурное.

Способ 3. Blackbox Exporter + Prometheus + Alertmanager

Для чего: добавить мониторинг сертификатов в уже существующий Prometheus.

Взрослый вариант для тех, у кого есть Prometheus. Blackbox Exporter умеет ходить на сайты, делать полный TLS-handshake и отдавать метрику probe_ssl_earliest_cert_expiry, unix-таймстамп истечения сертификата.

Для мониторинга в prometheus.yml добавьте job с характерной перепривязкой меток, чтобы метрики подписывались адресом цели, а не адресом экспортера: 

Для мониторинга в prometheus.yml добавьте job с характерной перепривязкой меток, чтобы метрики подписывались адресом цели, а не адресом экспортера. Стандартный модуль Blackbox Exporter называется http_2xx, причем он работает и с HTTPS-адресами. Если Blackbox Exporter у вас уже настроен и модуль http_2xx есть в blackbox.yml, этот файл трогать не нужно: 

modules:

  http_2xx:

    prober: http

    timeout: 10s

    http:

      method: GET

      follow_redirects: true

      preferred_ip_protocol: ip4

Blackbox Exporter при успешном TLS-соединении отдает probe_ssl_earliest_cert_expiry с Unix timestamp окончания сертификата и probe_success со статусом всей проверки. Теперь prometheus.yml: 

global:

  scrape_interval: 30s

  evaluation_interval: 30s

rule_files:

  - /etc/prometheus/ssl-alerts.yml

alerting:

  alertmanagers:

    - static_configs:

        - targets:

            - 127.0.0.1:9093

scrape_configs:

  - job_name: blackbox-https

    metrics_path: /probe

    scrape_timeout: 15s

    params:

      module:

        - http_2xx

    static_configs:

      - targets:

          - https://site1.ru

          - https://site2.ru

    relabel_configs:

      - source_labels:

          - address

        target_label: __param_target

      - source_labels:

          - __param_target

        target_label: instance

      - target_label: address

        replacement: 127.0.0.1:9115

К слову, blackbox:9115 — пример адреса Blackbox Exporter. Если Prometheus и exporter запущены через Docker Compose, это может быть имя сервиса. Если он запущен на другой машине, соответственно, укажите ее hostname или IP.

Дальше правила. Лучше делать их три — спокойное предупреждение за месяц, тревога за три дня и отдельное на случившееся фиаско. Создаем /etc/prometheus/ssl-alerts.yml:

groups:

  - name: ssl-expiry

    rules:

      - alert: SSLExpiresIn30Days

        expr: |

          (

            probe_ssl_earliest_cert_expiry{job="blackbox-https"} - time()

          ) < (30  24  3600)

          and

          (

            probe_ssl_earliest_cert_expiry{job="blackbox-https"} - time()

          ) >= (3  24  3600)

        for: 1h

        labels:

          severity: warning

        annotations:

          summary: "У {{ $labels.instance }} сертификат протухнет через {{ $value | humanizeDuration }}"

      - alert: SSLExpiresIn3Days

        expr: |

          (

            probe_ssl_earliest_cert_expiry{job="blackbox-https"} - time()

          ) < (3  24  3600)

          and

          (

            probe_ssl_earliest_cert_expiry{job="blackbox-https"} - time()

          ) > 0

        for: 5m

        labels:

          severity: critical

        annotations:

          summary: "СРОЧНО: у {{ $labels.instance }} сертификат протухнет через {{ $value | humanizeDuration }}"

      - alert: BlackboxProbeFailed

        expr: probe_success{job="blackbox-https"} == 0

        for: 5m

        labels:

          severity: critical

        annotations:

          summary: "Сайт {{ $labels.instance }} не отвечает или TLS рукопожатие сломано"

Обратите внимание на третье правило. При неудачной TLS-проверке probe_success равен нулю. Сама метрика probe_ssl_earliest_cert_expiry появляется при получении TLS-информации, поэтому полагаться только на нее нельзя. Осталась доставка, для этого в Alertmanager заводим маршрут в TG: 

route:

  receiver: telegram

  group_wait: 30s

  repeat_interval: 24h

receivers:

  - name: telegram

    telegram_configs:

      - bot_token: "123456:ABC_токен_бота"

        chat_id: 123456789

        parse_mode: ''

        message: |

          {{ range .Alerts }}🔥 {{ .Annotations.summary }}

          Статус: {{ .Status }}

          {{ end }}

После правок конфиги лучше проверить до перезапуска через promtool check config /etc/prometheus/prometheus.yml и правила через promtool check rules /etc/prometheus/ssl-alerts.yml. А затем перечитать конфигурацию Prometheus. Если сервис работает через systemd:

sudo systemctl reload prometheus

Если reload для конкретной установки не настроен:

sudo systemctl restart prometheus

После изменения конфигурации Alertmanager ее можно перечитать через SIGHUP или /-/reload. Если в вашей установке отдельный reload не настроен, проще перезапустить сервис: 

sudo systemctl restart alertmanager

Минусы — ради трех доменов поднимать Prometheus, Blackbox Exporter и Alertmanager странно. Этот вариант хорош именно тогда, когда стек уже есть.

Способ 4. Zabbix

Для чего: мониторить сертификаты там же, где живут серверы, диски и базы.

Если инфраструктура исторически сидит на Zabbix, то проще остаться в нем. В Zabbix Agent 2 есть web.certificate.get. Он получает данные сертификата сайта, включая срок действия, после чего через шаблон можно задать порог предупреждения. 

Для этого используется макрос {$CERT.EXPIRY.WARN} — то есть сертификат становится еще одной метрикой узла. Тут же видно CPU, место на диске, доступность сервиса и сколько дней осталось до очередной маленькой катастрофы.

Минусы — поднимать целый Zabbix ради сертификатов никто в здравом уме не станет. Но если он уже есть, решение практически бесплатное.

Способ 5. Icinga Certificate Monitoring

Для чего: искать сертификаты по сети, включая те, о которых уже успели забыть.

Тут сценарий немного интереснее — Icinga Certificate Monitoring умеет сканировать указанные диапазоны адресов и портов, находить TLS-сервисы, собирать их сертификаты и показывать всё это через веб-интерфейс.

Для проверки можно задавать warning и critical как в процентах, так и обычным количеством дней. Например, можно прогнать им внутреннюю сеть и найти сертификат на старой админке, про которую никто не вспоминал.

Минусы — это уже отдельная система с базой, Icinga Web и своей настройкой. 

Способ 6. Netdata

Для чего: добавить сертификат к остальным метрикам сервера.

У Netdata есть collector x509check, который показывает оставшееся до окончания сертификата время через x509check.time_until_expiration, а также умеет отдельно проверять статус отзыва, если включить check_revocation_status. Удобно, если Netdata Agent уже установлен, и это, кстати, хороший вариант для первого VDS. 

Минусы — ставить Netdata только ради SSL такое себе решение. Агент все-таки занимается куда большим количеством метрик.

Способ 7. x509-certificate-exporter для Kubernetes

Для чего: искать истекающие сертификаты внутри Kubernetes.

Утилита x509-certificate-exporter собирает метрики X.509 из Kubernetes и может работать отдельным бинарником. Проект живой и обновлялся в 2026 году, но так как сам не пользовался, много говорить не буду.

Минусы — для обычного nginx на VDS этот инструмент просто не нужен.

Мониторинг это не продление

Мониторинг сообщает о том, какие сертификаты тухнут, но сами утилиты их не перевыпустят. Если сертификаты у вас бесплатные Let's Encrypt, настройте certbot или acme.sh с автопродлением и проверьте, что хук перезагружает nginx. 

Если же сертификат покупной, то автоматика заменяется связкой «Мониторинг + быстрый выпуск». Тут сделаю маленькое отступление — в RUVDS сертификаты теперь можно оформить в личном кабинете, без сторонних регистраторов и танцев с письмами-подтверждениями. На выбор три варианта: 

  • Single-domain с проверкой через HTML-файл, если удобнее положить файлик. 

  • Single-domain с проверкой через DNS-запись, если править файлы сайта не хочется или некому.

  • Wildcard с проверкой через DNS закрывает основной домен и все поддомены первого уровня.

Оба Single-domain по 1100 руб. по акции вместо 1300 руб., а Wildcard — 1200 руб. вместо 2400 руб. — для проекта с кучей поддоменов он удобнее пяти отдельных сертификатов. Сертификат в течение оплаченного периода будет автоматически перевыпускаться с учетом ограничений CA/B Forum. 

Что выбрать

Если у вас один сайт и вы любите скрипты — bash вам в помощь. Хочется красивую панель и уведомления за пять минут — выбирайте Uptime Kuma. Уже есть Prometheus — добавляйте Blackbox Exporter. Живете на Zabbix, Netdata или Icinga — используйте их штатные возможности. Для Kubernetes следите за сертификатами внутри секретов. Комбинировать способы тоже никто не запрещает, но настройте мониторинг, пока сертификаты свежие.

А вы как следите за сертификатами? Если пропустил хороший инструмент, кидайте в комментарии — добавлю в следующую подборку.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.