Apache实现mTLS需配置SSLVerifyClient require强制客户端提供证书、SSLCACertificateFile指定可信CA、SSLVerifyDepth设置证书链深度,三者缺一不可,否则返回500错误。

Apache 中实现客户端身份验证(即 mTLS,双向 TLS)需要服务端主动要求客户端提供证书,并校验其有效性。这不是仅靠 SSLProxyVerify 能完成的事——那是用于代理场景下验证后端服务器的。客户端身份验证发生在 Apache 作为 HTTPS 服务端时,由 SSLVerifyClient 指令控制。
启用 SSLVerifyClient 并指定校验级别
在虚拟主机或目录配置中,必须开启 SSL 并设置客户端证书校验策略:
- SSLVerifyClient require:强制每个连接都提交有效客户端证书,且证书链可被信任;未提供或校验失败将返回 400 或 403
- SSLVerifyClient optional:接受客户端证书(如果提供),但不强制;可用于区分不同权限用户
- SSLVerifyClient optional_no_ca:接收证书但跳过 CA 签名验证(仅解析结构),基本无安全意义,慎用
指定可信客户端 CA 根证书
Apache 不会自动使用系统 CA 仓库。必须显式加载签发客户端证书的根 CA 或中间 CA:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- SSLCACertificateFile /path/to/client-ca.pem:指向单个 PEM 文件,含一个或多个 CA 证书
-
SSLCACertificatePath /path/to/ca-dir/:指向目录,需按 OpenSSL 哈希格式命名(如
abcd1234.0),并运行c_rehash - 文件权限应为
600,属主为 Apache 运行用户(如www-data),否则启动时报错或静默失败
控制证书字段提取与传递
验证通过后,可将证书信息注入请求头,供后端应用识别用户身份:
- SSLUserName SSL_CLIENT_S_DN_CN:把证书主题中的 CN 字段设为 REMOTE_USER,支持 Basic Auth 集成
-
SSLOptions +StdEnvVars +ExportCertData:导出完整证书及环境变量(如
SSL_CLIENT_CERT、SSL_CLIENT_VERIFY) - 常用可传递字段包括:
SSL_CLIENT_S_DN(完整 DN)、SSL_CLIENT_I_DN(签发者 DN)、SSL_CLIENT_M_SERIAL(序列号)、SSL_CLIENT_V_START/END(有效期)
调试与常见问题
配置后若连接失败,优先检查以下环节:
- 用
openssl s_client -connect yoursite.com:443 -cert client.crt -key client.key -CAfile client-ca.pem模拟真实握手,观察Verify return code - 确认客户端证书未过期、未被吊销,且由
SSLCACertificateFile所指 CA 签发 - 浏览器访问时,若未弹出证书选择框,可能是服务端未发送 CertificateRequest 消息——检查是否漏配
SSLVerifyClient或 CA 路径错误 - 日志中出现
SSL handshake failed但无细节时,启用LogLevel ssl:trace5查看握手各阶段状态

















