如何配置Apache mod_ssl的SSLProxyCheckPeerCN以避免后端SSL中间人攻击?
- 内容介绍
- 文章标签
- 相关推荐
本文共计779个文字,预计阅读时间需要4分钟。
SSLProxyCheckPeerCN已失效,无法用于防止中间人截获,强行保留会导致Apache启动失败。
为什么 SSLProxyCheckPeerCN 不再起作用
该指令在 Apache 2.4.8 中被标记为废弃,2.4.26 起彻底移除。你现在写入配置文件,Apache 会直接报错:Invalid command 'SSLProxyCheckPeerCN', perhaps misspelled or defined by a module not included in the server configuration。根本原因在于:仅校验证书 CN 字段不安全——它忽略 SAN(Subject Alternative Name),不支持通配符精确匹配,且易被伪造证书绕过。
替代方案:必须用 SSLProxyCheckPeerName + SSLProxyVerify require
现代 Apache 唯一有效的后端主机名校验机制是 SSLProxyCheckPeerName on,它严格按 RFC 6125 规则检查证书的 SAN 字段(优先)或回退到 CN(不推荐)。但光开这个不够,还需配套启用证书链校验:
-
SSLProxyEngine on—— 必须开启,否则代理不走 TLS -
SSLProxyCheckPeerName on—— 显式启用主机名匹配(默认是 off) -
SSLProxyVerify require—— 强制验证签名、有效期、吊销状态;设为none或optional等同于不校验 -
SSLProxyCACertificateFile /path/to/upstream-ca.pem—— 指向后端服务所用 CA 的根证书(不是你自己的证书!)
常见报错 “Peer certificate does not match hostname” 怎么解
这不是配置写错了,而是后端 HTTPS 服务返回的证书确实不满足校验条件。典型原因包括:
- 后端证书没填
DNS:svc.internal这类 SAN 条目,只写了CN=svc.internal——SSLProxyCheckPeerName on下 CN 匹配无效 -
ProxyPass /api https://svc.internal/中的域名和证书 SAN 不完全一致(比如大小写、末尾斜杠、端口显式写出等) - 后端服务器时间偏差 > 5 分钟,触发
SSLProxyCheckPeerExpire on(默认启用)拒绝连接 - Apache 进程用户(如
www-data)无权读取SSLProxyCACertificateFile指定的 PEM 文件(SELinux 上下文、文件权限都要查)
升级前还在用 Apache 2.4.6(如 CentOS 7 默认版)怎么办
旧版本不支持 SSLProxyCheckPeerName,也没法回滚模块“恢复” SSLProxyCheckPeerCN。可行路径只有两条:
- 升级
httpd到 2.4.8+(推荐,RHEL/CentOS 可通过 SCL 或第三方仓库获取) - 降级安全要求:改用
SSLProxyVerify optional_no_ca+ 自定义脚本定期轮询后端证书 SAN,但这只是折中手段,无法阻断运行时 MITM
真正能防中间人拦截的,不是某个开关名字,而是整套验证链是否闭环——从 CA 信任、证书有效期、到 SAN 主机名逐字符匹配,缺一不可。漏掉 SSLProxyCACertificateFile 或误设 SSLProxyVerify 级别,SSLProxyCheckPeerName on 就形同虚设。
本文共计779个文字,预计阅读时间需要4分钟。
SSLProxyCheckPeerCN已失效,无法用于防止中间人截获,强行保留会导致Apache启动失败。
为什么 SSLProxyCheckPeerCN 不再起作用
该指令在 Apache 2.4.8 中被标记为废弃,2.4.26 起彻底移除。你现在写入配置文件,Apache 会直接报错:Invalid command 'SSLProxyCheckPeerCN', perhaps misspelled or defined by a module not included in the server configuration。根本原因在于:仅校验证书 CN 字段不安全——它忽略 SAN(Subject Alternative Name),不支持通配符精确匹配,且易被伪造证书绕过。
替代方案:必须用 SSLProxyCheckPeerName + SSLProxyVerify require
现代 Apache 唯一有效的后端主机名校验机制是 SSLProxyCheckPeerName on,它严格按 RFC 6125 规则检查证书的 SAN 字段(优先)或回退到 CN(不推荐)。但光开这个不够,还需配套启用证书链校验:
-
SSLProxyEngine on—— 必须开启,否则代理不走 TLS -
SSLProxyCheckPeerName on—— 显式启用主机名匹配(默认是 off) -
SSLProxyVerify require—— 强制验证签名、有效期、吊销状态;设为none或optional等同于不校验 -
SSLProxyCACertificateFile /path/to/upstream-ca.pem—— 指向后端服务所用 CA 的根证书(不是你自己的证书!)
常见报错 “Peer certificate does not match hostname” 怎么解
这不是配置写错了,而是后端 HTTPS 服务返回的证书确实不满足校验条件。典型原因包括:
- 后端证书没填
DNS:svc.internal这类 SAN 条目,只写了CN=svc.internal——SSLProxyCheckPeerName on下 CN 匹配无效 -
ProxyPass /api https://svc.internal/中的域名和证书 SAN 不完全一致(比如大小写、末尾斜杠、端口显式写出等) - 后端服务器时间偏差 > 5 分钟,触发
SSLProxyCheckPeerExpire on(默认启用)拒绝连接 - Apache 进程用户(如
www-data)无权读取SSLProxyCACertificateFile指定的 PEM 文件(SELinux 上下文、文件权限都要查)
升级前还在用 Apache 2.4.6(如 CentOS 7 默认版)怎么办
旧版本不支持 SSLProxyCheckPeerName,也没法回滚模块“恢复” SSLProxyCheckPeerCN。可行路径只有两条:
- 升级
httpd到 2.4.8+(推荐,RHEL/CentOS 可通过 SCL 或第三方仓库获取) - 降级安全要求:改用
SSLProxyVerify optional_no_ca+ 自定义脚本定期轮询后端证书 SAN,但这只是折中手段,无法阻断运行时 MITM
真正能防中间人拦截的,不是某个开关名字,而是整套验证链是否闭环——从 CA 信任、证书有效期、到 SAN 主机名逐字符匹配,缺一不可。漏掉 SSLProxyCACertificateFile 或误设 SSLProxyVerify 级别,SSLProxyCheckPeerName on 就形同虚设。

