Apache实现双向TLS需闭环配置SSLCACertificateFile、SSLVerifyClient require和SSLVerifyDepth三项指令,缺一不可;必须在<Location>路径下启用,透传X-Client-CN等头供后端校验,并启用OCSP或CRL吊销检查。

Apache 实现客户端证书认证(即双向 TLS/mTLS),核心是让服务器在 TLS 握手阶段强制验证客户端提供的数字证书。这不是开个开关就能用的功能,而是一套必须闭环配置的信任与控制流程。关键不在于“加一行 SSLVerifyClient”,而在于信任锚点、验证策略、作用范围、身份透传四者协同。
必须配齐三项基础指令
单独写 `SSLVerifyClient require` 会直接返回 500 错误,日志里出现 `peer did not return a certificate`——这不是客户端没发证书,而是服务端根本没准备好验证环境。-
SSLCACertificateFile /etc/apache2/ssl/internal-ca.crt:指定你信任的根 CA 或中间 CA 的 PEM 文件。只含证书内容,不能有私钥、空行、注释或多余字符;权限设为600,属主为www-data(或对应运行用户) -
SSLVerifyClient require:强制客户端在握手时提供证书,且签名必须可被上述 CA 验证;optional和optional_no_ca不满足生产要求 -
SSLVerifyDepth 2:明确证书链深度(例如:根 CA → 中间 CA → 客户端证书,就填2),防止恶意构造超长链引发拒绝服务
只在业务路径启用,避免误伤静态资源
把 `SSLVerifyClient require` 放在 `- 在
<Location "/api/">或<Location "/admin/">块中配置细粒度规则,例如:-
Require ssl-verify-client:仅允许已通过证书验证的请求 -
Require expr %{SSL_CLIENT_S_DN_OU} == "Finance" && %{SSL_CLIENT_VERIFY} == "SUCCESS":进一步按组织单位过滤
-
- 静态资源目录(如
/static/)保持默认单向 HTTPS,不参与客户端验证 - 搭配
SSLRequireSSL确保该路径只接受 HTTPS 请求
把可信身份安全透传给后端
Apache 验证通过后,默认不把证书信息传给 PHP/Java/Python 等后端应用。必须主动导出并注入 HTTP 头:- 启用变量导出:
SSLOptions +StdEnvVars +ExportCertData - 用
RequestHeader注入关键字段:RequestHeader set X-Client-CN "%{SSL_CLIENT_S_DN_CN}s"
RequestHeader set X-Client-OU "%{SSL_CLIENT_S_DN_OU}s"
RequestHeader set X-SSL-Verify "%{SSL_CLIENT_VERIFY}s" - 后端必须先校验
X-SSL-Verify == "SUCCESS",再解析其他字段做权限判断,不可跳过验证直接信任头内容
补全吊销检查,形成安全闭环
仅验证签名和有效期不够,证书可能已被主动吊销。企业级场景必须启用实时状态检查:- 推荐 OCSP Stapling(低延迟、隐私友好):
SSLUseStapling on
SSLStaplingCache shmcb:/var/run/ocsp(128000)
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 或使用 CRL(需定期更新):
SSLCARevocationFile /etc/apache2/ssl/crl.pem
SSLCARevocationCheck chain
不复杂但容易忽略

















