apache双向ssl认证需同时配置sslverifyclient require、sslcacertificatefile(路径正确且权限600)和sslverifydepth,缺一不可;否则握手失败报500或验证失效,且必须使用同一私有ca签发客户端证书。
apache 的 mod_ssl 本身不直接“支持双向认证”,而是通过 ssl/tls 握手阶段的客户端证书校验机制实现。关键在于正确启用并配置 sslverifyclient 指令,同时确保服务端具备验证能力——这依赖于 sslcacertificatefile(或 sslcacertificatepath)提供可信的 ca 证书链。
必须配置的三项核心指令
缺一不可,否则握手失败或形同虚设:
- SSLVerifyClient require:强制客户端在 TLS 握手时提供证书;仅写这一行会导致 500 错误,因为 Apache 会立即尝试构建信任链
- SSLCACertificateFile /path/to/ca-bundle.pem:指定包含根 CA 和(可选)中间 CA 证书的 PEM 文件;路径必须绝对、文件权限为 600、属主为 Apache 运行用户(如 www-data 或 apache)
- SSLVerifyDepth 2:设置证书链最大验证深度;一般填 2 即可(根 CA → 中间 CA → 客户端证书),若只用自签名根 CA 签发客户端证书,填 1 也够用
配套的安全加固配置
避免协议降级与弱算法被利用:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1:仅允许 TLS 1.2 及以上版本
- SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:明确启用前向保密且高强度的密码套件
- SSLHonorCipherOrder on:强制使用服务器优先的密码套件顺序
- SSLCompression off:禁用压缩,防范 CRIME 类攻击
如何把证书信息传给后端应用
客户端证书中的身份字段(如 CN、OU)可用于登录鉴权,需显式导出为 HTTP 头:
-
RequestHeader set X-SSL-Client-DN "%{SSL_CLIENT_S_DN}s":完整 DN 字符串,例如
CN=alice,OU=dev,O=company - RequestHeader set X-SSL-Client-CN "%{SSL_CLIENT_S_DN_CN}s":直接提取 CN 值,适合映射为用户名
-
RequestHeader set X-SSL-Verify "%{SSL_CLIENT_VERIFY}s":值为
SUCCESS或FAILED,便于快速判断校验结果
常见错误与排查要点
遇到 500 或无提示就跳转,大概率是以下问题:
- SSLCACertificateFile 路径错误、文件不存在、权限不是 600、内容含多余空行或注释
- 用了
SSLVerifyClient optional_no_ca:它不校验签名,DN 字段不可信,不能用于身份绑定 - 客户端证书未用同一私有 CA 签发(公有 CA 如 Let’s Encrypt 不签发客户端证书)
- Apache 未加载 mod_ssl 模块(
a2enmod ssl或检查LoadModule ssl_module是否启用)










