Ответы:
С openssl:
openssl x509 -enddate -noout -in file.pem
Вывод находится в форме:
notAfter=Nov 3 22:23:50 2014 GMT
Также см . Ответ MikeW о том, как легко проверить, истек ли срок действия сертификата или нет, или будет ли он в течение определенного периода времени, не анализируя вышеуказанную дату.
Если вы просто хотите узнать, истек ли срок действия сертификата (или будет ли он сделан в течение следующих N секунд), -checkend <seconds>опция 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.
(Конечно, предполагается, что время / дата установлены правильно)
-nooutопцию, чтобы увидеть полезное сообщение, используя одну команду без дополнительной логики. Например, openssl x509 -checkend 0 -in file.pemвыдаст выходные данные «Срок действия сертификата истекает» или «Срок действия сертификата не истечет», указывая, истекает ли срок действия сертификата через ноль секунд.
Вот моя командная строка 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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Вот функция bash, которая проверяет все ваши серверы, при условии, что вы используете циклический перебор DNS. Обратите внимание, что это требует даты GNU и не будет работать на Mac OS
function check_certs () {
if [ -z "$1" ]
then
echo "domain name missing"
exit 1
fi
name="$1"
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
expiry_dateзначению необходимо удалить название часового пояса из его конца. Добавьте дополнительный cutк концу трубы, чтобы сделать это:| cut -d ' ' -f 1-4
Проверка одной строки на true / false, если срок действия сертификата домена истечет через некоторое время (например, 15 дней):
if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
then
echo 'good'
else
echo 'bad'
fi
Для 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.pem
macOS не понравились --date=или --iso-8601флаги в моей системе.
.cerсертификаты, которые вы только что создали и загрузили с сайта Apple Dev?
То же, что принятый ответ, но учтите, что он работает даже с .crtфайлом, а не только с .pemфайлом, на тот случай, если вы не можете найти .pemместоположение файла.
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Результат:
notAfter=Mar 29 06:15:00 2020 GMT
-startdateи-enddate, встроенные вx509утилиту. Они спасут васgrep.