Як визначити дату закінчення терміну дії SSL з сертифікованого коду PEM?


326

Якщо у мене є фактичний файл і оболонка Bash в Mac або Linux, як я можу запитати файл cert, коли він закінчиться? Не веб-сайт, а власне сам файл сертифіката, якщо я маю файли csr, key, pem та ланцюжок.

Відповіді:


629

З 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.

(Звичайно, передбачається, що час / дата встановлено правильно)


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
Дуже корисне спасибі. Я використовую цю кронштейн0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Матьє

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 справді набагато кращий.
Майк Q

Дуже дякую за цей кодовий фрагмент! Що дратівливе завдання :), я б хотів, щоб був OpenSl прапор одноразової позначки.
користувач1279741

1
Для тих, хто знаходиться в альпійському контейнері Linux, для вашого expiry_dateзначення потрібно буде видалити назву часового поясу з кінця. Додайте додатковий cutкінець труби, щоб зробити це:| cut -d ' ' -f 1-4
Droogans

5

Один рядок, що перевіряє справжнє / хибне, якщо термін домену закінчиться через деякий час (наприклад, 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прапори в моїй системі.


Як би ви це зробили, якби у вас не було зроблено файлів .pem, а були лише .cercerts, які ви тільки що зробили та завантажили з сайту Apple Dev?
Олексій Заватоне

1

Відповідно до прийнятої відповіді, але зауважте, що вона працює навіть з .crtфайлом, а не лише з .pemфайлом, про всяк випадок, якщо ви не в змозі знайти .pemмісцезнаходження файлу.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

Результат:

notAfter=Mar 29 06:15:00 2020 GMT

0

Якщо (з якихось причин) ви хочете використовувати GUI-додаток в Linux, використовуйте gcr-viewer(у більшості дистрибутивів він встановлюється пакетом gcr(інакше в пакеті gcr-viewer))

gcr-viewer file.pem
# or
gcr-viewer file.crt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.