如何从PEM编码的证书中确定SSL证书的到期日期?

时间:2014-01-23 01:55:20

标签: bash ssl openssl certificate

如果我在Mac或Linux中有实际文件和Bash shell,我如何查询cert文件何时到期?假设我有csr,key,pem和chain文件,这不是一个网站,而是一个证书文件本身。

9 个答案:

答案 0 :(得分:500)

使用openssl

openssl x509 -enddate -noout -in file.pem

输出格式为:

notAfter=Nov  3 22:23:50 2014 GMT

另请参阅MikeW's answer,了解如何轻松检查证书是否已过期,或者是否在一定时间内,无需解析上述日期。

答案 1 :(得分:131)

如果您只想知道证书是否已过期(或将在接下来的N秒内完成),-checkend <seconds>的{​​{1}}选项会告诉您:

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(零),并且在上面的示例中,将不会在接下来的86400秒内返回退出代码。如果证书已过期或已经过期 - 或者其他错误,如无效/不存在的文件 - 返回码为0

(当然,它假定时间/日期设置正确)

答案 2 :(得分:14)

这是我的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

答案 3 :(得分:6)

这是一个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

答案 4 :(得分: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标志。

答案 5 :(得分:1)

与已接受的答案相同,但是请注意,即使您无法找到.crt文件的位置,它也适用于.pem文件,而不只是.pem文件。 / p>

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

结果:

notAfter=Mar 29 06:15:00 2020 GMT

答案 6 :(得分:0)

如果(由于某种原因)您想在Linux中使用GUI应用程序,请使用gcr-viewer(在大多数发行版中,它由程序包gcr安装(否则在程序包gcr-viewer中) )

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

答案 7 :(得分:0)

一行检查真/假(如果证书在以后的某个时间(例如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

答案 8 :(得分:0)

我制作了一个与此相关的bash脚本,以检查证书是否过期。您可以根据需要使用相同的内容。

脚本

https://github.com/zeeshanjamal16/usefulScripts/blob/master/sslCertificateExpireCheck.sh

自述文件

https://github.com/zeeshanjamal16/usefulScripts/blob/master/README.md