<p>Apache mod_proxy 通过 SSLProxy* 指令实现与后端的双向TLS认证:必须启用 SSLProxyEngine on、SSLProxyVerify require、SSLProxyCACertificateFile(后端CA)、SSLProxyMachineCertificateFile(Apache客户端证书),缺一不可。</p>
apache 的 mod_proxy 本身不直接实现“双向认证”,但它可以作为 https 客户端,在反向代理到后端服务时,启用并强制执行 tls 双向认证(即:apache 验证后端服务器证书 + 后端服务器也验证 apache 提供的客户端证书)。这常用于高安全场景,比如 apache 代理访问内部受控的 api 网关、kubernetes apiserver 或金融后端,要求双方身份互信。
要让 mod_proxy 与后端建立带双向 TLS 认证的安全连接,核心是配置 mod_ssl 提供的 SSLProxy* 指令族,并确保 Apache 主动提供自己的客户端证书给后端校验。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
✅ 必须配置的四项关键指令(缺一不可)
SSLProxyEngine on
启用代理模式下的 SSL/TLS 功能。不加这一行,所有 HTTPS 后端连接都会失败(日志报SSL Proxy requested but SSLProxyEngine is not enabled)。SSLProxyCACertificateFile /path/to/backend-ca.crt
指定后端服务器证书所依赖的根 CA 证书(PEM 格式)。不能复用 Apache 自己的SSLCACertificateFile,也不能用系统默认 CA;必须是后端实际使用的私有 CA 或中间 CA 证书。文件权限建议600,属主为 Apache 运行用户(如apache或www-data)。SSLProxyMachineCertificateFile /path/to/apache-client.pem
Apache 作为客户端需向后端出示的证书+私钥组合(PEM 格式,私钥和证书可合并或分开,推荐合并为单文件)。该证书必须由后端信任的同一 CA 签发(例如你自建的私有 CA),且不能是自签名或 Let’s Encrypt 等公有 CA 签发的——因为公有 CA 不签发客户端用途证书。SSLProxyVerify require
强制要求后端返回有效证书,并由 Apache 主动校验。仅设此项还不够,必须配合SSLProxyCACertificateFile和SSLProxyCheckPeer*系列指令,否则握手会静默失败或报 500。
? 补充强校验指令(推荐启用)
SSLProxyCheckPeerName on
启用对后端证书中 SAN(Subject Alternative Name)字段的主机名匹配。若后端证书含DNS:api.internal,而你ProxyPass到https://api.internal/,此选项确保域名一致。
⚠️ 注意:必须同时设置SSLProxyCheckPeerCN off(禁用旧式 CN 匹配),否则可能因 CN 不匹配被拒绝。SSLProxyCheckPeerExpire on
校验后端证书是否过期。若后端时间与 Apache 服务器偏差超过 ±5 分钟,连接会被拒绝(无明确错误提示,只显示 502/503)。SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
明确限定只允许 TLS 1.2+,避免协议降级风险。后端若只支持 TLS 1.3,可进一步收紧为TLSv1.3。SSLProxyCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
指定强密码套件,优先使用前向保密(PFS)算法。搭配SSLProxyHonorCipherOrder on确保顺序生效。
? 完整配置示例(HTTPS 反向代理 + 双向 TLS)
<VirtualHost *:443>
ServerName gateway.example.com
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
# 启用代理 TLS 客户端能力
SSLProxyEngine on
SSLProxyVerify require
SSLProxyCheckPeerName on
SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire on
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLProxyHonorCipherOrder on
SSLProxyCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
# 指向后端信任的 CA(不是你自己的 CA!)
SSLProxyCACertificateFile /etc/apache2/ssl/backend-root-ca.crt
# Apache 向后端出示的客户端证书(含私钥)
SSLProxyMachineCertificateFile /etc/apache2/ssl/apache-client.pem
# 代理规则
ProxyPreserveHost On
ProxyPass / https://backend.internal:8443/
ProxyPassReverse / https://backend.internal:8443/
# (可选)记录证书验证结果便于排错
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_CLIENT_VERIFY}x" combined-ssl
</VirtualHost>❗ 常见失败原因与排查要点
后端返回
502 Bad Gateway或 Apache 错误日志出现SSL handshake failed:
→ 检查SSLProxyMachineCertificateFile是否包含完整证书链+私钥,且私钥未加密(或已用SSLProxyMachineCertificatePassword解密);
→ 确认SSLProxyCACertificateFile内容是后端所用 CA 的根证书(非中间证书),且无空行/注释;
→ 用openssl s_client -connect backend.internal:8443 -cert apache-client.pem -CAfile backend-root-ca.crt手动测试连通性。后端拒绝 Apache 客户端证书:
→ 确保 Apache 的客户端证书由后端信任的 CA 签发,且证书Extended Key Usage包含clientAuth;
→ 检查后端是否要求特定 OU/CN 字段,Apache 证书需匹配。Apache 日志无明确报错但连接超时:
→ 检查SSLProxyCheckPeerExpire on是否因时间不同步触发拒绝(同步 NTP);
→ 确认mod_ssl和mod_proxy_http已加载:apachectl -M | grep -E "(ssl|proxy)"应输出ssl_module (shared)和proxy_http_module (shared)。
不复杂但容易忽略。

















