nginx 本身不支持 ssl 证书链实时监控,需结合 openssl 验证、脚本告警、主动探测及可观测工具实现闭环:验证链完整性、检查有效期、模拟客户端握手、集成 prometheus 等。

直接用 Nginx 本身无法实时监控 SSL 证书链状态,它不内置证书过期告警、链完整性检查或自动续期功能。但你可以通过组合 Nginx 配置 + 外部工具 + 脚本实现可靠监控。关键在于:把证书链验证从“运行时依赖”变成“可观测、可告警的运维项”。
确认 Nginx 加载的证书链是否完整有效
Nginx 启动或重载时只会校验证书与私钥匹配性,不会验证中间证书是否缺失或根证书是否受信。你需要主动验证:
- 用
openssl verify检查证书链文件(如fullchain.pem)是否能回溯到系统信任根:openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /path/to/fullchain.pem - 若返回
OK,说明链完整;若报unable to get issuer certificate,大概率是中间证书缺失或顺序错误。 - Nginx 的
ssl_certificate必须指向包含服务器证书 + 全部中间证书的 PEM 文件(按“服务器证书 → 中间证书”顺序),不能只放域名证书。
定期检查证书剩余有效期并触发告警
证书过期是常见故障源。用简单脚本即可监控:
- 提取证书到期时间:
openssl x509 -in /path/to/fullchain.pem -noout -enddate | cut -d= -f2- - 转为 Unix 时间戳并与当前时间比对,例如提前 15 天告警:
openssl x509 -in fullchain.pem -noout -enddate | awk '{print $4, $5, $7}' | xargs -I{} date -d "{}" +%s 2>/dev/null - 将该逻辑写入 cron 脚本,结合邮件、企业微信或 Prometheus Pushgateway 上报。
用 OpenSSL 或在线工具模拟客户端握手验证链可信度
真实客户端(如浏览器、curl)是否信任你的站点,取决于它能否用本地根证书验证整条链。Nginx 不做这步,你得代劳:
- 本地测试(模拟 Chrome/Firefox 行为):
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt - 注意加
-servername参数启用 SNI,否则可能拿到默认证书;输出含verify return:1才表示链被系统信任。 - 也可用 SSL Labs Test 或 decoder.link 进行第三方链完整性诊断,它们会明确指出“Chain issues”或“Incomplete chain”。
集成到可观测体系(推荐长期方案)
手动检查不可持续。建议接入轻量级监控栈:
- 用 cipherscan 或 Elastic Heartbeat 主动探测 HTTPS 端点,采集证书信息并上报。
- Prometheus 用户可用 ssl_exporter:它定期抓取证书,暴露
ssl_cert_not_after、ssl_cert_issuer等指标,配合 Alertmanager 实现自动告警。 - 证书自动更新(如 Certbot)后,务必 reload Nginx 并触发一次链验证,避免新证书加载失败却无感知。
不复杂但容易忽略:Nginx 只管“能不能启”,不管“客户端认不认”。真正的 SSL 健康 = 证书未过期 + 链完整 + 根可信 + Nginx 正确加载。把这四点变成自动化检查项,才算闭环。











