apache反向代理https后端时ssl证书链验证失败,根源是校验逻辑不完整或配置错位;必须同时启用sslproxyengine on、sslproxyverify require、sslproxycheckpeername on、sslproxycheckpeerexpire on四项指令,并显式配置sslproxycacertificatefile(含根→中间证书)及匹配实际链长的sslproxyverifydepth值,缺一不可。

Apache 反向代理连接 HTTPS 后端时,SSL 证书链验证失败是常见问题,根源不是“没校验”,而是校验逻辑不完整或配置错位。关键在于:Apache 不自动信任系统 CA,也不自动补全中间证书,所有验证环节都必须显式声明、协同生效。
必须配齐的四项基础指令
单独设置任一参数都没用,四者缺一不可:
- SSLProxyEngine on:开启代理模式下的 TLS 客户端能力,是所有 SSLProxy 指令的前提
- SSLProxyVerify require:激活强制校验(签名、吊销、有效期),设为 optional 或 none 等同于关闭防护
- SSLProxyCheckPeerName on:启用 SAN 域名匹配(只认 DNS 条目,CN 已被主流浏览器和 Apache 废弃)
- SSLProxyCheckPeerExpire on:检查证书是否在有效期内,后端时间偏差超 ±5 分钟即拒绝
可信 CA 证书必须手动加载
Apache 不读取 /etc/ssl/certs/ca-certificates.crt 等系统信任库。若后端用的是 Let’s Encrypt、DigiCert 或企业私有 CA,必须显式指定:
- SSLProxyCACertificateFile /path/to/ca-bundle.pem:单个 PEM 文件,按“根 → 中间”顺序拼接(不含后端服务器证书本身)
- SSLProxyCACertificatePath /path/to/ca-dir/:目录路径,需用 OpenSSL 命令生成哈希符号链接(如 openssl x509 -in ca.crt -inform PEM -subject_hash_old -noout)
- 文件权限应为 600,属主为 Apache 运行用户(如 www-data),否则日志仅显示 “SSL handshake failed”
证书链深度要匹配真实结构
默认 SSLProxyVerifyDepth 1 只接受两层链(终端 ← 根),但多数公有云和 Let’s Encrypt 使用三级链(终端 ← 中间 ← 根)。用以下命令确认后端实际链长:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
openssl s_client -connect svc.internal:443 -showcerts 2>/dev/null | grep "BEGIN CERTIFICATE" | wc -l
结果为 N,则 SSLProxyVerifyDepth 应设为 N−1(例如输出 4,说明含终端证书共 4 张,需设为 3)。
- 设太小 → 报错 “certificate chain too long” 或静默 502
- 设太大 → 可能意外信任不可控中间 CA,不建议超过 3
- 该值必须放在
或 块内,且与 SSLProxyVerify require 同时启用才生效
快速定位失败原因
别靠日志猜。出问题时优先检查 error_log 中三类线索:
- unable to get local issuer certificate → CA 文件路径错、权限不足,或未包含对应根/中间证书
- certificate verification failed for [domain] → SAN 不匹配(如 ProxyPass 指向 api.internal,但证书无 DNS:api.internal)或证书已过期
- SSL connect error → SSLProxyEngine off 被遗漏,或后端服务根本未启用 HTTPS










