скрипт для проверки правильности SSL-сертификата

14

У меня есть несколько SSL-сертификатов, и я хотел бы получать уведомления об истечении срока действия сертификата.

Моя идея - создать cronjob, который выполняет простую команду каждый день.

Я знаю, что opensslкоманду в Linux можно использовать для отображения информации о сертификате удаленного сервера, то есть:

openssl s_client -connect www.google.com:443

Но я не вижу срока годности в этом выводе. Кроме того, я должен завершить эту команду с CTRL+ c.

Как проверить срок действия удаленного сертификата из сценария (желательно с использованием openssl) и сделать его в «пакетном режиме», чтобы он запускался автоматически без участия пользователя?

Мартин Вегтер
источник
4
Я бы также рекомендовал отправить имя сервера с -servername www.google.comсерверами с поддержкой SNI. Чтобы избежать необходимости завершения, отправьте на него / dev / null< /dev/null
syss
Если вы используете Red Hat / CentOS / Fedora, посмотрите на certmonger . Это также доступно из стандартных репозиториев.
JRFerguson
Я бы добавил проверку сертификата в инструмент мониторинга, такой как nagios или icinga.
Sebix

Ответы:

18

Теперь ваша команда ожидает http-запрос, такой как, GET index.phpнапример. Используйте это вместо:

if true | openssl s_client -connect www.google.com:443 2>/dev/null | \
  openssl x509 -noout -checkend 0; then
  echo "Certificate is not expired"
else
  echo "Certificate is expired"
fi

  • true: просто не будет вводить, после чего следует eof, так что openssl завершает работу после подключения.
    • openssl ...: команда из твоего вопроса
    • 2>/dev/null: вывод ошибок будет игнорироваться.
  • openssl x509: активирует управление данными сертификата X.509.
    • Это будет читать из стандартного ввода по умолчанию
    • -noout: Подавляет весь вывод сертификата
    • -checkend 0: проверьте, не истек ли срок действия сертификата в следующие 0 секунд
хаос
источник
-checkendнамного проще, чем сценарий, который я нашел, который делал арифметику дат!
Auspex
7

Он действительно дает вам сертификат, но не декодирует его. Так как это будет необходимо, если вы хотите дату, вы не видите ее. Итак, вам нужно передать его в x509приложение OpenSSL для декодирования сертификата:

openssl s_client -connect www.example.com:443 \
    -servername www.example.com </dev/null |\
    openssl x509 -in /dev/stdin -noout -text

Это даст вам полный декодированный сертификат на stdout, включая даты его действия.

Воутер Верхелст
источник
3

Если вам нужно проверить дату истечения срока действия, благодаря этому сообщению в блоге , нашли способ найти эту информацию с другой соответствующей информацией с помощью одного звонка:

echo | openssl s_client -servername unix.stackexchange.com -connect unix.stackexchange.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

Вывод включает эмитента, субъект (которому выдан сертификат), дату выдачи и, наконец, дату истечения срока действия :

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
subject= /C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
notBefore=May 21 00:00:00 2016 GMT
notAfter=Aug 14 12:00:00 2019 GMT
Роберт Лужо
источник