Nginx反向代理HTTPS后端时,必须协同启用proxy_ssl_verify、proxy_ssl_trusted_certificate、proxy_ssl_name和proxy_ssl_server_name四项指令,并禁用TLS会话复用、设置合理校验深度与协议版本,才能真正实现对三方CA证书的可信校验。

要让 Nginx 在反向代理 HTTPS 后端时真正信任并校验三方(如私有 CA、内网 PKI、云厂商自建根)签发的证书,关键不是只写一行 proxy_ssl_trusted_certificate,而是构建一个完整、每次连接都真实生效的 TLS 信任链路——它必须和 proxy_ssl_verify 等指令协同,且避开缓存与复用导致的校验绕过。
信任证书文件必须纯净、结构正确
该指令指向的文件(例如 /etc/nginx/ssl/thirdparty-ca.crt)只应包含 PEM 格式的根 CA 和中间 CA 证书,按“根 → 中间”顺序拼接,每张证书以 -----BEGIN CERTIFICATE----- 开头、-----END CERTIFICATE----- 结尾,之间**不能有空行、空格或私钥内容**。
- 严禁混入:你的服务器证书(
server.crt)、终端证书(即后端服务自己的.crt)、私钥(.key)或fullchain.pem - 验证是否合法:运行
openssl pkcs7 -print_certs -in /etc/nginx/ssl/thirdparty-ca.crt -noout,能正常输出证书信息即为有效 - 推荐权限:设为
644,确保 Nginx worker 进程可读
四项核心指令必须同块启用
单独开启 proxy_ssl_verify on 会导致 502 错误;缺任一指令,校验都会静默失效或跳过。它们必须出现在同一个 location 或 upstream 块中:
-
proxy_ssl_verify on;—— 明确启用上游证书校验(默认是off) -
proxy_ssl_trusted_certificate /etc/nginx/ssl/thirdparty-ca.crt;—— 指定你信任的三方根/中间证书集合 -
proxy_ssl_name "api.example.com";—— 显式声明期望的域名,用于匹配证书中的 SAN 字段;若proxy_pass使用 IP 或变量(如https://$host),此项不可省略 -
proxy_ssl_server_name on;—— 强制发送 SNI,确保后端返回对应域名的正确证书(对接泛域名、多租户或云 API 时必需)
规避缓存与复用带来的校验失效
启用 proxy_cache 后,Nginx 可能复用 TLS session 或跳过证书重协商,导致异常证书被缓存并持续转发。需主动关闭风险行为:
-
proxy_ssl_session_reuse off;—— 禁用 TLS session 复用,保障每次连接都执行完整校验 -
proxy_ssl_verify_depth 3;—— 默认仅验 1 层(终端→直接签发者),三方证书链常含多级中间 CA,设为 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLSv1.0/1.1,防止协议降级干扰校验逻辑
与缓存策略协同的关键细节
证书校验成功不等于缓存安全。若后端证书更新或吊销,而 Nginx 缓存了旧响应,用户仍可能收到已失效的内容:
- 建议在
proxy_cache_valid中对 5xx 响应设置较短缓存时间(如500 502 503 504 1m),便于快速感知后端证书异常 - 避免在未校验成功的场景下启用缓存:确保所有校验相关指令都在
location内,而非被if或条件块包裹 - 日志中加入
$ssl_server_name和$upstream_addr,便于排查证书匹配失败的具体后端节点


















