必须配置 proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name 和 proxy_ssl_server_name 四项指令,缺一不可;否则校验失败返回502错误,且所有指令须在 location 或 upstream 块内声明。

要让 Nginx 在反向代理时真正校验后端 HTTPS 服务的证书有效性,关键不是只打开 proxy_ssl_verify on,而是构建一个闭环、可验证、不绕过的 TLS 验证链路。它面向的是企业内部微服务、私有云 API 或自建 PKI 环境,目标是杜绝中间人攻击、证书过期误用和域名错配等风险。
必须协同生效的四个核心指令
单独设置任一参数都无效,四者缺一不可,且必须同在 location 或 upstream 块内声明:
-
proxy_ssl_verify on; —— 启用上游证书校验开关(默认是
off,不显式开启等于完全不校验) - proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.pem; —— 指向企业私有根 CA 或中间 CA 的 PEM 文件,仅含证书,不含私钥或后端终端证书
- proxy_ssl_name "svc.internal.company.com"; —— 显式匹配后端证书中的 SAN 字段,避免因使用 IP 或变量导致域名校验失败
- proxy_ssl_server_name on; —— 强制 TLS 握手发送 SNI,确保后端能返回对应域名的正确证书(尤其对接多证书网关或云负载均衡时)
信任证书文件的硬性要求
该文件是整个验证的信任锚点,格式和内容必须严格合规:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 只允许 PEM 格式的根 CA 和中间 CA 证书,按任意顺序拼接,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾 - 禁止混入私钥、后端服务的
.crt、fullchain.pem或任何非证书内容 - 推荐路径:
/etc/nginx/ssl/internal-ca.pem,权限设为644,确保 nginx worker 进程可读 - 验证方式:
openssl pkcs7 -print_certs -in /etc/nginx/ssl/internal-ca.pem -noout应能正常输出证书信息
防止校验被绕过的关键加固项
企业级链路中,缓存、连接复用或协议降级都可能让证书校验形同虚设:
- 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,防止握手阶段被协议降级绕过校验
- 所有
proxy_ssl_*指令不能写在http或server块中全局生效——它们只在具体转发上下文里起作用
调试与验证是否真正生效
配置完成后,不能只看请求是否通,要确认校验逻辑真实触发:
- 临时提升日志级别:
error_log /var/log/nginx/error.log debug;,观察是否有SSL_do_handshake() failed或certificate verify failed类错误 - 用 OpenSSL 模拟 Nginx 行为:
openssl s_client -connect backend.internal:443 -servername svc.internal.company.com -CAfile /etc/nginx/ssl/internal-ca.pem,比对输出中的Verify return code是否为 0 - 检查后端实际返回的证书链是否完整:运行
openssl s_client -connect backend.internal:443 -servername svc.internal.company.com -showcerts,确认输出中包含全部必要证书

















