apache无法透传原始客户端证书,需通过ssloptions+stdenvvars提取ssl_client_s_dn等变量,并用requestheader set注入x-client-dn等http头供java应用读取,同时必须启用mod_ssl、mod_headers、mod_proxy模块及sslverifyclient require双向认证。

Apache 无法直接“透传”客户端加密证书(即双向 TLS 中的 client certificate)给后端 Java 应用——它默认终止 SSL 握手,只把解密后的 HTTP 请求转发出去。要让 Java 应用拿到原始客户端证书信息,必须由 Apache 解析、提取并以 HTTP 头形式注入请求,后端再从头中读取解析。
确认启用必要模块和 SSL 双向认证
确保以下模块已加载:
- mod_ssl.so:提供 TLS 支持与客户端证书验证能力
- mod_headers.so:用于设置自定义请求头
- mod_proxy.so 和 mod_proxy_http.so:反向代理必需
在 <virtualhost></virtualhost> 中启用双向认证:
-
SSLVerifyClient require:强制校验客户端证书 -
SSLVerifyDepth 2:允许证书链最多两层(可根据 CA 策略调整) -
SSLCACertificateFile /path/to/ca-bundle.crt:指定受信任的根/中间 CA 证书
提取证书信息并注入请求头
Apache 通过环境变量暴露证书详情,需用 RequestHeader set 显式注入。常用字段包括:
-
%{SSL_CLIENT_S_DN}e:客户端证书主题 DN(如CN=user1,OU=dev,O=company) -
%{SSL_CLIENT_I_DN}e:签发者 DN(CA 信息) -
%{SSL_CLIENT_CERT}e:PEM 格式完整证书(含换行符,需 Base64 编码或截断处理) -
%{SSL_CLIENT_CERT_CHAIN_0}e:第一级中间证书(可选)
示例配置:
SSLOptions +StdEnvVars
RequestHeader set X-Client-DN "%{SSL_CLIENT_S_DN}e"
RequestHeader set X-Client-Issuer-DN "%{SSL_CLIENT_I_DN}e"
RequestHeader set X-Client-Cert "%{SSL_CLIENT_CERT}e"
⚠️ 注意:%{...}e 中的 e 表示 environment variable,不是拼写错误;若证书内容含换行符导致头被截断,建议后端改用 SSL_CLIENT_S_DN 或 Base64 编码后再注入。
Java 应用侧安全读取证书头
Spring Boot 示例(Controller 中):
@GetMapping("/api/user")
public String getUserInfo(HttpServletRequest request) {
String dn = request.getHeader("X-Client-DN");
String certPem = request.getHeader("X-Client-Cert");
// 验证头是否来自可信代理(如检查 X-Forwarded-For 是否为 Apache 内网 IP)
// 对 certPem 做 PEM 解析时,注意换行符和空格处理
return "DN: " + dn;
}
关键提醒:
- 不要直接信任未校验的
X-Client-Cert头,应在 Apache 层确保仅对已验证客户端才注入这些头 - 生产环境建议配合
mod_remoteip或 IP 白名单,防止伪造头绕过证书校验 - 若 Java 应用需完整证书做签名验签,优先使用
SSL_CLIENT_CERT并在后端做 PEM 清洗(替换\n为换行,补全-----BEGIN CERTIFICATE-----等)
验证是否生效
部署后可通过 curl 携带客户端证书测试:
curl -k --cert user.crt --key user.key https://your-domain.com/api/user
同时开启 Apache 访问日志记录相关头:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Client-DN}i\"" certlog
CustomLog logs/cert-access.log certlog
查看日志中是否出现非空的 DN 值,即可确认透传链路打通。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











