SSLProxyCheckPeerCN已失效,因仅校验CN字段不安全且忽略SAN,自Apache 2.4.8废弃、2.4.26彻底移除;应改用SSLProxyCheckPeerName on配合SSLProxyVerify require和SSLProxyCACertificateFile实现基于SAN的严格主机名校验与证书链验证。

SSLProxyCheckPeerCN 已失效,不能用于防止中间人攻击。 它在 Apache 2.4.8 中被标记为废弃,2.4.26 起彻底移除。现在写入该指令会导致 Apache 启动失败,错误提示类似:Invalid command 'SSLProxyCheckPeerCN'。
为什么 SSLProxyCheckPeerCN 不再安全也不可用
仅校验证书的 CN(Common Name)字段存在严重缺陷:
- CN 不支持通配符的精确语义(如
*.api.example.com无法匹配v1.api.example.com) - 完全忽略更权威、更标准的 SAN(Subject Alternative Name)字段
- RFC 6125 明确要求优先验证 SAN,CN 仅作为无 SAN 时的兜底(且不推荐)
- 现代 CA 几乎都不再将主机名写入 CN,只填入 SAN,导致 CN 校验必然失败
正确替代方案:启用 SSLProxyCheckPeerName + SSLProxyVerify
从 Apache 2.4.8 开始,唯一有效的主机名校验机制是:
-
SSLProxyCheckPeerName on:强制按 RFC 6125 规则检查后端证书的 SAN 字段(必须至少含一个与ProxyPass目标域名完全一致的DNS:条目) -
SSLProxyVerify require:强制验证整个证书链有效性(签名、有效期、吊销状态),缺一不可 -
SSLProxyCACertificateFile /path/to/ca-bundle.pem:显式指定可信 CA 根证书(系统默认信任库不生效)
典型安全配置片段
以下为反向代理到 https://svc.internal 的最小安全配置:
SSLProxyCheckPeerName on
SSLProxyVerify require
SSLProxyVerifyDepth 2
SSLProxyCACertificateFile /etc/ssl/certs/internal-ca.pem
ProxyPass /api https://svc.internal/api
ProxyPassReverse /api https://svc.internal/api
常见报错“Peer certificate does not match hostname”的真实原因
这不是配置问题,而是后端服务返回的证书本身不符合要求:
- 证书 SAN 中没有
DNS:svc.internal(哪怕 CN 是 svc.internal 也没用) - 后端时间偏差超过 5 分钟,触发
SSLProxyCheckPeerExpire on(默认启用)拒绝 -
SSLProxyCACertificateFile指向的文件权限不对,或内容不是 PEM 格式根证书











