sslproxyverify require 是强制校验后端 https 证书的核心指令,必须配合 sslproxycheckpeername on、sslproxycacertificatefile 指向可信 ca 证书及时间同步等配置才生效,否则将导致 500/502 错误。

要让 Apache 在反向代理 HTTPS 后端时真正验证对方身份,SSLProxyVerify require 是核心开关,但它必须配合证书信任链、主机名校验等配置才有效,否则会直接失败。
SSLProxyVerify 的作用和必须设为 require
SSLProxyVerify 控制的是 Apache 作为反向代理「连接上游 HTTPS 服务」时,是否校验其证书。它不涉及 Apache 自己对外暴露的证书。
- 默认值是 none,即完全跳过校验 —— 这会让中间人攻击(MITM)畅通无阻
- 设为 require 才会强制检查证书链有效性、域名匹配(通过 SAN)、签名可信度和有效期
- optional 或 optional_no_ca 等同于没开校验,名字有误导性,生产环境不能用
启用 require 的最小必要配置
只写 SSLProxyVerify require 不够,缺任何一环都会导致 500 错误或连接重置,日志里往往只显示 “SSL handshake failed”。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 确保已加载
mod_ssl和mod_proxy(含mod_proxy_http) - 在
<virtualhost></virtualhost>或<proxy></proxy>块中添加:SSLProxyVerify require SSLProxyCheckPeerName on SSLProxyCheckPeerExpire on SSLProxyCheckPeerCN off
- 必须指定可信 CA 根证书:
SSLProxyCACertificateFile /path/to/backend-ca.crt(不是你自己的证书!)
若后端用私有 CA(如企业内网 PKI),该 CA 证书必须显式加载,系统级 CA 信任库默认不生效
常见失败原因与修复
启用 require 后报 500 或 502,最常源于以下三类问题:
-
CA 证书路径错误或权限不足:Apache 进程用户(如 www-data)读不到指定文件,检查
ls -l和 SELinux 上下文(RHEL/CentOS) -
后端证书 SAN 不匹配:
SSLProxyCheckPeerName on要求证书的 Subject Alternative Name(SAN)中至少有一个条目与ProxyPass目标域名完全一致。例如ProxyPass /api https://svc.internal/,则后端证书必须含DNS:svc.internal,仅 CN 匹配无效 -
时间偏差:后端服务器系统时间误差超过 5 分钟,会导致
SSLProxyCheckPeerExpire on拒绝连接,且错误信息极不直观
调试技巧:快速定位证书链问题
别靠猜。开启 Apache 错误日志的 debug 级别(LogLevel ssl:debug proxy:debug),重点看是否出现以下线索:
-
unable to get local issuer certificate→ 缺少中间 CA 或根 CA -
certificate not trusted→ CA 证书未被正确加载或路径错误 -
Peer certificate does not match hostname→ SAN 不匹配,不是配置错,是后端证书本身没签对域名










