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

327

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

GL2014
источник

Ответы:

630

С openssl:

openssl x509 -enddate -noout -in file.pem

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

notAfter=Nov  3 22:23:50 2014 GMT

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

тот другой парень
источник
19
У вас также есть опции -startdateи -enddate, встроенные в x509утилиту. Они спасут вас grep.
jww
2
это также работает, если файл не в формате pem. отлично работает для server.crt
смотрите
163

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

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

MikeW
источник
8
Чтобы определить, истек ли срок действия сертификата, используйте длительность ноль секунд. Опустите -nooutопцию, чтобы увидеть полезное сообщение, используя одну команду без дополнительной логики. Например, openssl x509 -checkend 0 -in file.pemвыдаст выходные данные «Срок действия сертификата истекает» или «Срок действия сертификата не истечет», указывая, истекает ли срок действия сертификата через ноль секунд.
LS
1
Спасибо! Это именно то, что мне было нужно! С кодами выхода это сделает намного меньшую / более чистую программу.
Лон Каут
24

Вот моя командная строка 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
Николай Сушкин
источник
Очень хорошо! Это то, что я был после. Теперь у меня есть обзор сертификатов, которые я должен скоро обновить. Сохранено как checkcerts.sh в моей домашней папке, чтобы я мог регулярно проверять его. Следующим шагом будет иметь работу CRON для проверки каждый месяц и по электронной почте сертификаты, которые необходимо обновить.
Пит
3
Очень полезное спасибо. Я использую этот cronjob0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Matthieu
10

Вот функция 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
Андрей
источник
удивительно, что OSX 10.13.4 запускает вашу оболочку в порядке (не судите меня, я только сегодня на OSX, чтобы отправить приложение в магазин приложений ... загрузка в ближайшее время в Linux ;-)
Скотт Стенсланд,
1
@ ScottStensland Мы судим :-P. Я часто использую Mac, но Linux действительно намного лучше.
Майк К
Большое спасибо за этот фрагмент кода! Что за досадная задача :), я хотел бы, чтобы в openssl был флаг отметки времени unixtime.
user1279741
1
Для тех из вас, кто работает в контейнере Alpine Linux, вашему expiry_dateзначению необходимо удалить название часового пояса из его конца. Добавьте дополнительный cutк концу трубы, чтобы сделать это:| cut -d ' ' -f 1-4
Droogans
5

Проверка одной строки на 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
Алексей
источник
2

Для 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флаги в моей системе.

Donald.M
источник
Как бы вы это сделали, если у вас не было файлов .pem, а были только .cerсертификаты, которые вы только что создали и загрузили с сайта Apple Dev?
Алекс Заватоне
1

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

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Результат:

notAfter=Mar 29 06:15:00 2020 GMT
Срихари Карантх
источник
0

Если (по какой-то причине) вы хотите использовать приложение с графическим интерфейсом в Linux, используйте gcr-viewer(в большинстве дистрибутивов оно устанавливается пакетом gcr(иначе в пакете gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Attila123
источник