apache反向代理https时证书链校验失败,本质是其与上游后端建立tls连接时无法验证对方证书信任链,常见于sslproxyverify启用但中间证书缺失、根证书不可信或校验配置不当;需通过openssl确认上游链完整性、显式配置sslproxycacertificatefile补全ca信任库,并按生产/测试场景合理设置sslproxyverify策略。
apache 作为反向代理转发 https 请求时出现证书链校验失败,本质不是“代理本身出错”,而是它在与上游 https 后端建立 tls 连接过程中,无法完成对后端证书的信任验证——常见于 sslproxyverify 启用但中间证书缺失、根证书不可信,或配置未绕过非生产环境的严格校验。
确认是代理层而非客户端的证书验证失败
先区分问题位置:
- 浏览器访问你的 Apache 前端 HTTPS 地址正常 → 说明 Apache 自身证书链没问题;
- 但用户请求经 Apache 代理到
https://api.example.com时返回SSL certificate problem: unable to get local issuer certificate或 Apache 错误日志出现AH02032: SSL Proxy: Peer certificate is not trusted→ 问题出在 Apache 主动连接上游时的 TLS 校验; - 用服务器终端执行:
openssl s_client -connect api.example.com:443 -servername api.example.com,若也报verify error:num=20:unable to get local issuer certificate,说明上游服务证书链本身不完整或签发 CA 不被系统信任。
补全 Apache 的上游 CA 信任库(关键步骤)
Apache 的 mod_ssl 在代理 HTTPS 时,默认使用系统的 OpenSSL 信任库(如 /etc/ssl/certs/ca-certificates.crt),但很多发行版该文件不含较新或私有 CA。需显式指定可信根证书路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 下载最新 Mozilla CA 包:
curl -o /etc/ssl/certs/cacert.pem https://curl.se/ca/cacert.pem; - 在 Apache 配置中(通常放在
<virtualhost></virtualhost>或全局ssl.conf)添加:
SSLProxyCACertificateFile /etc/ssl/certs/cacert.pem; - 若上游用的是私有 CA(如企业内网签发),则把该私有根证书(PEM 格式)单独放入此路径,并确保它不包含中间证书或多余空行;
- 重启 Apache:
systemctl restart apache2(Debian/Ubuntu)或systemctl restart httpd(RHEL/CentOS)。
按场景选择校验强度
生产环境建议保留校验,测试或内网可临时放宽:
-
推荐(生产):保持严格校验,仅补充缺失根证书 —— 设置:
SSLProxyVerify require
SSLProxyCheckPeerCN on
SSLProxyCheckPeerName on; -
调试/内网可信环境:跳过部分检查(仅限明确可控网络):
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off;
⚠️ 注意:这不解决根本问题,只是掩盖风险,上线前务必恢复并补全信任链。
验证上游证书链是否真正完整
即使你本地补了 CA,若上游服务返回的证书链缺中间证书,Apache 仍会校验失败:
- 运行:
openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts 2>/dev/null | grep "BEGIN CERTIFICATE" | wc -l; - 输出应 ≥2(域名证书 + 至少一个中间证书);若为 1,说明上游没配 fullchain,需对方修复;
- 用 SSL Labs 测试
api.example.com,看 “Certificate Chain” 是否标为 Incomplete。










