apache实现双向ssl(mtls)需同时配置入向(验证客户端证书)和出向(以客户端身份连接后端):入向设sslengine on、sslverifyclient require、sslcacertificatefile及sslverifydepth;出向配sslproxyengine on、sslproxymachinecertificatefile,并透传证书至后端头,辅以协议加固与严格校验。
apache 作为反向代理实现双向 ssl(mtls)认证,本质是让 apache 同时扮演两个角色:对客户端做服务端验证(入向 mtls),又对后端服务做客户端认证(出向 mtls)。配置不能只设一边,必须两端都配全,否则证书会“断在中间”。
入向:强制客户端提供并验证证书
这是双向认证的第一道门,Apache 必须能识别、信任并校验客户端证书:
-
启用 SSL 并要求客户端证书:在
<virtualhost></virtualhost>块中设置SSLEngine on和SSLVerifyClient require -
指定可信 CA 证书包:用
SSLCACertificateFile /path/to/client-ca-bundle.pem,该文件必须包含签发客户端证书的根 CA 和全部中间证书(PEM 格式,无空行、无注释、权限600) -
设置验证深度:如客户端证书由根 CA 直接签发,填
SSLVerifyDepth 1;若含中间 CA,则填2或3 -
导出证书信息供日志或后端使用(可选但推荐):
SSLOptions +StdEnvVars +ExportCertData,之后可通过%{SSL_CLIENT_CERT}e环境变量读取原始 PEM 证书
出向:以客户端身份连接后端并透传证书
Apache 需把已验证的客户端证书“当作自己的证书”,安全地转发给后端 HTTPS 服务:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
开启代理侧 SSL 引擎:添加
SSLProxyEngine on(必须与入向配置在同一<virtualhost></virtualhost>或对应<location></location>内) -
配置代理机器证书:用
SSLProxyMachineCertificateFile /path/to/proxy-client.pem,该 PEM 文件需同时包含证书和私钥(或分开用SSLProxyMachineCertificateKeyFile) - 确保身份一致性:该代理证书的 CN/OU 等字段应与客户端证书一致,否则后端可能拒绝连接
-
若后端也用私有 CA:还需配置
SSLProxyCACertificateFile /path/to/backend-ca.pem,让 Apache 信任后端服务器证书
透传原始客户端证书到后端
后端应用往往需要原始证书做二次鉴权,Apache 需将其注入 HTTP 请求头:
- 用
RequestHeader set X-Client-Cert "%{SSL_CLIENT_CERT}e"将 PEM 编码证书完整传递(注意e表示环境变量) - 也可提取关键字段,例如:
RequestHeader set X-Client-CN "%{SSL_CLIENT_S_DN_CN}s"传 CN 值 - 务必确认
mod_headers已启用(a2enmod headers),否则头无法设置
安全加固与常见避坑点
生产环境必须补充以下配置,否则存在降级或绕过风险:
- 禁用老旧协议:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1,仅保留TLSv1.2+ - 启用前向保密密码套件:
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 - 关闭压缩防 CRIME:
SSLCompression off -
绝对不要用
SSLVerifyClient optional_no_ca:它不校验签名,DN 字段不可信,不能用于身份绑定 - 配置后执行
apachectl configtest检查语法,再systemctl reload apache2(或httpd)生效










