proxy_ssl_verify_depth 的核心目标是设定证书链验证深度,值必须匹配实际层级:链长n对应depth n-1,需配合 proxy_ssl_verify on 和 proxy_ssl_trusted_certificate 等指令生效。

配置 proxy_ssl_verify_depth 的核心目标,是让 Nginx 在与后端微服务建立 mTLS 连接时,能正确验证其证书链的完整性。它不决定“是否验证”,而决定“验到哪一级”。设错会导致校验失败、连接被拒,尤其在使用中间 CA 签发证书的内网环境中极为常见。
为什么 depth 值必须匹配实际证书链层级
内网微服务通常由私有 CA 体系签发证书,结构多为:根 CA → 中间 CA → 后端服务证书。Nginx 默认只校验两级(根 → 服务),若实际链含中间 CA,就必须显式提升深度,否则校验中断,报错 SSL certificate verify error。
- 链长为 2(根 CA 直签服务证书)→
proxy_ssl_verify_depth 1 - 链长为 3(根 CA → 中间 CA → 服务证书)→
proxy_ssl_verify_depth 2 - 链长为 4(根 → 中间1 → 中间2 → 服务)→
proxy_ssl_verify_depth 3
如何确认你的证书链实际深度
不要靠猜测。用 OpenSSL 检查后端服务证书的完整链:
openssl s_client -connect backend-svc:8443 -showcerts 2>/dev/null | openssl x509 -noout -text | grep "CA Issuer"观察输出中 “CA Issuer” 字段出现的次数,或直接导出所有证书后逐级比对 issuer/subject:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- 最末级证书的 Issuer 应等于上一级证书的 Subject
- 最后一级(顶端)证书的 Subject 即为你的根 CA 名称
- 从服务证书向上追溯,数清共有几级证书,减 1 即为 depth 值
配合其他指令才能生效
proxy_ssl_verify_depth 是校验链的“长度开关”,但单独设置无效。必须与以下指令协同启用:
-
proxy_ssl_verify on—— 启用整体证书校验(默认 off) -
proxy_ssl_trusted_certificate /path/to/root-ca.pem—— 必须包含根 CA,且仅含根 CA(不含中间);若混入中间证书,可能干扰链构建 -
proxy_ssl_certificate和proxy_ssl_certificate_key—— Nginx 向后端出示自己的客户端证书,完成双向认证闭环
典型内网配置片段
假设你使用根 CA + 一级中间 CA 签发所有后端证书,Nginx 自身也持有该中间 CA 签发的客户端证书:
location /svc/ {
proxy_pass https://backend-cluster;
<pre class="brush:php;toolbar:false;">proxy_ssl_verify on;
proxy_ssl_verify_depth 2; # 关键:匹配根→中间→服务三级链
proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-root-ca.pem;
proxy_ssl_certificate /etc/nginx/ssl/nginx-client.crt;
proxy_ssl_certificate_key /etc/nginx/ssl/nginx-client.key;
proxy_ssl_name "svc.internal"; # 匹配后端证书 SAN
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
}










