如何从PEM编码证书中确定SSL证书过期date?

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

openssl

 openssl x509 -enddate -noout -in file.pem 

输出结果如下:

 notAfter=Nov 3 22:23:50 2014 GMT 

另请参阅MikeW关于如何轻松检查证书是否过期或是否在一定时间内parsing上述date的答案 。

如果你只是想知道证书是否已经过期(或者在接下来的N秒内-checkend <seconds> ), openssl x509-checkend <seconds>选项会告诉你:

 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 

这节省了自己做date/时间比较。

如果证书没有过期, openssl将返回一个0 (零)的退出码,并且在接下来的86400秒内不会这样做。 如果证书已经过期或者已经过期 – 或者其他错误(如无效/不存在的文件),则返回码为1

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

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

对于MAC OSX(埃尔卡皮坦)这个尼古拉斯的例子修改为我工作。

 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标志。