ssl_verify_depth 控制mTLS中客户端证书链向上验证的最大签发跳数,即中间CA数量;必须与实际链结构严格匹配(如终端→中间→根需设为2),并协同ssl_verify_client on、ssl_client_certificate等四项配置生效。

ssl_verify_depth 不是用来“多级轮询”的,它控制的是证书链向上验证时允许的最大签发跳数——也就是从客户端证书出发,最多能经过几级中间 CA,最终锚定到你配置的根证书。这不是循环探测,而是一次性、有向的逐级回溯。
这个值必须和你实际部署的客户端证书链结构严格一致,设小了会拒掉合法连接,设大了可能引入不可信中间签发者。
ssl_verify_depth 的真实作用范围
- 仅用于 mTLS 场景下的客户端证书校验(即
ssl_verify_client on+ssl_client_certificate) - 它不作用于 Nginx 自己的服务端证书链,也不影响后端 HTTPS 校验(那是
proxy_ssl_verify_depth的事) - 它统计的是「中间 CA 的数量」,不包含客户端终端证书,也不包含你放在
ssl_client_certificate文件里的根证书
比如:
- 客户端证书 → 根 CA(无中间)→
ssl_verify_depth 1 - 客户端证书 → 中间 CA → 根 CA →
ssl_verify_depth 2 - 客户端证书 → 中间 CA₁ → 中间 CA₂ → 根 CA →
ssl_verify_depth 3
如何确认该设多少
用 OpenSSL 直接看链结构,别猜:
# 获取客户端证书的 issuer openssl x509 -in client.crt -noout -issuer # 获取中间 CA 的 issuer openssl x509 -in intermediate.crt -noout -issuer # 获取根 CA 的 subject(应与上一级 issuer 匹配) openssl x509 -in root.crt -noout -subject
数一数从 client.crt 的 issuer 开始,到最终匹配 root.crt 的 subject,中间经过了几张证书——那就是你需要的 ssl_verify_depth 值。
必须同时生效的关键配置
单设 ssl_verify_depth 没用,以下四项缺一不可,且需写在同一个 server 块内:
-
ssl_verify_client on; -
ssl_client_certificate /path/to/ca-bundle.pem;(文件中必须含根 CA + 所有中间 CA,顺序不限) -
ssl_verify_depth 2;(按实测链长填写) -
ssl_certificate和ssl_certificate_key(Nginx 自身服务端证书)
若 ca-bundle.pem 里只放了根证书,没放中间 CA,即使 ssl_verify_depth 设为 3,Nginx 仍会在第二跳找不到签发者,报 unable to get local issuer certificate。
常见错误配置与表现
- 保留默认
ssl_verify_depth 1,但客户端证书由中间 CA 签发 → 返回400 Bad Request或 TLS 握手失败,error.log 显示SSL_do_handshake() failed -
ssl_client_certificate文件缺失某一级中间 CA → 日志提示certificate verify failed,无论 depth 设多大都无效 - 把
ssl_verify_depth误用在反向代理场景 → 完全不起作用,应改用proxy_ssl_verify_depth
不复杂但容易忽略


















