Как узнать дату истечения SSL-сертификата из закодированного в PEM сертификата?
Я имею на руках файл сертификата и использую Bash-оболочку в Mac или Linux. Как я могу проверить, когда этот сертификат истечет? Я говорю не о веб-сайте, а о самом файле сертификата, предполагая, что у меня есть файлы csr, key, pem и chain.
5 ответ(ов)
Если вы просто хотите узнать, истек ли сертификат (или истечет ли он в течение следующих N секунд), команда -checkend <seconds>
для openssl x509
поможет вам:
if openssl x509 -checkend 86400 -noout -in file.pem
then
echo "Сертификат действителен еще день!"
else
echo "Сертификат истек или истечет в течение 24 часов!"
echo "(или недействителен/не найден)"
fi
Это избавляет вас от необходимости самостоятельно делать сравнения дат/времени.
openssl
вернет код выхода 0
(ноль), если сертификат не истек и не истечет в течение следующих 86400 секунд, как в приведенном выше примере. Если сертификат истек или истечет, либо возникла другая ошибка, такая как недействительный/несуществующий файл, код возврата будет 1
.
(Конечно, это предполагает, что время/дата выставлены правильно)
Имейте в виду, что в старых версиях openssl существует ошибка, из-за которой, если время, указанное в checkend
, слишком велико, всегда будет возвращаться 0
(https://github.com/openssl/openssl/issues/6180).
Вы можете использовать следующую команду 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
В этом скрипте для каждого .pem
файла в директории /etc/ssl/certs/
выполняется команда openssl
для получения даты окончания сертификата. Затем эта дата форматируется в ISO-8601 и выводится вместе с полным путем к файлу сертификата. В конечном итоге, вывод сортируется, что позволяет вам увидеть сертификаты в порядке их истечения.
Пример вывода:
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
Этот метод полезен для администратора, чтобы легко отслеживать истекшие и истекающие сертификаты.
Команда, которую вы указали, предназначена для получения даты окончания действия сертификата X.509. Вот перевод вашего вопроса в стиле ответа на StackOverflow:
Чтобы узнать дату окончания действия сертификата X.509, вы можете использовать команду openssl
в комбинации с cat
. Используйте следующую команду, заменив {key_name}
на имя вашего файла сертификата:
cat {key_name} | openssl x509 -noout -enddate
Например, если у вас есть файл сертификата с именем tower.cert
, команда будет выглядеть так:
cat tower.cert | openssl x509 -noout -enddate
Результатом выполнения этой команды будет строка, содержащая дату окончания действия сертификата, например:
notAfter=Dec 7 04:03:32 2023 GMT
Это означает, что сертификат истекает 7 декабря 2023 года в 04:03:32 по всемирному времени (GMT).
Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!
Так же, как в принятом ответе, но стоит отметить, что команда работает не только с файлами .pem
, но и с .crt
, на случай, если вы не можете найти файл .pem
.
Вы можете использовать следующую команду для проверки даты окончания сертификата:
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
Результат будет выглядеть следующим образом:
notAfter=Mar 29 06:15:00 2020 GMT
Это позволяет вам получить информацию о дате окончания действия сертификата, независимо от его формата.
Вот функция на Bash, которая проверяет все ваши серверы, предполагая использование DNS round-robin. Обратите внимание, что для ее работы требуется GNU date, поэтому она не будет функционировать на Mac OS.
function check_certs () {
if [ -z "$1" ]
then
echo "отсутствует имя домена"
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 дней"
done
}
Пример вывода:
$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT 603 дней
151.101.65.69: Aug 14 12:00:00 2019 GMT 603 дней
151.101.129.69: Aug 14 12:00:00 2019 GMT 603 дней
151.101.193.69: Aug 14 12:00:00 2019 GMT 603 дней
Эта функция проверяет сертификаты SSL для каждого IP-адреса, связанного с указанным доменным именем. Если не указать имя домена, она выведет сообщение об ошибке и завершит выполнение. Результат показывает дату истечения сертификата и оставшиеся до истечения дни для каждого IP.
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?
Как создать файл в Linux из терминала? [закрыто]
Автоматический вход в Docker через Bash-скрипт