Apache通过mod_ssl实现客户端双向证书认证需配置SSLCACertificateFile指定可信CA、SSLVerifyClient require强制验证,并在<Location>中用Require expr等规则细粒度控制访问,同时透传SSL_CLIENT_S_DN_CN等变量供后端鉴权。

Apache 可以通过启用客户端证书认证(Client Certificate Authentication)并配合 SSL/TLS 配置参数,实现对 HTTPS 请求中客户端证书的验证与过滤。这不是默认开启的功能,需显式配置证书信任链、校验策略和访问控制规则。
启用 SSL 模块并配置基础 HTTPS
确保 mod_ssl 已加载,并已正确部署服务器证书和私钥,监听 443 端口:
- 在 Ubuntu/Debian 上执行:
sudo a2enmod ssl;在 CentOS/RHEL 上确认mod_ssl已安装(如yum install mod_ssl) - 虚拟主机中必须包含:
SSLEngine on、SSLCertificateFile、SSLCertificateKeyFile - 若使用中间证书,添加
SSLCertificateChainFile或合并到主证书文件中
指定可信 CA 并要求客户端提供证书
让 Apache 验证客户端证书,关键在于告诉服务器“信任哪些根/中间 CA”,以及“是否强制提交”:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
SSLVerifyClient require:强制每个 HTTPS 请求携带有效客户端证书 -
SSLVerifyClient optional:允许带或不带证书,但有证书时仍会校验 -
SSLCACertificateFile /etc/apache2/ssl/ca-bundle.crt:指定受信任的 CA 证书包(PEM 格式,可含多个 CA) - 或使用目录方式:
SSLCACertificatePath /etc/apache2/ssl/certs/(需用c_rehash工具生成符号链接)
按证书属性做访问控制过滤
校验通过后,Apache 将客户端证书信息暴露为环境变量(如 SSL_CLIENT_S_DN_CN、SSL_CLIENT_M_SERIAL),可用于细粒度授权:
- 在
<Directory>或<Location>块中使用SSLRequire表达式,例如:SSLRequire %{SSL_CLIENT_S_DN_O} eq "MyCompany" and %{SSL_CLIENT_M_SERIAL} in {"1A2B", "3C4D"} - 更现代写法(推荐 Apache 2.4+):
Require expr %{SSL_CLIENT_S_DN_CN} =~ /^admin-.*$/Require ssl-client-cert(先确保证书已存在且可信) - 结合
SSLUserName SSL_CLIENT_S_DN_CN可将证书 CN 映射为 HTTP 认证用户名,供后续模块(如 authz_core)使用
调试与常见注意事项
配置生效前务必测试语法并重启服务,同时注意几个易错点:
- 运行
sudo apachectl configtest确认无语法错误;再sudo systemctl restart apache2(或 httpd) - 客户端证书必须由
SSLCACertificateFile中列出的 CA 签发,自签名证书需把其根证书也加入该文件 - 浏览器访问时若提示“选择证书”,说明服务端已发出证书请求;若直接 403,则可能是证书未通过校验或
Require规则拒绝 - 日志中开启详细 SSL 日志有助于排查:
LogLevel ssl:trace5(临时启用,避免生产环境长期开启)

















