nginx实现全链路https需同时配置四项指令:proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name、proxy_ssl_server_name,缺一不可,且须置于location或upstream块内。

要让 Nginx 在反向代理中真正实现从客户端到后端服务的全链路 HTTPS 加密,关键不是只打开 proxy_ssl_verify on,而是构建一条可信、完整、不可绕过的 TLS 验证链路。它要求 Nginx 主动作为 HTTPS 客户端连接后端时,能验证证书真实性、域名匹配性、链路完整性,并与缓存、协议版本等行为协同,避免安全缺口。
必须同时配置四项核心指令
单独启用任一参数都无效,四者缺一不可,且必须同在 location 或 upstream 块内声明:
-
proxy_ssl_verify on;—— 显式开启上游证书校验(默认关闭,不写等于裸连) -
proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.pem;—— 指向仅含根 CA 和中间 CA 的 PEM 文件(不含私钥、不含后端证书) -
proxy_ssl_name "api.internal";—— 强制匹配后端证书中的 SAN 字段,尤其当proxy_pass使用 IP 或变量时不可省略 -
proxy_ssl_server_name on;—— 启用 SNI,确保握手时发送正确域名,避免后端返回默认或错误证书
证书链文件必须纯净且结构合规
信任锚点文件是整个校验的基础,格式和内容直接影响是否能通过验证:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 只允许 PEM 格式证书,每张以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间不能有空行或注释 - 应按“根 CA → 中间 CA”顺序拼接;若后端返回三级链(终端→中间→根),需确保该文件至少包含中间与根
- 禁止混入后端终端证书、私钥、
fullchain.pem或任何非 CA 内容 - 验证方式:
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 层(终端→根),多数私有或三方证书为三级链,设为 3 更稳妥 -
proxy_ssl_protocols TLSv1.2 TLSv1.3;—— 明确禁用 TLSv1.0/1.1,防止握手阶段被协议降级绕过校验 - 所有
proxy_ssl_*指令不能写在http或server块中——它们只在具体转发上下文里起作用
后端服务需配合返回完整证书链
Nginx 校验的前提是后端真实提供可验证的证书链:
- 用
openssl s_client -connect backend.internal:443 -servername backend.internal | grep "BEGIN CERTIFICATE"查看返回几段证书;至少应有两段(终端 + 中间 CA)才可能通过深度 ≥2 的校验 - 后端证书的 SAN 必须包含
proxy_ssl_name所设值,通配符*.internal不匹配svc.internal - 若使用自签名 CA,测试阶段可用,但
proxy_ssl_trusted_certificate必须已包含其根证书










