Как определить дату истечения срока действия сертификата SSL из сертификата с кодировкой PEM?
Если у меня есть фактический файл и оболочка Bash в Mac или Linux, как я могу запросить файл сертификата, когда он истечет? Не веб-сайт, а сам файл сертификата, предполагая, что у меня есть файлы csr, key, pem и chain.
6 ответов:
С
openssl:openssl x509 -enddate -noout -in file.pemвывод находится на форме:
notAfter=Nov 3 22:23:50 2014 GMTсм. Также ответ Майка для того, как легко проверить, истек ли срок действия сертификата или нет, или будет ли он в течение определенного периода времени, без необходимости разбора даты выше.
если вы просто хотите знать, истек ли срок действия сертификата (или сделает это в течение следующих N секунд), то до
openssl x509скажу вам:if openssl x509 -checkend 86400 -noout -in file.pem then echo "Certificate is good for another day!" else echo "Certificate has expired or will do so within 24 hours!" echo "(or is invalid/not found)" fiэто экономит необходимость делать сравнения даты / времени самостоятельно.
opensslвернет код выхода0(ноль) если срок действия сертификата не истек и он не будет действовать в течение следующих 86400 секунд. Если срок действия сертификата истек или уже истек - или какая-то другая ошибка, например неверный/несуществующий файл - код возврата1.(конечно, он предполагает, что время/дата установлена правильно)
вот моя командная строка bash для перечисления нескольких сертификатов в порядке их истечения, последний из которых истекает первым.
for pem in /etc/ssl/certs/*.pem; do printf '%s: %s\n' \ "$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \ "$pem" done | sortпример вывода:
2015-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem 2016-03-22: /etc/ssl/certs/CA_Disig.pem 2016-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem
вот функция bash, которая проверяет все ваши серверы, предполагая, что вы используете DNS round-robin. Обратите внимание, что для этого требуется GNU date и не будет работать на Mac OS
function check_certs () { if [ -z "" ] then echo "domain name missing" exit 1 fi name="" shift now_epoch=$( date +%s ) dig +noall +answer $name | while read _ _ _ _ ip; do echo -n "$ip:" expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 ) echo -n " $expiry_date"; expiry_epoch=$( date -d "$expiry_date" +%s ) expiry_days="$(( ($expiry_epoch - $now_epoch) / (3600 * 24) ))" echo " $expiry_days days" done }выход пример:
$ check_certs stackoverflow.com 151.101.1.69: Aug 14 12:00:00 2019 GMT 603 days 151.101.65.69: Aug 14 12:00:00 2019 GMT 603 days 151.101.129.69: Aug 14 12:00:00 2019 GMT 603 days 151.101.193.69: Aug 14 12:00:00 2019 GMT 603 days
для MAC OSX (El Capitan) эта модификация примера Николаса работала для меня.
for pem in /path/to/certs/*.pem; do printf '%s: %s\n' \ "$(date -jf "%b %e %H:%M:%S %Y %Z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%Y-%m-%d")" \ "$pem"; done | sortПример Вывода:
2014-12-19: /path/to/certs/MDM_Certificate.pem 2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pemmacOS не понравилось
--date=или--iso-8601флаги в моей системе.
если (по какой-то причине) вы хотите использовать приложение GUI в Linux, используйте
gcr-viewer(в большинстве дистрибутивов он устанавливается пакетомgcr(в противном случае в пакетеgcr-viewer))gcr-viewer file.pem # or gcr-viewer file.crt
Comments