Как определить дату истечения срока действия сертификата SSL из сертификата, закодированного в PEM?

Если у меня есть фактический файл и оболочка Bash в Mac или Linux, как я могу запросить файл сертификата, когда он истечет? Не веб-сайт, а собственно сам файл сертификата, предполагающий, что у меня есть файлы csr, key, pem и chain.

Ответ 1

С openssl:

openssl x509 -enddate -noout -in file.pem

Вывод находится в форме:

notAfter=Nov  3 22:23:50 2014 GMT

Также см. ответ MikeW, как легко проверить, истек ли срок действия сертификата или нет, или будет ли он в течение определенного периода времени, без необходимости синтаксического анализа даты выше.

Ответ 2

Если вы просто хотите узнать, истек ли срок действия сертификата (или будет делать это в течение следующих 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.

(Конечно, предполагается, что время/дата установлены правильно)

Ответ 3

Здесь моя командная строка 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

Ответ 4

Для 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.