sslproxyverifydepth 是 apache 反向代理中控制后端 https 证书链校验最大层级的参数,默认值为1,仅接受终端证书直连根ca;设太小(如1)会导致多级证书链(如终端→中间ca→根ca)校验失败,出现“unable to get local issuer certificate”等502错误。

SSLProxyVerifyDepth 是什么,设太小会怎样
SSLProxyVerifyDepth 控制 Apache 在反向代理连接后端 HTTPS 服务时,验证证书链时允许的最大签名层级数(即根 CA → 中间 CA → 服务器证书 的跳数)。默认值是 1,意味着只允许「直接由根 CA 签发」的证书 —— 这在现实中几乎不可能满足,因为绝大多数公有或私有 CA 都用中间 CA 签发终端证书。
设成 1 后常见现象:明明后端证书有效、CA 文件也加载了,但请求仍失败,error_log 里出现类似 unable to get local issuer certificate 或 SSL handshake failed。这不是证书错,是链没走完就断了。
怎么设才合理:根据后端证书链实际结构来定
先确认后端证书链长度,别靠猜:
- 用
openssl s_client -connect svc.internal:443 -showcerts抓下完整链 - 看输出里有几个
-----BEGIN CERTIFICATE-----块:如果是 3 个(服务器证书 + 1 个中间 CA + 1 个根 CA),那深度至少得设为2 - 注意:根 CA 本身不计入深度;
SSLProxyVerifyDepth 2表示最多允许「服务器证书 ← 中间 CA ← 根 CA」这样的两级签名关系
实操建议:
- 生产环境建议从
3起配,覆盖绝大多数公有云和私有 PKI 场景 - 若后端用的是 Let's Encrypt(R3 → 服务器),设
2就够 - 若企业内网用三级 CA 结构(Root → Sub-CA1 → Sub-CA2 → Server),必须设
3,否则校验中断 - 不要盲目设成
10或更大:过深可能拖慢 TLS 握手,且无安全收益
必须和 SSLProxyVerify require 一起用,单独设 depth 没意义
SSLProxyVerifyDepth 是校验策略的“配套参数”,不是开关。它只在 SSLProxyVerify require 生效时起作用。如果还开着 none 或 optional,depth 值完全被忽略。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
典型错误配置:
SSLProxyVerify optional SSLProxyVerifyDepth 3
这等同于没开校验 —— depth 再大也没用。真正起作用的最小组合是:
SSLProxyVerify require-
SSLProxyVerifyDepth 2(或按链结构调整) SSLProxyCACertificateFile /path/to/your-ca-bundle.pem
漏掉任一都可能导致 500 或 502,且日志提示模糊。
调试时怎么看 depth 是否生效
Apache 不会直接告诉你 “depth 不够”,但有迹可循:
- 启用
LogLevel ssl:trace6后,在error_log里搜peer certificate和issuer,能看到校验过程中尝试找哪一级 issuer - 如果日志出现多次
issuer not found,紧接着unable to get issuer certificate,基本就是 depth 不足或 CA 文件缺中间证书 - 用
openssl verify -CAfile ca-bundle.pem -untrusted intermediate.pem server.crt手动复现校验逻辑,比改 Apache 配置快得多
真正容易被忽略的是:你加载的 SSLProxyCACertificateFile 必须包含完整的信任锚点(通常是根 CA),而中间 CA 证书要放在 -untrusted 位置或合并进同一文件 —— depth 设置再准,证书链文件本身不全,照样失败。










