Nginx反向代理HTTPS后端时需启用proxy_ssl_verify等四项指令并禁用TLS复用,配合纯净CA证书链与缓存策略协同,确保每次连接真实校验证书。

要让 Nginx 在反向代理 HTTPS 后端时真正验证其证书,并将该能力融入缓存链路(如配合 proxy_cache),关键不是单独配置 proxy_ssl_trusted_certificate,而是构建一个完整、可信、可复用的 TLS 验证上下文——它必须与缓存行为兼容,且不因连接复用或证书缓存导致校验失效。
信任锚点文件必须纯净且结构正确
proxy_ssl_trusted_certificate 指向的文件是整个校验的信任起点,它只应包含 PEM 格式的根 CA 和中间 CA 证书,按“根 → 中间1 → 中间2”顺序拼接,每张证书以 -----BEGIN CERTIFICATE----- 开头、-----END CERTIFICATE----- 结尾,之间不能有空行或额外字符。
- 禁止混入私钥、终端证书(即后端自己的
.crt或fullchain.pem) - 推荐路径:
/etc/nginx/ssl/upstream-ca.crt(独立存放,权限设为644) - 验证方式:
openssl pkcs7 -print_certs -in /etc/nginx/ssl/upstream-ca.crt -noout能正常输出证书信息即为合法
四项指令必须同时启用,缺一不可
仅开启 proxy_ssl_verify on 会导致 502 错误;缓存链路中若跳过任一环节,可能命中旧 session 或绕过校验。以下四者需在同一个 location 块内声明:
-
proxy_ssl_verify on;—— 启用上游证书校验开关 -
proxy_ssl_trusted_certificate /etc/nginx/ssl/upstream-ca.crt;—— 指定信任锚点 -
proxy_ssl_name "api.example.com";—— 显式匹配证书 SAN,尤其当proxy_pass使用变量或 IP 时不可省略 -
proxy_ssl_server_name on;—— 确保发送 SNI,对接云服务、泛域名或 mTLS 后端时必需
缓存链路中需规避会绕过校验的风险行为
启用 proxy_cache 后,Nginx 可能复用 TLS session 或缓存响应体,但证书校验必须每次连接都真实执行。以下配置可防止校验被跳过:
-
proxy_ssl_session_reuse off;—— 关闭 TLS session 复用,避免缓存异常证书状态 -
proxy_ssl_verify_depth 3;—— 默认只验 1 层(终端→根),多数三方服务返回终端+一级中间证书,设为 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 禁用 TLSv1.0/1.1,防止协议降级攻击干扰校验逻辑 - 不要在
http或server块中全局设置这些proxy_ssl_*指令——它们只在具体location或upstream上下文中生效
与缓存策略协同的关键实践
证书校验成功只是第一步;要让缓存链路真正安全可靠,还需确保:
- 后端返回的响应头中不含敏感信息(如
Set-Cookie、Authorization),否则不应缓存;可用proxy_cache_bypass $http_authorization控制 - 对校验失败的响应(如 502)不进入缓存:添加
proxy_cache_valid 502 0; - 若使用
proxy_cache_use_stale error timeout updating,需确认error不包含证书校验失败场景(实际由 OpenSSL 抛出,属连接层错误,通常已触发 502) - 日志中建议记录校验结果:通过
$upstream_ssl_subject和$upstream_ssl_protocol辅助排查











