CLI AI

Когда истекает SSL-сертификат сайта: проверка через openssl

2026-06-27

Самый быстрый способ узнать, когда истекает SSL-сертификат — echo | openssl s_client -servername host -connect host:443 2>/dev/null | openssl x509 -noout -enddate: команда печатает точную дату notAfter, даже не открывая браузер. Дальше эту дату можно превратить в число дней, собрать проверку для cron или разом пройтись по списку доменов. Это весь рабочий процесс, а не одна команда, которую и так все знают.

1. Когда истекает сертификат сайта

clai
$ clai когда истекает сертификат cliai.tech→ echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 2>/dev/null | openssl x509 -noout -enddate -subjectnotAfter=Nov  2 10:19:50 2026 GMTsubject=CN=cliai.tech

echo | закрывает ввод, иначе s_client зависнет в ожидании интерактивного ввода. -servername задаёт SNI и обязателен, если на одном IP живёт больше одного сайта — а это почти всегда так.

2. Сколько дней осталось

clai
$ clai сколько дней осталось до истечения сертификата cliai.tech→ exp=$(echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2); echo $(( ($(date -d "$exp" +%s) - $(date +%s)) / 86400 )) days

date -d разбирает дату в формате OpenSSL, а дальше обычная арифметика в секундах. Именно это число сравнивают с порогом в мониторинге.

3. Проверка без арифметики

clai
$ clai проверь, истекает ли сертификат в ближайшие 30 дней→ echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 2>/dev/null | openssl x509 -noout -checkend 2592000 && echo "ok" || echo "expires within 30 days"

-checkend принимает секунды и возвращает код завершения, а не текст. 2592000 — это 30 суток. Готовая проверка для скрипта, разбирать вывод не нужно.

4. Список доменов разом

clai
$ clai проверь сроки сертификатов для списка доменов из файла→ while read d; do printf '%-28s ' "$d"; echo | openssl s_client -servername "$d" -connect "$d":443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2; done < domains.txt

Тот же приём в цикле. Держите domains.txt рядом со скриптом — обновлять список проще, чем править саму команду.

5. Локальный файл сертификата

clai
$ clai покажи срок действия этого файла сертификата→ openssl x509 -in /etc/ssl/certs/example.pem -noout -dates

Для файла на диске s_client не нужен вовсе. -dates покажет и notBefore, и notAfter — первое важно, когда сертификат выпущен «на будущее» и ещё не начал действовать.

6. Вся цепочка сертификатов

clai
$ clai покажи цепочку сертификатов этого сайта→ echo | openssl s_client -servername cliai.tech -connect cliai.tech:443 -showcerts 2>/dev/null | grep -E 's:|i:'

-showcerts отдаёт всю цепочку: строки s: — это subject, i: — issuer. Неполная цепочка — частая причина, почему сайт открывается в браузере, но падает в curl или мобильном приложении.

Грабли

  • Без -servername можно проверить чужой сертификат. На общем IP сервер без SNI отдаст сертификат по умолчанию, и вы измерите срок не того сайта.
  • date -d есть только в GNU. На macOS понадобится date -j -f '%b %d %T %Y %Z', формат придётся задать руками.
  • Истечение сертификата и истечение домена — разные события. Автопродление сертификата не спасёт, если просрочен сам домен или сломался ACME-челлендж.

Похожие вопросы

Как проверить сертификат на нестандартном порту? Подставьте порт в -connect, например -connect mail.example.com:993, и добавьте -starttls imap для протоколов с апгрейдом соединения.

Почему браузер показывает валидный сертификат, а curl ругается? Обычно дело в неполной цепочке: браузер догружает промежуточный сертификат сам, curl — нет. Смотрите вывод -showcerts.

Как автоматизировать оповещение? Положите вариант с -checkend в cron и отправляйте уведомление при ненулевом коде завершения. Порог в 30 дней даёт запас на разбор.

Читайте также

Не пишите openssl-простыни вручную — опишите задачу, а команду напишет CliAI. Установка одной строкой.