Самый быстрый способ узнать, когда истекает SSL-сертификат — echo | openssl s_client -servername host -connect host:443 2>/dev/null | openssl x509 -noout -enddate: команда печатает точную дату notAfter, даже не открывая браузер. Дальше эту дату можно превратить в число дней, собрать проверку для cron или разом пройтись по списку доменов. Это весь рабочий процесс, а не одна команда, которую и так все знают.
1. Когда истекает сертификат сайта
$ 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 сколько дней осталось до истечения сертификата 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 проверь, истекает ли сертификат в ближайшие 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 проверь сроки сертификатов для списка доменов из файла→ 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 покажи срок действия этого файла сертификата→ openssl x509 -in /etc/ssl/certs/example.pem -noout -dates
Для файла на диске s_client не нужен вовсе. -dates покажет и notBefore, и notAfter — первое важно, когда сертификат выпущен «на будущее» и ещё не начал действовать.
6. Вся цепочка сертификатов
$ 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 дней даёт запас на разбор.
Читайте также
- Измерение задержки API через curl
- Проверка, открыт ли порт на удалённом сервере
- Сетевая диагностика по-человечески
Не пишите openssl-простыни вручную — опишите задачу, а команду напишет CliAI. Установка одной строкой.