Вопрос или проблема
Это нужно для сравнения с текущим временем и определения, сколько осталось.
Я исследовал этот вопрос и, похоже, люди изобретают скрипты, которые получают дату/время в текстовом формате из вывода openssl, преобразуют это в какую-то форму для сравнения (unix timestamp). Я также узнал, что сами сертификаты содержат дату в формате unix timestamp в часовом поясе UTC.
Так в чем же дело, чтобы получить эту информацию непосредственно из сертификата, вместо того чтобы сначала преобразовывать её в формат, читаемый человеком, а затем снова преобразовывать в число?
Я не вижу такой опции в приложении openssl.
Какой самый простой способ получить количество (например) секунд до окончания срока действия сертификата, не углубляясь в такие дебри, отнимающие время и вычислительные ресурсы и требующие использования скриптов с сомнительной портативностью?
Редактировать: спасибо за комментарий. Я работаю с встроенной платформой (openwrt), там нет браузера и пользовательского интерфейса, только командная строка. Сертификаты представляют собой набор .pem файлов, хранящихся локально. Проверка будет проводиться с использованием скриптов — и результат будет отправлен в бинарном формате через другой канал для мониторинга.
Я могу выполнить команду openssl x509 -in cert.pem -enddate -noout
и затем разобрать текст, преобразовать его в число и так далее, но это, мягко говоря, некрасиво.
-enddate
по умолчанию выводит в формате rfc_822, поэтому команда GNU date
может его прочитать, если вы обрежете символы notAfter=
:
$ openssl x509 -enddate -noout -in cert.pem | cut -d = -f 2- | date +%s -f -
1868282453
Более новые версии OpenSSL поддерживают вывод в формате -dateopt iso_8601
, который как минимум алфавитно сортируемый
OpenSSL действительно имеет встроенную проверку на “секунды до истечения срока”, но это выводится в формате true/false:
$ openssl x509 -checkend 2592000 -noout -in cert.pem || echo "cert expires in 30 days!"
Ответ или решение
Чтобы определить дату окончания срока действия сертификата в формате UNIX времени (или другом числовом формате), можно использовать стандартные инструменты командной строки без необходимости сложных преобразований. Исходя из предоставленного описания, основной задачей является нахождение наиболее эффективного способа получения оставшегося времени действия сертификата, находящегося в формате PEM, на платформе OpenWRT.
Шаги для получения даты окончания срока действия сертификата в UNIX времени:
-
Извлечение даты окончания действия из сертификата:
Вам необходимо использовать команду OpenSSL для извлечения даты окончания действия сертификата в читаемом формате. Команда будет следующей:openssl x509 -in cert.pem -enddate -noout
Эта команда выведет строку вида:
notAfter=Mar 10 10:00:00 2024 GMT
-
Форматирование даты в UNIX-время:
Чтобы конвертировать эту строку в UNIX время, воспользуйтесь утилитойdate
с учетом, что необходимо обрезать частьnotAfter=
. Команда примет следующий вид:openssl x509 -in cert.pem -enddate -noout | cut -d= -f2- | date +%s -f -
Данная команда преобразует дату в количество секунд с 1 января 1970 года (формат UNIX).
-
Проверка на истечение срока действия:
OpenSSL позволяет проверить, истечёт ли срок действия сертификата через определенное количество секунд с помощью опции-checkend
. Например, чтобы проверить, истечёт ли сертификат через 30 дней (2 592 000 секунд), используйте:openssl x509 -checkend 2592000 -noout -in cert.pem || echo "cert expires in 30 days!"
Этот подход обеспечит эффективную проверку срока действия сертификатов на платформе без лишних преобразований и с минимальной нагрузкой на вычислительные ресурсы. Вдобавок, данный метод легко скриптовать для автоматического мониторинга состояния сертификатов в системе OpenWRT.