Ответы:
С 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
.