首页/网络/协议速查/证书到期监控与续期策略

证书到期监控与续期策略

证书过期是最高频的「自伤式」故障:用 checkend/openssl 脚本监控剩余天数,续期后自动验证链与新到期日。

协议速查网络更新于 2026-10-13

证书到期监控是什么

证书有明确的有效期,到期后握手直接失败,表现为浏览器报错或客户端连接中断,属于最典型的「自伤式」故障。监控的目标不是看文件,而是看线上服务实际提供的证书还剩多少天;续期的目标是让证书在到期前被替换、并且被真正加载进监听进程。所以一条完整的策略包含三件事:到期预警、自动续期、续期后校验线上生效。

基本信息

监控对象公网站点、LB、CDN、网关、内网 mTLS 与邮件服务证书
本地检查openssl x509 -checkend 秒数(到期则返回非零)
线上检查openssl s_client -servername HOST -connect HOST:443 再 x509 -enddate
自动续期ACME 客户端(如 certbot)续期 + 钩子重载服务
排期建议剩余 30 天告警、14 天升级,公共证书有效期已缩短,预留足够缓冲
调度方式cron、systemd timer 或监控系统(Zabbix/Prometheus blackbox)

典型使用场景

  • 给主站与各子域配置统一的到期天数告警,避免人工翻日历
  • ACME 自动续期后自动 reload Nginx,做到无人值守换证
  • 多入口排查:CDN、LB、内网 mTLS 各有到期日,逐个纳入监控
  • 把证书剩余天数做成监控指标,纳入告警面板趋势观察
  • 变更后复核:手动换证完成后立即验证线上证书的到期日与链完整

批量监控剩余天数

批量监控剩余天数
for h in example.com api.example.com mail.example.com; do
  end=$(echo | openssl s_client -servername "$h" -connect "$h":443 2>/dev/null \
        | openssl x509 -noout -enddate | cut -d= -f2)
  days=$(( ( $(date -d "$end" +%s) - $(date +%s) ) / 86400 ))
  echo "$h: ${days} days"
done
# 单文件快速判断(30 天内到期则退出码非 0)
openssl x509 -in cert.pem -noout -checkend $((30*86400)) && echo OK || echo EXPIRING
# 校验链是否完整
openssl verify -CAfile chain.pem cert.pem

监控点与判读

监控点看什么异常表现
线上证书实际提供的证书到期日文件已换但线上仍是旧证书
证书链是否含中间证书缺失中间证书导致部分客户端校验失败
SAN 覆盖域名是否都在 SAN 内新增子域未加进证书,访问报不匹配
自动续期任务任务最近一次执行状态续期任务静默失败,直到到期才暴露
CDN/LB 证书边缘节点上的到期日源站已换,边缘未同步
自动续期与部署是两件事:续期只保证磁盘上有新证书,必须再用钩子(如 certbot 的 --deploy-hook)触发服务 reload 或分发到 CDN/LB,否则新证书不会生效。
不要把监控只放在主站:LB、CDN、网关与内网 mTLS 证书各有各的到期日,任何一处过期都可能造成大面积不可用;告警通道本身也要有冗余,避免告警没人看到。

易错点

  • 只看文件系统里的证书到期日,不去验证线上实际提供的证书,出现「已续期但仍报错」
  • 续期成功但没有重载服务或未分发到 CDN/LB,新证书不生效
  • 只监控主域名,漏掉 SAN 里新增的子域与内网 mTLS 证书
  • 告警阈值设得太靠后(如剩 3 天),遇到集群发布窗口或审批流程时来不及处理
  • 忽略中间证书链,单测文件正常但客户端因链不完整而校验失败

数据来源与参考

  • OpenSSL 文档(x509 -checkend)
  • RFC 5280 §4.1.2.5

相关工具

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