Можно ли проверить дату выпуска и истечения срока действия сертификатов, включенных в цепочку сертификатов, просто передав домен?
Мне надоели различные атрибуты openssl s_client, но я не могу получить необходимую информацию.
Требование:
Передайте домен (вместе с портом 443) и с помощью сценария или команды в linux выведите даты выпуска и истечения срока действия, включенные в цепочку сертификатов для домена (веб-сервера).
Ответ - да, вы можете сделать это с помощью openssl
, вы можете легко оформить это как "проверочный" скрипт, но я не знаю плагина, который уже это делает.
Сначала кешируйте сертификат сервера и всю цепочку:
echo Q | openssl s_client -connect www.google.com:443 -showcerts > chain.pem
(этот файл цепочки содержит сертификат сайта, промежуточную цепочку, а также другой мусор - это не представляет проблемы для openssl
хотя)
Если вы хотите вывести только сведения о каждом сертификате в файле цепочки:
gawk 'BEGIN { pipe="openssl x509 -noout -subject -dates -serial "} \
/^-+BEGIN CERT/,/^-+END CERT/ { print | pipe }
/^-+END CERT/ { close(pipe); printf("\n")} ' chain.pem
Добавить / опустить -serial
, -issuer
, -fingerprint
, -purpose
по желанию. Вы даже можете склеить их в одну линию с (стараясь опустить перенаправление и chain.pem
случаев):
echo Q | openssl ... | gawk ...
Если вы хотите правильно проверить цепочку, включая диапазоны дат, продолжайте читать.
Далее вытащите только сертификат сайта (первый), я воспользуюсь sed
здесь потому что я ленивый ;-)
sed -n '/-BEGIN/,/-END/p;/-END/q' chain.pem > site.pem
Затем проверьте:
openssl verify -verbose -CAfile chain.pem site.pem
Вот где колеса отрываются: Google (правильно) не предоставляет (самоподписанный) корневой ЦС в цепочке:
site.pem: /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
error 2 at 2 depth lookup:unable to get issuer certificate
Итак, потяните корневой сертификат от Geotrust, сохраните его и настройте подходящий каталог CA:
cd /usr/local/nagios/var/CA # example!
wget http://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.pem
c_rehash .
И попробуй еще раз:
openssl verify -verbose -CAfile chain.pem -CApath /usr/local/nagios/var/CA site.pem
(обратите внимание на дополнительные -CApath
параметр) и вы получите:
site.pem: OK
Теперь плохие новости, openssl
не устанавливает код возврата, указывающий на успех, неудачу или что-то полезное. Вам нужно будет обработать вывод, чтобы убедиться, что все в порядке, в основном все, кроме одной строки с «ОК», указывает на проблему. Сертификаты с истекшим сроком действия, которые вы ищете, будут отображаться как:
error 10 at 2 depth lookup:certificate has expired
(где глубина может меняться).
Примечания и предостережения:
-CApath /some/path
чтобы указать на каталог предварительно хешированных доверенных корней, как показаноchain.pem
здесь есть лишний мусор, это не проблема для openssl
Я не знаю плагина для проверки дат выпуска, но проверка даты истечения срока действия сертификатов является стандартной функцией плагин check_http.
В частности, см. Параметр -C. Как в:
./check_http -H www.google.com -C 14
OK - Certificate 'www.google.com' will expire on 09/11/2014 11:04.
Обратите внимание, что это будет работать со всем, что использует SSL (LDAPS, IMAPS и т. Д.), А не только с HTTPS.
Если вы хотите проверить сертификаты в цепочке, вы можете попробовать что-то вроде check_ssl_cert. (Я никогда не использовал его, но информация об использовании выглядит так, как будто он делает то, что вы хотите.)