apache实现双向认证(mtls)需同时配置四个刚性组件:服务端证书与私钥、可信ca列表、sslverifyclient require开关、吊销检查机制;缺一不可,否则报500或退化为单向https。

Apache 实现双向认证(mTLS)不是简单把客户端证书路径加进去就行,关键在于服务端主动要求并验证客户端证书链。配置必须包含四个刚性组件:服务端证书与私钥、可信 CA 列表、强制校验开关、吊销检查机制。缺一不可,否则会返回 500 错误或退化为单向 HTTPS。
核心配置四要素
Apache 双向认证依赖以下四项同时生效:
-
服务端身份凭证:用
SSLCertificateFile和SSLCertificateKeyFile指定服务器证书与私钥,完成基础 HTTPS 握手 -
可信 CA 根/中间证书:通过
SSLCACertificateFile提供 PEM 格式 CA 证书包(如chain.pem),用于验证客户端证书签名链;若缺失,SSLVerifyClient require直接失败 -
强制客户端证书开关:设置
SSLVerifyClient require,拒绝无证书或验证失败的连接;可选optional用于调试,但生产环境必须为require -
吊销状态检查(推荐启用):搭配
SSLCARevocationFile(CRL)或SSLUseStapling on+ OCSP 响应器,防止已撤销证书被接受
典型 VirtualHost 配置示例
以 Ubuntu/Apache 2.4 为例,在 /etc/apache2/sites-enabled/default-ssl.conf 中配置:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName api.internal.example.com
SSLEngine on
<h1>服务端证书</h1>
<p>SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key</p>
<h1>双向认证必需项</h1>
<p>SSLCACertificateFile /etc/apache2/ssl/ca-bundle.pem
SSLVerifyClient require
SSLVerifyDepth 3</p>
<h1>安全加固(TLS 1.2+,禁用弱算法)</h1>
<p>SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
SSLCompression off</p>
<h1>传递客户端证书信息给后端</h1>
<p>SSLOptions +StdEnvVars +ExportCertData
RequestHeader set X-Client-CN "%{SSL_CLIENT_S_DN_CN}s"
RequestHeader set X-Client-Serial "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set X-Client-Verify "%{SSL_CLIENT_VERIFY}s"</p>
<h1>拒绝无证书访问的友好提示</h1>
<p>ErrorDocument 403 "403 Forbidden: Valid client certificate required"
</p></virtualhost>
客户端证书信息如何被后端使用
Apache 不直接做业务级鉴权,而是将校验结果注入请求头,交由后端应用处理:
-
X-Client-CN:提取客户端证书中的 Common Name,常用于用户/设备标识 -
X-Client-Serial:证书序列号,全局唯一,适合白名单比对 -
X-Client-Verify:值为SUCCESS或FAILED,后端应优先校验此项非空且为 SUCCESS - 后端逻辑必须校验这些头字段是否真实存在、格式合法,并匹配预设白名单(如允许的 CN 列表或序列号哈希),不能仅信任 TLS 层已通过的事实
必须关闭 HTTP 入口或强制跳转
mTLS 只在 HTTPS 层生效。若存在 HTTP 端点,攻击者可绕过证书校验:
- 最安全做法:注释掉
Listen 80,或删除所有<virtualhost></virtualhost>配置 - 次选方案:添加重写规则强制跳转
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]










