Nginx校验后端HTTPS节点证书合法性需启用proxy_ssl_verify on,并配合proxy_ssl_trusted_certificate、proxy_ssl_name、proxy_ssl_server_name及proxy_ssl_verify_depth等指令构建完整TLS链路校验,确保后端返回含终端与中间CA的完整证书链且SAN匹配指定域名。

要让 Nginx 真正校验后端负载均衡节点(如多个 HTTPS 微服务实例)的证书合法性,不能只写 proxy_ssl_verify on,必须构建完整、可信、可验证的 TLS 链路。核心是:Nginx 主动连接上游时,必须确认对方身份真实、证书未过期、域名匹配、链路可信。
确保后端节点自身支持 HTTPS 并返回完整证书链
全链路校验的前提是后端已启用 TLS,并正确配置证书。常见错误是后端只返回终端证书,不附带中间 CA:
- 用
openssl s_client -connect backend.example.com:443 -servername backend.example.com | grep "BEGIN CERTIFICATE"查看返回几段证书;至少应有两段(终端 + 中间 CA)才可能通过深度为 2 的校验 - 后端证书的 SAN 字段必须包含 Nginx 将用于校验的域名(如
api.internal),通配符*.internal不匹配svc.internal - 禁用自签名证书直接上线;测试阶段可用,但需确保
proxy_ssl_trusted_certificate已含其根证书
在 upstream 或 location 块中声明完整校验指令组
所有 proxy_ssl_* 指令必须出现在具体转发上下文中(upstream 或 location),全局设置无效。典型安全组合如下:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
proxy_ssl_verify on;—— 明确启用校验(默认off,不开启等于裸连) -
proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.pem;—— 指向仅含 PEM 格式根 CA 和中间 CA 的文件(不含私钥、不含终端证书) -
proxy_ssl_name "api.internal";—— 强制匹配证书中的 SAN,尤其当proxy_pass使用 IP 或变量时不可省略 -
proxy_ssl_server_name on;—— 启用 SNI,确保握手时发送正确域名,避免后端返回默认或错误证书 -
proxy_ssl_verify_depth 2;—— 多数商业证书为“终端→中间→根”三级链,设为 2 或 3 才能覆盖;设为 1 会因链过长直接报 502
加固代理行为,防止绕过与信息泄露
校验机制本身也可能被弱配置削弱:
- 关闭会话复用:
proxy_ssl_session_reuse off;,避免缓存异常 session 导致后续请求跳过证书重校验 - 限制可信来源头:
set_real_ip_from 10.0.0.0/8;+real_ip_header X-Forwarded-For;,防止伪造客户端 IP - 明确传递协议:
proxy_set_header X-Forwarded-Proto $scheme;,让后端知悉原始是 HTTPS - 隐藏敏感头:
proxy_hide_header Server;、proxy_hide_header X-Powered-By;,减少指纹暴露
验证是否生效与常见故障定位
配置后 reload,观察 error.log 和实际响应:
- 成功表现:请求正常返回,日志无
certificate verify failed或SSL_do_handshake() failed - 失败典型原因:
proxy_ssl_trusted_certificate文件路径错或权限不足(Nginx worker 进程需可读)、证书链拼接顺序错误(应根→中间)、proxy_ssl_name与 SAN 大小写或格式不一致 - 临时开启调试:
error_log /var/log/nginx/error.log debug;,查看 TLS 握手细节(注意仅临时启用,避免日志爆炸)










