如何查看 PEM 证书的过期时间
openssl x509 -in cert.pem -noout -dates 直接打印有效期起止;notAfter 即过期时间。附批量检查目录下所有证书、以及输出剩余天数的脚本。
一句话回答:openssl x509 -in 证书.pem -noout -dates 一条命令搞定——输出的 notAfter 就是过期时间(GMT 时区),notBefore 是生效时间。想只看过期时间加 -enddate,想检查是否会在某阈值内过期,用 -checkend 秒数。
基本命令
openssl x509 -in certificate.pem -noout -dates
# notBefore=Mar 20 12:00:00 2023 GMT
# notAfter=Mar 20 12:00:00 2024 GMT
只看过期时间:openssl x509 -in certificate.pem -noout -enddate
判断"还能撑多久"
-checkend N 检查证书是否在未来 N 秒内过期(正常读入时,退出码 0 = 超过该阈值仍未过期,非零 = 将过期/已过期;文件解析失败等也会非零,要保留诊断信息):
# 30 天内会过期吗?
if openssl x509 -in cert.pem -checkend 2592000 -noout; then
echo "证书在30天阈值后仍未过期(未校验域名/信任链)"
else
echo "证书可能在30天内过期,或读取/解析失败,请查看诊断"
fi
这个退出码设计非常适合写进巡检脚本和 CI 检查。
批量检查一个目录
for f in /etc/ssl/certs/*.pem; do
exp=$(openssl x509 -in "$f" -noout -enddate 2>/dev/null)
echo "$f -> $exp"
done
注意事项
- 输出时间是 GMT,换算本地时间注意时差
- 确保系统时间正确——系统时间错了,"剩余天数"判断全是错的
- 证书文件里可能有多个证书块(fullchain),
openssl x509只读第一个(站点证书);检查中间证书用openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout -text
常见问题(FAQ)
Q:能直接查远程服务器的证书过期时间吗?
A:可以,不用先下载证书:echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates。 持续检查线上证书时,也可按域名和端口配置观测云 SSL 拨测,设置剩余天数条件;续期后核对返回证书的到期时间,确认服务已加载新文件。
Q:PEM 里有私钥和证书混在一起,命令还能用吗?
A:能。openssl x509 只解析第一个证书块,私钥块会被跳过。想拆分开可参考用 openssl pkey/openssl x509 分别提取。
Q:怎么让输出变成"剩余 N 天"而不是日期?
A:以下仅适用于 GNU date(通常为 Linux),macOS 的 date 参数不同;文件解析失败要先处理,再计算:echo $(( ($(date -d "$(openssl x509 -in cert.pem -noout -enddate | cut -d= -f2)" +%s) - $(date +%s)) / 86400 )) 天。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。