Answers:
如果您只想知道证书是否已过期(或将在接下来的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
。
(当然,它假设时间/日期设置正确)
-noout
使用单个命令即可查看有用消息的选项,而无需额外的逻辑。例如,openssl x509 -checkend 0 -in file.pem
将给出输出“证书将过期”或“证书将不过期”的输出,指示证书是否将在零秒内过期。
这是我的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
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
这是一个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
expiry_date
值将需要从其末尾删除时区名称。cut
在管道的末尾添加一个附加内容,以执行以下操作:| cut -d ' ' -f 1-4
对于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
标志。
.cer
从Apple Dev站点制作并下载了证书,您将如何做?
与已接受的答案相同,但是请注意,即使您找不到文件位置,它也适用于.crt
文件,而不仅仅是.pem
文件.pem
。
openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt
结果:
notAfter=Mar 29 06:15:00 2020 GMT
-startdate
和-enddate
选项x509
。他们会为您省钱grep
。