Nginx验证内网微服务HTTPS证书时,proxy_ssl_verify_depth必须严格匹配证书链深度:根CA为第2层时设为2,需配合proxy_ssl_verify on、仅含根证书的trusted_certificate文件及proxy_ssl_session_reuse off,否则校验失败或引入安全风险。

要让 Nginx 正确验证内网静态微服务的 HTTPS 证书,proxy_ssl_verify_depth 必须与后端证书链结构严格匹配——设小了会拒绝合法证书,设大了可能引入冗余信任风险。
先确认后端证书链实际深度
内网微服务通常使用私有 CA 签发证书。常见结构是:
根 CA → 中间 CA(一级)→ 服务证书
或更长:根 CA → 中间 CA1 → 中间 CA2 → 服务证书
用 OpenSSL 快速查看:
- openssl x509 -in service.crt -text -noout | grep "CA Issuers" 查中间证书来源
- openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout 列出完整链顺序
- 从服务证书开始向上数:服务证书算第 0 层,它上面第一个中间 CA 是第 1 层,根 CA 是第 2 层……proxy_ssl_verify_depth 应设为最大层数(即根所在层级)
在 location 块中精准配置
仅当 proxy_ssl_verify on 启用时,proxy_ssl_verify_depth 才生效。典型安全配置如下:
- proxy_ssl_verify on;
- proxy_ssl_trusted_certificate /etc/nginx/certs/internal-root-ca.pem;(只放根证书,不要拼中间证书)
- proxy_ssl_verify_depth 2;(对应“根→中间→服务”三级链)
- proxy_ssl_session_reuse off;(防 session 复用绕过校验)
注意:proxy_ssl_trusted_certificate 文件必须是纯 PEM 格式根证书,不能含私钥、不能是中间证书或服务证书;Apache 的类似参数 SSLProxyVerify require 也依赖相同逻辑,但需额外配 SSLProxyCACertificateFile。
验证是否生效的两个关键检查点
配置后别只看 Nginx 启动成功——需实测握手行为:
-
curl -v https://your-nginx-domain/api/ 观察返回是否含
SSL certificate verify ok,或失败时错误是否为unable to get local issuer certificate(说明 depth 不够或 CA 文件缺失) - 查 Nginx error log:
SSL_do_handshake() failed后若跟certificate verification failed,再结合proxy_ssl_verify_depth值反推链长度是否匹配 - 若后端证书由二级中间 CA 签发(即链长为 3),但 depth=2,则校验会在第二层中断,报错“unable to get issuer certificate”


















