ssl_verify_depth定义nginx校验客户端证书时向上追溯的最大中间ca级数,须设为实际链中中间证书数量,并配合ssl_client_certificate、ssl_verify_client on及ssl监听共同生效。

要让 Nginx 正确校验客户端证书链中子 CA(中间证书)的层级,ssl_verify_depth 必须设为实际证书链中“中间 CA 的数量”,而不是总证书数或随意拍定的值。
ssl_verify_depth 是什么
它定义 TLS 握手时,Nginx 向上追溯客户端证书签发路径的最大跳数。只算中间 CA 级别,不包含客户端终端证书本身,也不包含最终信任的根 CA(根 CA 必须出现在 ssl_client_certificate 文件里,但不计入 depth)。
- depth = 1 → 只接受“客户端证书 ← 根 CA”直签结构(极少见)
- depth = 2 → 支持“客户端证书 ← 中间 CA ← 根 CA”(主流私有 PKI 和部分商业场景)
- depth = 3 → 适用于“客户端证书 ← 子 CA1 ← 子 CA2 ← 根 CA”类三级链(如金融、政务内网)
怎么确认该设成几
不能靠猜测,得看客户端证书实际链结构:
- 用 OpenSSL 查证书详情:openssl x509 -in client.crt -text -noout | grep "CA Issuers" —— 每出现一次“CA Issuers”,通常对应一级中间 CA
- 更直观方式:openssl verify -CAfile ca-bundle.pem -untrusted intermediate.pem client.crt,若报 unable to get issuer certificate,说明链不全或 depth 不够
- 数 PEM 链文件中的证书块:终端证书 + 所有中间证书 = 完整链;depth = 中间证书数量
必须配套的三项配置
ssl_verify_depth 单独设置无效,必须与以下指令共存于同一 server 块内:
- ssl_client_certificate /path/to/ca-bundle.pem:文件里需含全部可信 CA(根 + 所有中间),顺序不限,但不能缺级
- ssl_verify_client on:启用并强制校验(设为 optional 仅调试用)
- listen 443 ssl 和 ssl_certificate /key:确保 TLS 层已启用,服务端身份可证
设错会怎样
值太小:合法客户端连接被拒,返回 HTTP 400,error.log 显示 SSL_do_handshake() failed 或 FAILED: unable to get issuer certificate。
值太大(如设为 5 或 10):可能接纳异常长链,掩盖中间 CA 配置缺失问题,削弱信任锚控制力,不推荐。











