SSLProxyVerifyDepth 是 Apache 验证后端 HTTPS 证书链时允许的最大 CA 层数,设为 1 时无法验证含中间 CA 的完整链(如根→中间→服务端),导致“unable to get issuer certificate”错误;必须根据实际证书链长度(通常为 2)匹配设置,且需与 SSLProxyVerify require 联用才生效。

SSLProxyVerifyDepth 是什么,为什么不能只设成 1
SSLProxyVerifyDepth 控制 Apache 在验证后端 HTTPS 服务器证书链时,最多向上追溯几级 CA 证书。它不决定“信任谁”,而是限制“查多深”——比如后端证书由中间 CA A 签发,A 又由根 CA B 签发,B 自签名;那么完整链长是 2(A→B,B→self)。若设 SSLProxyVerifyDepth 1,Apache 就只认 A,不检查 A 是否被 B 有效签署,相当于跳过根信任校验,形同虚设。
常见误用是把它当成“信任层级开关”,其实它只是深度阈值。真正决定是否信任的,是 SSLProxyCACertificateFile 或 SSLProxyCACertificatePath 里放了哪些 CA 证书。
实际配置中 depth 值怎么选
多数私有 PKI 部署采用两级结构:根 CA → 中间 CA → 服务端证书。此时链长为 2,SSLProxyVerifyDepth 2 是安全下限。
- 若后端证书是自签名的(无中间 CA),链长为 0,但
SSLProxyVerifyDepth 0不合法,必须设为1 - 若用了三级或以上中间 CA(如根 → 一级中间 → 二级中间 → 服务证书),depth 至少设为
3,否则验证失败报unable to get issuer certificate - 设得过大(如
10)不会提升安全性,反而可能让异常长链绕过人工审查 —— 比如某中间 CA 被误配成可签发任意子 CA,depth 太大就无法及时拦截
和 SSLProxyVerify require 一起用才有意义
单独设 SSLProxyVerifyDepth 不起作用。它必须配合 SSLProxyVerify require 才会触发链路验证逻辑。否则即使 depth 设为 2,Apache 也完全跳过证书链检查。
典型安全组合写法:
SSLProxyEngine on SSLProxyVerify require SSLProxyVerifyDepth 2 SSLProxyCheckPeerName on SSLProxyCACertificateFile /etc/apache2/ssl/internal-ca.pem
注意:SSLProxyCACertificateFile 必须包含**根 CA 和所有必要中间 CA 的 PEM 合并体**(顺序无关),不能只放根 CA —— 否则即使 depth 足够,也会因找不到 issuer 而失败。
调试时怎么看 depth 是否生效
错误日志里不会直接说 “depth too small”,而是报类似:
SSL Proxy: unable to get local issuer certificate 或 SSL Proxy: certificate verification failed (unable to get issuer certificate)
这时别急着调高 depth,先用 openssl 检查真实链长:
openssl s_client -connect svc.internal:443 -showcerts 2>/dev/null | openssl crl2pkcs7 -nocrl -certfile /dev/stdin | openssl pkcs7 -print_certs -noout
数一下输出的证书个数减一,就是实际需要的 depth 值。很多线上问题其实是 CA 文件漏了中间证书,不是 depth 设低了。


















