ssl_verify_depth 控制Nginx验证客户端证书时允许的最大中间CA层数,必须配合ssl_verify_client on和ssl_client_certificate使用;默认值1仅支持根CA直签,含中间CA的链需设为2或3。

ssl_verify_depth 控制的是 Nginx 在验证客户端证书(即 TLS 双向认证中对方提交的证书)时,允许向上追溯签发者证书的最大层数。它不作用于后端服务证书校验(那是 proxy_ssl_verify_depth 的职责),而是专用于 ssl_client_certificate + ssl_verify_client 场景。
它到底在验证什么
当客户端发起 mTLS 连接并提供证书时,Nginx 需确认该证书可信。可信意味着:它必须能通过一条完整、可信的签名链,最终回溯到你配置的根 CA 证书。这条链可能是:
- 客户端证书 → 根 CA(1 层,depth = 1 即可)
- 客户端证书 → 中间 CA → 根 CA(2 层,depth 至少为 2)
- 客户端证书 → 中间 CA₁ → 中间 CA₂ → 根 CA(3 层,depth 至少为 3)
ssl_verify_depth 就是限制这个“→”最多能出现几次。值为 2,表示最多允许 2 级中间签发者,即整条链最多含 3 张证书(终端 + 2 中间 + 根)。
默认值为什么容易出错
默认值是 1,含义很关键:
- depth = 0:只接受自签名证书(客户端自己当 CA)
- depth = 1:客户端证书必须由你指定的 CA(ssl_client_certificate 所指文件中的证书)直接签发;不允许任何中间 CA
现实中,企业私有 PKI 或云厂商颁发的客户端证书,几乎都经由中间 CA 签发。若仍用默认 1,即使 CA 文件里放了根和中间证书,Nginx 也会拒绝——因为它只查一级,找不到“中间 CA 直签客户端证书”的记录,就报 certificate verify failed。
如何正确设置值
取值应等于证书链中中间 CA 的数量(不含根 CA):
- 客户端证书由根 CA 直签 → 设为 1
- 客户端证书由 1 级中间 CA 签发(该中间 CA 由根 CA 签)→ 设为 2
- 客户端证书由 2 级中间 CA 签发(中间→中间→根)→ 设为 3
注意:ssl_client_certificate 指定的 PEM 文件中,必须包含整条信任链所需的所有中间 CA 和根 CA 证书(顺序不限,但不能缺失)。只放根 CA 是不够的。
必须配合的关键指令
单独设 ssl_verify_depth 不起作用,以下四项需同时存在且位置正确(通常在 server 块内):
- ssl_verify_client on; —— 明确开启客户端证书强制校验
- ssl_client_certificate /path/to/ca-chain.pem; —— 提供完整可信证书链(PEM 格式,多个证书可拼在一起)
- ssl_verify_depth 2; —— 匹配实际链长
- ssl_certificate /path/to/server.crt; 和 ssl_certificate_key /path/to/server.key; —— Nginx 自身的服务端证书,用于建立 TLS 连接
若漏掉 ssl_verify_client on,或 ssl_client_certificate 路径错误/不可读/内容不全,无论 depth 设多大,都会静默失败或返回 400 错误。


















