如何查看 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
该检查只判断 notAfter,不检查 notBefore、主机名或信任链;尚未生效的证书也可能通过 checkend。
批量检查一个目录
for f in /etc/ssl/certs/*.pem; do
[ -e "$f" ] || continue
if exp=$(openssl x509 -in "$f" -noout -enddate); then
printf '%s -> %s\n' "$f" "$exp"
else
printf '读取证书失败:%s\n' "$f" >&2
fi
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(macOS 原生命令参数不同)计算:
enddate=$(openssl x509 -in cert.pem -noout -enddate) || exit 1
expires=$(date -d "${enddate#notAfter=}" +%s) || exit 1
now=$(date +%s) || exit 1
printf '%s 天\n' "$(( (expires - now) / 86400 ))"
这是按 86400 秒截断的天数,不替代证书完整有效性验证。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。