proxy_ssl_verify真正生效需四项指令同级共存:proxy_ssl_verify on、proxy_ssl_trusted_certificate、proxy_ssl_name、proxy_ssl_server_name;缺一不可,且须配对正确证书链、深度及禁用会话复用与旧协议。

要让 proxy_ssl_verify 真正生效,构建企业级全链路安全通信,关键不是“开了就行”,而是必须形成一个闭环验证链——缺一环,Nginx 就会直接拒绝连接,返回 502 错误。
四项指令必须同处一个 location 或 upstream 块
单独写 proxy_ssl_verify on; 是无效的,它只是整个验证流程的开关,不是独立功能。以下四者必须同时存在、同级声明:
- 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 域名;若
proxy_pass写的是 IP 或变量(如https://$backend_ip),此项缺失会导致域名匹配跳过,但多数内网证书不含 IP SAN,仍会失败 -
proxy_ssl_server_name on; —— 强制 TLS 握手发送 SNI,确保后端返回与
proxy_ssl_name匹配的正确证书(尤其对接多证书网关、云负载均衡或泛域名后端时不可省)
信任证书文件必须纯净且可读
该文件是整个验证的信任锚点,格式和内容直接影响校验成败:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 仅允许 PEM 格式,每张证书以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,之间不能有空行或非证书内容 - 可拼接多个 CA 证书(根 + 中间),顺序不限,但禁止混入私钥、fullchain.pem、后端服务证书(.crt)等任何非 CA 内容
- 推荐路径:
/etc/nginx/ssl/internal-ca.pem,权限设为644,确保 nginx worker 进程能读取 - 验证方式:
openssl pkcs7 -print_certs -in /etc/nginx/ssl/internal-ca.pem -noout能正常输出证书信息即为合法
校验深度需匹配实际证书链层级
proxy_ssl_verify_depth 控制 Nginx 允许的中间 CA 级数,设错会导致合规证书被拒:
- 默认值 1:只认“终端 → 根 CA”直连结构,几乎不适用于生产环境
- 设为 2:支持常见三级链(终端 → 中间 CA → 根 CA),如 Let’s Encrypt R3
- 设为 3:适用于典型企业私有 PKI(终端 → 中间1 → 中间2 → 根 CA)
- 确定方法:
openssl s_client -connect backend.example.com:443 -servername backend.example.com -showcerts 2>/dev/null | grep "BEGIN CERTIFICATE" | wc -l,结果减 1 即为应设的 depth 值
防止校验被绕过的加固项
在缓存、连接复用或协议降级场景下,证书校验可能形同虚设,需额外配置:
- proxy_ssl_session_reuse off; —— 关闭 TLS session 复用,避免异常证书状态被缓存复用
- proxy_ssl_protocols TLSv1.2 TLSv1.3; —— 明确禁用 TLSv1.0/1.1,防止握手阶段被协议降级绕过校验
- 所有
proxy_ssl_*指令不能写在http或server块中全局生效——它们只在具体转发上下文里起作用










