启用 Nginx 对上游微服务 SSL 证书的刚性核验,必须同时配置 proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name on 四项指令,缺一不可;否则校验失败并返回 502 错误。

要启用 Nginx 对上游微服务节点 SSL 证书的严格校验(即刚性核验),核心是正确配置 proxy_ssl_verify 及其依赖项。仅设为 on 不足以生效,必须同时提供可信 CA 证书、指定验证深度,并确保上游使用的是由该 CA 签发的有效、未过期、域名匹配的证书。
开启 proxy_ssl_verify 并指定 CA 证书路径
Nginx 默认不验证上游 HTTPS 服务的证书。需在 location 或 upstream 块中显式启用并绑定根证书:
-
proxy_ssl_verify on;:启用证书链校验 -
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca.crt;:指定上游服务所用 CA 的根证书(PEM 格式),可包含多个 CA,但不能是自签名中间证书或终端证书 -
proxy_ssl_verify_depth 2;:设置证书链最大验证深度(如 root → intermediate → server,通常设为 2 或 3)
确保 upstream 使用 HTTPS 且 host 名与证书 subjectAltName 匹配
Nginx 在验证时会检查上游证书中的 subjectAltName(SAN)是否包含实际请求的域名或 IP。若 upstream 定义为 IP 地址(如 https://10.1.2.3:8443),则证书必须明确包含该 IP 的 SAN 条目;若使用域名(如 https://auth-svc.default.svc.cluster.local),证书中也需有对应 DNS 条目。
常见错误:证书仅含公网域名 api.example.com,但 upstream 指向内网 DNS 名或 IP,导致验证失败并返回 502 Bad Gateway(错误日志含 SSL_do_handshake() failed 或 certificate verification failed)。
启用 proxy_ssl_name 并显式声明期望的 SNI 和证书主体名
当 upstream 使用 IP 地址或内部域名时,Nginx 默认不会发送 SNI 或校验 SAN。需手动指定:
-
proxy_ssl_name "auth-svc.default.svc.cluster.local";:告诉 Nginx 期望上游证书的 SAN 中包含该名称(支持变量,如$host) -
proxy_ssl_server_name on;:强制在 TLS 握手时发送 SNI 扩展(必需,尤其对多租户或泛域名证书场景)
此项缺失会导致 Nginx 跳过域名匹配检查,仅做 CA 签名和有效期验证,无法实现“刚性”核验。
验证配置并排查典型失败原因
重载配置后,可通过以下方式确认行为:
- 查看 error log:开启
error_log /var/log/nginx/error.log debug;可捕获详细 TLS 握手过程(注意生产环境慎用 debug 级别) - 模拟失败场景:临时替换
trusted_certificate为错误文件,应立即报SSL_CTX_load_verify_locations() failed - 检查上游证书:用
openssl s_client -connect 10.1.2.3:8443 -servername auth-svc.default.svc.cluster.local手动验证证书链和 SAN 是否完整有效
刚性核验生效后,任何 CA 不可信、域名不匹配、证书过期或吊销的情况,Nginx 均拒绝建立连接,返回 502 并记录明确错误,不降级容忍。











