SSLProxyCheckPeerCN已废弃且彻底移除,应改用SSLProxyCheckPeerName on配合SSLProxyVerify require进行SAN主机名校验。

SSLProxyCheckPeerCN 不能也不应该再被使用。
它在 Apache 2.4.8 中已被标记为废弃,2.4.12 起默认禁用,2.4.26 及之后版本已彻底移除。如果你在配置中写入该指令,Apache 启动会直接报错:
Invalid command 'SSLProxyCheckPeerCN', perhaps misspelled or defined by a module not included in the server configuration
这不是配置顺序或模块加载的问题——它是被硬性删除的指令,无法通过 LoadModule 或降级方式“恢复”。
✅ 正确做法:用 SSLProxyCheckPeerName 替代
现代 Apache(2.4.8+)只支持基于 Subject Alternative Name(SAN) 的主机名校验,这是 RFC 6125 标准要求,更安全、更准确(CN 字段不支持通配符精确匹配,且常被忽略)。
必须启用的配置项:
-
SSLProxyEngine on
(开启代理作为 HTTPS 客户端的能力) -
SSLProxyCheckPeerName on
(强制校验后端证书中的 SAN 是否匹配目标域名) -
SSLProxyVerify require
(强制验证证书链有效性:签名、有效期、吊销状态等) -
SSLProxyVerifyDepth 2(可选,但推荐)
(指定证书链校验深度,防过长链绕过) -
SSLProxyCACertificateFile /path/to/ca-bundle.crt(若后端用私有 CA 或自签名证书)
(告诉 Apache 哪些根证书可信;系统默认 CA 不自动生效)
⚠️ 注意:
SSLProxyCheckPeerName on必须显式写出。它的默认值是off,即 不校验 —— 这和很多人直觉相反。
❌ 常见错误配置(会导致 502 或连接失败)
- 只写
SSLProxyVerify require,却没配SSLProxyCheckPeerName on→ 域名不校验,仅验证书链 - 写了
SSLProxyCheckPeerName on,但后端证书没包含对应 SAN → 日志报Peer certificate does not match hostname -
SSLProxyCACertificateFile路径错误、权限不足,或文件内容不是 PEM 格式根证书 → 握手失败,日志只显示SSL handshake failed - 后端用的是
https://192.168.1.100,但证书 SAN 里只有DNS:api.internal,没有IP:192.168.1.100→ 校验失败(IP 地址访问必须在 SAN 中明确声明)
? 示例:安全代理到内部 HTTPS 服务
<VirtualHost *:443>
ServerName proxy.example.com
SSLProxyEngine on
SSLProxyCheckPeerName on
SSLProxyVerify require
SSLProxyVerifyDepth 2
SSLProxyCACertificateFile /etc/ssl/certs/internal-ca.crt
ProxyPreserveHost on
ProxyPass /api https://backend.internal:8443/api
ProxyPassReverse /api https://backend.internal:8443/api
</VirtualHost>确保 backend.internal 的证书中,Subject Alternative Name 至少含有一条:
DNS:backend.internal
(仅 CN=backend.internal 是不够的)
? 快速验证后端证书 SAN
在终端执行:
openssl s_client -connect backend.internal:8443 -servername backend.internal 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"
看到类似输出才表示有效:
X509v3 Subject Alternative Name:
DNS:backend.internal, IP:10.0.1.5不复杂但容易忽略。


















