5

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

32

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

5 ответ(ов)

2

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

0

Вы можете использовать следующую команду 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

Этот метод полезен для администратора, чтобы легко отслеживать истекшие и истекающие сертификаты.

0

Команда, которую вы указали, предназначена для получения даты окончания действия сертификата 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).


Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

0

Так же, как в принятом ответе, но стоит отметить, что команда работает не только с файлами .pem, но и с .crt, на случай, если вы не можете найти файл .pem.

Вы можете использовать следующую команду для проверки даты окончания сертификата:

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Результат будет выглядеть следующим образом:

notAfter=Mar 29 06:15:00 2020 GMT

Это позволяет вам получить информацию о дате окончания действия сертификата, независимо от его формата.

0

Вот функция на 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь