证书到期监控是什么
证书有明确的有效期,到期后握手直接失败,表现为浏览器报错或客户端连接中断,属于最典型的「自伤式」故障。监控的目标不是看文件,而是看线上服务实际提供的证书还剩多少天;续期的目标是让证书在到期前被替换、并且被真正加载进监听进程。所以一条完整的策略包含三件事:到期预警、自动续期、续期后校验线上生效。
基本信息
| 监控对象 | 公网站点、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 证书各有各的到期日,任何一处过期都可能造成大面积不可用;告警通道本身也要有冗余,避免告警没人看到。