Как узнать, когда истекает SSL-сертификат сайта
Когда SSL-сертификат истекает, сайт не исчезает. Он продолжает открываться, но каждый посетитель сначала видит во весь экран «Ваше подключение не защищено» и кнопку «Назад». Дальше нажимают немногие, а поисковые роботы и платёжные виджеты не нажимают вообще. Хорошая новость: дата окончания записана в самом сертификате, и узнать её можно за минуту.
Сроки сейчас короткие. Бесплатные сертификаты Let’s Encrypt живут 90 дней. Платные с марта 2026 года выпускаются максимум на 200 дней, а к 2029 году этот предел сократят до 47 дней. Значит, продление происходит часто, и каждое из них может не сработать.
Способ 1. В браузере
В Chrome нажмите на значок слева от адреса сайта, затем «Безопасное подключение» и «Сертификат действителен». В открывшемся окне есть строка «Действителен до». В Firefox: значок замка, «Защищённое соединение», «Подробнее», «Просмотреть сертификат», раздел «Срок действия».
Способ простой, но ручной. Вы увидите дату только тогда, когда сами решите посмотреть, и только для одного сайта.
Способ 2. Командой openssl s_client
На macOS и Linux утилита openssl уже установлена. Команда подключается к серверу так же, как браузер, и печатает даты из сертификата, который сервер отдаёт прямо сейчас:
echo | openssl s_client -connect example.ru:443 -servername example.ru 2>/dev/null \
| openssl x509 -noout -dates
Ответ выглядит так:
notBefore=Sep 2 04:11:37 2026 GMT
notAfter=Dec 1 04:11:36 2026 GMT
Нужна строка notAfter: это момент, после которого браузеры перестанут доверять сертификату. Время указано по Гринвичу.
Параметр -servername не лишний. На одном IP-адресе обычно живёт много сайтов, и сервер выбирает сертификат по имени, которое передаёт клиент (это называется SNI). Без него вы рискуете увидеть сертификат сайта-соседа или сервера по умолчанию и сделать неверный вывод.
Чтобы не высчитывать дни вручную, у openssl есть флаг -checkend. Он принимает число секунд и завершается с ошибкой, если сертификат истечёт раньше. Две недели — это 1209600 секунд:
if ! echo | openssl s_client -connect example.ru:443 -servername example.ru 2>/dev/null \
| openssl x509 -noout -checkend 1209600; then
echo "Сертификат example.ru истекает меньше чем через 14 дней"
fi
Такой скрипт можно повесить на cron и отправлять результат себе на почту. Проблема в том, что cron живёт на том же сервере, за которым должен следить: если сервер упал или его перенесли, скрипт молчит.
Если у вас есть доступ к серверу, срок можно посмотреть и в файле сертификата:
sudo openssl x509 -enddate -noout -in /etc/letsencrypt/live/example.ru/cert.pem
А certbot покажет все свои сертификаты и сколько дней осталось у каждого:
sudo certbot certificates
Но помните: файл на диске и сертификат, который видят посетители, — не всегда одно и то же. Об этом ниже.
Способ 3. Онлайн
Если терминала под рукой нет, введите адрес на странице проверки сайта. Мы подключимся к порту 443, прочитаем дату окончания и покажем, сколько дней осталось. Заодно увидите код ответа сервера и срок регистрации домена.
Почему автопродление всё-таки ломается
Certbot и встроенный ACME-клиент у хостинга обычно продлевают сертификат за 30 дней до конца. Если он всё же истёк, причина почти всегда одна из этих:
- Сайт перенесли на новый сервер, а таймер или cron-задачу certbot перенести забыли. На старом сервере всё продлевалось, на новом — некому.
- Порт 80 закрыт файрволом. Проверка HTTP-01 у Let’s Encrypt идёт именно по нему, даже если сайт работает только по HTTPS.
- Путь
/.well-known/acme-challenge/перехватывает редирект, пароль на сайт или правило в конфигурации CMS, и проверочный файл не отдаётся. - DNS перенесли к другому провайдеру, а плагин для проверки DNS-01 остался со старыми ключами доступа.
- Сертификат продлился, но веб-сервер не перечитал конфигурацию. nginx держит старый сертификат в памяти, пока его не перезагрузят. Новый файл лежит на диске, посетители видят старый, и
certbot certificatesчестно показывает 89 дней.
Последний случай самый коварный. Лечится он скриптом в каталоге /etc/letsencrypt/renewal-hooks/deploy/, например /etc/letsencrypt/renewal-hooks/deploy/reload-nginx:
#!/bin/sh
systemctl reload nginx
Файлу нужны права на запуск: sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx. Для Caddy или Apache замените nginx на свой сервер. Скрипты из этого каталога certbot выполняет после каждого успешного продления, кто бы его ни запустил: системный таймер, cron или вы руками, и не важно, с какими флагами сертификат когда-то выпускали.
Проверить, что продление в принципе пройдёт, можно заранее, ничего не меняя:
sudo certbot renew --dry-run
Как узнать заранее, а не от клиентов
Надёжнее всего проверять сертификат снаружи, с другого сервера, тем же способом, что и браузер. Именно так работает «Не упал»: раз в сутки мы подключаемся к вашему сайту, читаем дату окончания и пишем в Telegram за 14, 7, 3 и 1 день. Если продление сломалось, у вас останется две недели, чтобы спокойно разобраться, а не чинить всё в пятницу вечером.