You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:15:27