Сертификат сайта истёк в самый неудобный день: пять проверок срока и цепочки, которые занимают пять минут
Просроченный сертификат чинится за минуты, если заранее знать, где смотреть срок, цепочку и автопродление.
Сертификат (файл, которым сайт доказывает браузеру, что он тот, за кого себя выдаёт) выдаётся на ограниченный срок. Когда срок кончается, браузер показывает посетителю страшную страницу с предупреждением, а API-клиенты и мобильные приложения просто перестают соединяться. Для интернет-магазина или сервиса с оплатой это такой же простой, как падение сервера, только причина банальнее.
Все проверки ниже делаются утилитой openssl, она есть почти на любом Linux-сервере и в macOS. Описание опций — в документации OpenSSL. Каждая команда прогнана в изолированной песочнице на OpenSSL 3.5.7 с тестовым сертификатом.
Срок нужно смотреть у того, что отдаёт сервер, а не у файла на диске
Частая ситуация: на диске лежит свежий сертификат, продление отработало, а веб-сервер его не перечитал и отдаёт старый. Поэтому первая проверка — снять сертификат с живого хоста:
s_client подключается к серверу, -servername передаёт имя сайта (по нему сервер выбирает, какой сертификат отдать, а на одном IP часто живёт много сайтов), а x509 печатает владельца, выпустившего центр и даты начала и конца. В выводе нужна строка notAfter — это последний день действия.
Если нужна только дата окончания у файла, хватит openssl x509 -in cert.pem -noout -enddate. Но это именно файл: что реально отдаёт сервер, он не покажет.
Для скрипта и мониторинга нужен код выхода, а не текст
Опция -checkend принимает число секунд и отвечает кодом выхода: ноль, если сертификат не истечёт за это время, и не ноль, если истечёт. Так можно проверять «осталось ли хотя бы 30 дней» (2 592 000 секунд):
В тесте на сертификате с 20 днями до конца команда вернула код 1 и напечатала renew, а с порогом в сутки — код 0. В cron и мониторинге смотреть нужно на код выхода, не на текст.
Цепочка ломается тише, чем срок
Сайту нужен не один сертификат, а цепочка: сертификат сайта, промежуточный сертификат центра сертификации и корневой, который уже лежит в системе или браузере. Если сервер забыл отдать промежуточный, часть клиентов откажется доверять сайту, хотя срок в порядке. Команда s_client с ключом -showcerts покажет, что именно прислал сервер и в каком порядке, но документация прямо предупреждает: это не проверенная цепочка.
Проверить саму цепочку и заодно имя можно так:
-untrusted подкладывает промежуточные сертификаты для сборки цепочки, но доверия им не даёт. В тесте с правильным именем вывод был cert.pem: OK. С чужим именем команда падала с hostname mismatch, а без промежуточного — с unable to get local issuer certificate; в обоих случаях код выхода 2.
Список имён: на какой домен выдан сертификат
Сертификат на example.com не защитит www.example.com, если второго имени нет в списке. Посмотреть список можно так:
Строки DNS: в выводе — все имена, на которые сертификат действует. Забытый поддомен — частая причина ошибки после переезда или добавления нового сервиса.
Срок жизни сертификатов сокращается, ручное продление не переживёт
Let's Encrypt опубликовал график сокращения: 13 мая 2026 года необязательный профиль tlsserver переходит на сертификаты на 45 дней, 10 февраля 2027 года профиль classic — на 64 дня, а 16 февраля 2028 года — на 45. Центр советует использовать ACME Renewal Information (механизм, в котором центр сам подсказывает клиенту, когда продлевать). Если клиент его не поддерживает, продлевать нужно примерно на двух третях срока жизни, а зашитый в скрипт интервал в 60 дней перестанет работать. Ручное продление там не рекомендуют и просят настроить оповещения на случай, если продление не случилось.
Что проверить у себя
- Снять сертификат с боевого адреса через s_client и сверить notAfter с календарём, а не с файлом на диске.
- Убедиться, что после продления веб-сервер перечитал сертификат: дата в выводе s_client должна измениться.
- Поставить в мониторинг или cron проверку -checkend с запасом хотя бы в 30 дней и алерт на ненулевой код выхода.
- Проверить, что сервер отдаёт промежуточный сертификат, а openssl verify с -verify_hostname проходит.
- Сверить список subjectAltName со всеми доменами и поддоменами, которые должны открываться по HTTPS.
- Выяснить, чем продлевается сертификат и умеет ли клиент ARI; если интервал продления зашит числом дней, пересмотреть его до перехода на короткие сроки.
Разборы аварий и практику для админов публикуем в Telegram-канале «Полный Ops».