首页/安全/安全加固速查/证书有效期批量核查

证书有效期批量核查

证书到期是线上最高频事故:体检把“剩余天数”列为必填字段,剩余 30 天内进入续期清单。

安全加固速查安全更新于 2026-10-13

证书到期为什么总是事故

TLS 证书带明确到期时间,客户端校验链路时发现过期会直接中断连接:浏览器提示不安全,App 报网络异常。近年公网证书有效期被持续压缩(主流 CA 多为 90~398 天),内网自签证书却动辄三五年,两类都必须进台账,靠人脑记到期日已经不可行。

基本信息

适用平台Linux/macOS/WSL(OpenSSL 1.1.1+)
检查对象公网 HTTPS、内网服务、负载均衡与网关证书
判读阈值剩余<30 天进续期清单,<7 天按紧急处理
建议频率每周巡检一次,变更后立即复检

典型使用场景

  • 到期前的批量盘点:一次拉出全部站点剩余天数,排出续期顺序
  • 证书轮换后的验收:确认新证书已下发、旧证书已摘除、证书链完整
  • 排查部分用户报证书错误:判断是 SNI 拿错证书还是中间链缺失
  • 非网站场景巡检:负载均衡、K8s Ingress、数据库与消息中间件的监听证书
  • 审计留档:按域名、颁发者、到期日、剩余天数、自动续期状态成表

核查命令

核查命令
# 探公网站点证书,-servername 指定 SNI,避免取到默认虚拟主机证书
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
# 直接算剩余天数,便于批量出报告
end=$(echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
echo $(( ( $(date -d "$end" +%s) - $(date +%s) ) / 86400 ))
# 本地证书文件:Let's Encrypt 与系统证书库
find /etc/letsencrypt/live -name fullchain.pem 2>/dev/null | head
for f in /etc/pki/tls/certs/*.pem; do echo "$f"; openssl x509 -noout -enddate -in "$f" 2>/dev/null; done | head -20

输出逐列读法

字段含义异常表现
subject证书主体(CN 与 SAN 域名)与目标域名不符,说明拿到默认站点或 SNI 未生效
issuer签发者自签或未知 CA,客户端链校验必失败
notBefore生效时间晚于当前时间,说明机器时钟错乱或证书提前签发
notAfter到期时间剩余不足 30 天要排期,已过期则连接直接中断
剩余天数自算字段出现负数即已过期,出现小数说明分母用了秒差

自动续期自检

自动续期自检
certbot renew --dry-run                  # 演练续期,不真正签发
systemctl list-timers | grep -i certbot   # 确认续期定时器仍在跑
nginx -t && systemctl reload nginx        # 续期后重载才加载新证书
报告固定五列最省事:域名、颁发者、到期日、剩余天数、是否已开自动续期。数值口径先在团队内对齐,避免同一批站点两个人算出不同剩余天数。
自动续期只解决签发,不解决加载:证书更新后服务未重新读取,客户端拿到的仍是旧证书,报错照旧。续期后必须比对服务实际下发的指纹。
内网自签与公网证书分开盘点:两者到期时间、责任人与续期方式完全不同,混在一张表里最容易漏整改。

易错点

  • 漏写 -servername:共享 IP 上会取到别的站点证书,算出的到期时间是错的
  • 只盯 443:SMTPS、LDAPS、gRPC 等非标准端口同样会因证书过期中断,清单要带端口列
  • 把续期成功当完成:签发成功但服务未重载,客户端仍拿到旧证书
  • 巡检表没有责任人列:到期前无人跟进,等于把事故留给值班同事

数据来源与参考

  • 等保 2.0:数据完整性
  • 运维实践:证书巡检

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌