必须在块内同时配置sslproxyengine on、sslproxyverify require、sslproxycheckpeername on和sslproxycacertificatefile,才能强制校验后端证书san域名匹配;sslproxycheckpeercn必须关闭,否则报错或干扰验证。
要通过虚拟主机配置 sslproxycheckpeername 强制校验后端域名合法性,核心是启用现代 tls 主机名验证机制——它不再依赖已废弃的 cn 字段,而是严格检查证书中的 subject alternative name(san)是否匹配代理目标域名。这项配置必须与 sslproxyverify require 协同生效,单独开启无效。
必须启用的关键指令组合
在 <virtualhost></virtualhost> 块内,以下四条指令需同时存在:
- SSLProxyEngine on:启用 Apache 作为 HTTPS 客户端连接后端,否则所有 HTTPS 代理请求都会失败(502 错误)
- SSLProxyVerify require:强制验证后端证书链有效性(签名、有效期、吊销状态等),这是身份校验的前提
- SSLProxyCheckPeerName on:真正执行主机名校验,只认 SAN 字段;若证书无 SAN,则回退到 CN(不推荐,且多数现代证书已不含有效 CN)
- SSLProxyCACertificateFile /path/to/ca-bundle.crt:指定可信 CA 根证书路径;若后端用私有 CA 或自签名证书,必须显式加载其根证书,系统默认信任库不自动生效
确保 ProxyPass 目标域名与证书 SAN 完全一致
校验失败最常见的原因是域名不匹配。例如:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 配置了
ProxyPass /api https://svc.internal/,则后端证书的 SAN 必须包含DNS:svc.internal - 仅含
DNS:*.internal或CN=svc.internal不满足要求 - 使用 IP 地址代理(如
https://10.0.1.5:8443)时,证书必须包含对应 IP 的IP:10.0.1.5条目,否则校验必然失败
禁用过时且危险的兼容选项
以下配置必须显式关闭或移除,避免干扰 SAN 校验逻辑:
- SSLProxyCheckPeerCN off:该指令在 Apache 2.4.8+ 已废弃,2.4.26+ 直接报错;即使低版本中保留,也应设为 off,防止旧逻辑干扰
- 不要写
SSLProxyVerify optional或optional_no_ca:它们等同于跳过校验,形同虚设 - 避免遗漏
SSLProxyCheckPeerExpire on(默认开启):它会检查后端证书是否过期,时间偏差超 5 分钟也会拒绝连接
调试与验证方法
配置后若出现 Peer certificate does not match hostname,说明校验触发成功,但后端证书不合规:
- 用
openssl s_client -connect svc.internal:443 -servername svc.internal手动查看证书 SAN 内容 - 检查 Apache error_log,重点关注
SSL Proxy: Peer certificate does not match hostname及后续的握手失败原因 - 临时将
SSLProxyVerify none测试连通性,确认问题是否出在校验环节而非网络或权限










