nginx 不支持后端 https 证书状态的实时监控,仅在建立连接时单次校验并报错;需结合错误日志分析、外部脚本探测、健康检查及完整 proxyssl* 配置验证校验是否真正生效。

Nginx 本身不提供对后端 HTTPS 证书校验状态的实时监控能力,比如无法直接暴露“当前证书是否即将过期”“SNI 是否匹配成功”或“CA 链验证失败次数”这类指标。它只在每次建立上游连接时执行一次校验,失败就报错(如 502 Bad Gateway),日志里留下线索,但不会持续采集、聚合或上报状态。
看错误日志定位校验失败原因
这是最直接有效的“监控”方式。Nginx 在 proxy_ssl_verify 启用后,若校验失败,会在 error log 中明确记录 SSL 握手或证书问题:
-
证书不可信:出现
SSL certificate problem: unable to get local issuer certificate→ 检查proxy_ssl_trusted_certificate路径是否正确、文件是否含对应根 CA、权限是否为 644 -
域名不匹配:出现
SSL certificate verify failed: IP address mismatch或hostname does not match→ 核对proxy_ssl_name是否与后端证书的 SAN 字段完全一致(包括大小写、通配符、www 前缀) -
SNI 未发送:后端返回默认证书导致校验失败 → 确认
proxy_ssl_server_name on;已启用且位置正确(必须在 location 或 upstream 块内) -
链深度不足:出现
certificate chain too long或验证静默失败 → 加上proxy_ssl_verify_depth 3;
用外部脚本主动探测后端证书健康度
既然 Nginx 不输出证书状态指标,就让独立脚本定期连后端,提取并分析证书信息:
- 用
openssl s_client -connect backend.example.com:443 -servername backend.example.com -showcerts获取原始证书 - 用
openssl x509 -in cert.pem -enddate -noout提取过期时间,计算剩余天数 - 检查证书 SAN 是否包含预期域名:
openssl x509 -in cert.pem -text -noout | grep -A1 "Subject Alternative Name" - 脚本可集成到 Zabbix、Prometheus(配合 blackbox_exporter + 自定义 probe)、或企业微信/钉钉告警流中
通过 HTTP 状态码和响应延迟间接感知异常
Nginx 健康检查(health_check 指令)虽不验证书,但能反映底层连接是否通畅:
- 若后端 HTTPS 服务因证书问题拒绝 TLS 握手,Nginx 会连接失败,健康检查标记为 down
- 搭配
proxy_next_upstream error timeout http_502;可实现自动故障转移 - 注意:默认健康检查不触发完整 SSL 校验流程;要真正触发 proxy_ssl_verify 行为,需确保 health_check 请求也走相同 location 配置(即包含全部四项 proxy_ssl_* 指令)
避免“伪正常”:确认校验真正在生效
很多人配置了 proxy_ssl_verify on; 就以为万事大吉,其实它极易静默失效:
- 检查是否漏配其他三项:
proxy_ssl_trusted_certificate、proxy_ssl_name、proxy_ssl_server_name on—— 缺一就会退化为不校验,或直接 502 - 确认这些指令写在
location或upstream块内,而非http或server块(全局声明无效) - 临时设
proxy_ssl_verify off;测试:若此时请求恢复,说明之前的问题确实在证书校验环节











