showcert: проверяем сертификаты (без боли)

2d71aa774531611435ee45e96512889e.png

showcert — маленькая CLI утилитка, альтернатива openssl для просмотра сертификатов. Она умеет 1% того, что может openssl, но зато умеет [почти] все, что нужно в обычной админской жизни и даже немного больше чем openssl. И гораздо проще в использовании. Основные функции:

  • Взять сертификат (или цепочку) из stdin, файла (файлов) или из TLS сервиса (HTTPS, POP3S, IMAPS), в том числе через STARTTLS (для SMTP, POP3, IMAP)

  • Проверить валидность сертификата.

  • Проверить «свежесть» сертификата, и если срок действия истекает через N дней — передать это в коде завершения.

  • Распечатать сертификат (цепочку) в краткой форме (только основное), полной, в PEM формате (для сохранения в cert.pem или fullchain.pem).

И все это делается простым, интуитивно-понятным образом, для людей.

Когда я хочу проверить дату истечения, например, почтового сертификата яндекса, немного гуглю, потом сноровисто пишу что-то вроде:

$ echo | openssl s_client -connect mx.yandex.ru:25 -starttls smtp 2>&1 | openssl x509 -noout -dates

Когда я печатаю эту строчку, вспоминаю немало многокоренных слов из флотской службы, а ведь я даже не служил… А теперь, представьте, что мы хотим не просто увидеть дату, а еще и как-то что-то сделать, если до истечения останется меньше 20 дней… как будет выглядеть команда? Мне вообще сложно представить, как это можно автоматизировать через openssl и простые шелл скрипты.

Просмотр сертификатов через showcert

А теперь (после установки: pip3 install showcert) сравните с:

$ showcert mx.yandex.ru:25
Names: mx.yandex.ru mx.yandex.net
notBefore: 2022-07-25 11:16:45 (15 days old)
notAfter: 2023-01-22 20:59:59 (165 days left)
Issuer: C=BE O=GlobalSign nv-sa CN=GlobalSign RSA OV SSL CA 2018

Ну разве не проще? showcert сам (по номеру порта) догадывается, как начать STARTTLS (но конечно же, это можно переопределить через опцию -t / --starttls, например, -t no или -t imap).

Предупредить о том, что сертификат скоро протухнет? Окей!

$ showcert mx.yandex.ru:25 -qw 200 || echo PROBLEM
mx.yandex.ru:25 expires in 165 days
PROBLEM

-q — тихий режим, не печатать лишнего, только предупреждения, -w 200 — завершаться с кодом ошибки, если до протухания меньше 200 дней.

Проверить https вебсайт? showcert github.com (Несложный синтаксис?)

«Скопировать» fullchain.pem с сервера (взять его и распечатать в PEM):

$ showcert google.com --chain -o pem > fullchain.pem

У меня после этого дампа (не с гугла, а со своего другого сервера) — даже md5 файлов сошелся!

Так же можно посмотреть или проверить один или несколько локальных файлов сертификатов (fullchain.pem или cert.pem).

$ showcert fullchain.pem

Можно добавить --chain чтобы увидеть всю цепочку. И ключ -w тоже работает.

Формат вывода сертификатов

По умолчанию (-o brief) выводится краткая информация (все, что обычно важно, минимум лишнего). -o full дает полный дамп (как openssl), -o pem даст сертификат в PEM формате (удобно сделать редирект в файл и получить его на диске).

Еще есть удобный формат -o names — просто распечатывает все имена из сертификата, и его вариация -o dnames, о ней ниже.

Сахар для LetsEncrypt

Мы много используем LetsEncrypt, поэтому showcert удобен для этого. На сервере могут быть десятки (а то и сотни) сайтов, у каждого сертификат. Да, certbot renew в теории должен обновлять их, но сайты живые, постоянно разрабатываются, причем разными людьми и с ними иногда происходят разные чудеса. То поменяется DocumentRoot, то появятся правила rewrite/redirect, которые блокируют проверку, то доменное имя куда-то уедет… В общем, обновления иногда фейлятся и сертификаты протухают. А когда сайтов много, что-то проблемное случается регулярно.

Мы используем okerr (статья про okerr на хабре) для мониторинга. Наш собственный open source гибридный мониторинг. Раньше мы использовали скрипт, создавал индикатор типа sslcert для каждого сайта (это тоже не очень удобно, так как сайты ведь иногда и умирают или переезжают на другой сервер). Но с showcert стало еще проще:

Простой приятный способ проверить, что все LetsEncrypt сертификаты еще свежи:

# showcert :le -qw
/etc/letsencrypt/live/example.com/fullchain.pem expires in 19 days
/etc/letsencrypt/live/example.net/fullchain.pem expires in 19 days
# echo $?
2

Команда выше — синоним showcert /etc/letsencrypt/live/*/fullchain.pem -qw, а код : le запомнить проще, чем путь к сертификатам. Ну и код завершения удобен, чтобы использовать его в мониторинге, собственных скриптах. У нас showcert вызывается из okerrupdate/okerrmod, в окерр внешние скрипты проверки цепляются одной строчкой, но если у вас другой мониторинг — тоже сможете легко подцепить showcert.

Если не используете никакой мониторинг, то showcert: le -qw в cron раз в сутки — оповестит заранее о сертификатах, которые своевременно не смогли обновиться, и у вас будет время починить.

Еще одна опция: -o dnames печатает имена через -d, это удобно чтобы скармливать их certbot:

$ showcert -o dnames habr.ru
-d habr.ru -d www.habr.ru

Для двух имен, как у хабра — это не имеет особого смысла, но если у сертификата имен много, и вам нужно пересоздать его — вручную печатать их можно и ошибиться. Проще через showcert получить часть команды и просто использовать ее (или даже использовать сам showcert в команде:

certbot certonly --webroot /var/www/habr `showcert -o dnames habr.ru`

Попробуйте, например, showcert -o dnames google.com.

Заключение

Утилита простая, синтаксис очевидный и простой, не требует запоминания и для большинства частых админских операций — работает замечательно! Пригодна для отслеживания протухающих сертификатов (через openssl это сложнее). Без нее можно обойтись, но с ней проще.

Очень советую попробовать :-)

© Habrahabr.ru