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

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

6 ответов


С openssl:

openssl x509 -enddate -noout -in file.pem

выход в форме:

notAfter=Nov  3 22:23:50 2014 GMT

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


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

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


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

вот функция bash, которая проверяет все ваши серверы, предполагая, что вы используете DNS round-robin. Обратите внимание, что это требует GNU date и не будет работать на Mac OS

function check_certs () {
  if [ -z "" ]
  then
    echo "domain name missing"
    exit 1
  fi
  name=""
  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

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


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

gcr-viewer file.pem
# or
gcr-viewer file.crt