SSLVerifyDepth 设定 Apache 验证证书链时允许的最大中间 CA 层数,防止过深不可信链被误认;内网多层私有 PKI(如终端→二级CA→一级CA→根CA)需设为3等匹配层级,过高削弱安全、过低导致拒绝合法证书,必须配合 SSLVerifyClient require 和 SSLCACertificateFile 等指令生效。

SSLVerifyDepth 控制 Apache 验证客户端或后端证书时,允许的最大证书链长度(即从终端证书到可信根 CA 之间最多能有多少级中间 CA)。它不决定“必须几层”,而是设一个安全上限,防止过深、不可信的嵌套签发被误认为合法。
为什么内网环境特别需要调这个值
企业私有 PKI 常采用多层结构:终端证书 → 二级中间 CA → 一级中间 CA → 根 CA。若默认 SSLVerifyDepth 1,Apache 只认“终端直连根 CA”,遇到三级或四级链就会拒绝连接,报错如 certificate chain too long 或静默失败。但设得太高(比如 10),又可能让绕过策略的恶意中间 CA 蒙混过关。
怎么确定该设成几
看你的实际证书链层级,不是拍脑袋定:
- 用
openssl s_client -connect backend.internal:443 -showcerts抓取完整链,数一数 PEM 块数量(每个-----BEGIN CERTIFICATE-----算一层) - 终端证书算第 1 层,每出现一个中间 CA 就 +1,直到你信任的那个根 CA 为止
- 常见情况:
— 自签名终端证书(无中间)→ 设为 1
— Let’s Encrypt R3 → ISRG Root X1 → 设为 2
— 内网三级链(终端→部门CA→集团CA→根)→ 设为 3
必须配套的关键配置
单独写 SSLVerifyDepth 3 没用,它只在证书验证开启后才生效:
-
SSLVerifyClient require(双向认证场景)或SSLProxyVerify require(反向代理连后端 HTTPS)—— 不开验证,深度设置无效 -
SSLCACertificateFile /path/to/internal-ca-bundle.crt或SSLProxyCACertificateFile—— 文件里必须包含你信任的所有中间 CA 和根 CA,缺一个整条链就断 -
SSLProxyCheckPeerName on(代理场景)或SSLStrictSNIVHostCheck on(服务端场景)—— 确保主机名也校验,防域名伪造
调试和验证是否起作用
改完配置重载 Apache(systemctl reload apache2 或 apachectl graceful),然后:
- 成功时:请求正常,
error_log无 verify error 或 depth is too deep 类报错 - 失败时重点查三处:
—error_log中是否有 unable to get local issuer certificate(说明 CA 包不全)
— 后端证书的 SAN 是否匹配ProxyPass目标域名(尤其内网用 IP 或内部 DNS 名时)
— 客户端或后端系统时间是否偏差超 5 分钟(导致有效期校验失败)











