如何在Apache2服务器中声明明确的允许客户端证书列表
如何在Apache2服务器中声明明确的允许客户端证书列表
看起来你已经搞定了基础的客户端证书验证,但现在想要把访问权限收紧到特定的客户端证书,而不是所有CA签发的都能进——这个需求很常见,我来给你讲具体的实现方法:
第一步:获取目标客户端证书的专有名称(DN)
首先你需要拿到那些被允许访问的客户端证书的Subject DN(专有名称),可以用openssl命令来提取:
openssl x509 -noout -subject -in /path/to/allowed-client-cert.crt
执行后会输出类似这样的内容:
subject=C=US, ST=California, L=San Francisco, O=Example Corp, CN=client1.example.com
你需要把这个格式转换成Apache能识别的斜杠分隔形式,比如:/C=US/ST=California/L=San Francisco/O=Example Corp/CN=client1.example.com
第二步:修改Apache站点配置
在你现有的VirtualHost配置中,保留原有的证书验证基础配置,再添加SSLRequire指令来精确指定允许的客户端证书:
<VirtualHost api.example.com:50002> SSLEngine on SSLCertificateFile /srv/ssl/api.example.com.crt SSLCertificateKeyFile /srv/ssl/api.example.com.key # 保留CA证书验证,确保客户端证书是可信CA签发的 SSLCACertificateFile /srv/example.com.crt SSLVerifyClient require # 精确指定允许的客户端证书DN,多个用||分隔 SSLRequire %{SSL_CLIENT_S_DN} eq "/C=US/ST=California/L=San Francisco/O=Example Corp/CN=client1.example.com" || %{SSL_CLIENT_S_DN} eq "/C=US/ST=New York/L=New York/O=Example Corp/CN=client2.example.com" ProxyPass "/" "http://127.0.0.1:50002/" ProxyPassReverse "/" "http://127.0.0.1:50002/" ProxyPreserveHost on LogLevel debug ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined </VirtualHost>
关键说明
SSLCACertificateFile和SSLVerifyClient require是基础:先确保客户端证书是由你信任的CA签发的,这一步是为了防止伪造的证书。SSLRequire是核心过滤逻辑:只有客户端证书的DN和你指定的完全匹配时,才允许访问。如果允许的证书数量较多,你可以把这些条件写到单独的配置文件里,用Include指令引入,让主配置更整洁。- 如果你想基于证书的其他字段(比如序列号)过滤,也可以用
%{SSL_CLIENT_M_SERIAL}这样的变量来匹配,不过DN匹配是最常用的方式。
修改完配置后,记得重启Apache服务生效:
sudo systemctl restart apache2
备注:内容来源于stack exchange,提问作者Jib
相关产品推荐
相关产品推荐

