我正在设置Apache来进行智能卡身份validation。 智能卡login基于由OS驱动程序处理的客户端SSL证书。
我目前只有一个智能卡提供商,但将来有可能有几个。 我不确定Apache 2.2如何。 处理每个位置的客户端authentication。 我做了一些快速testing,似乎只有最后一个SSLCACertificateFile指令是有效的,这听起来不对。
如下所述是否可以在Apache(2.2,2.4)的每个位置具有不同的SSLCACertificateFile,或者SSL协议在某种程度上限制了每个IP不能有多个SSLCACertificateFile?
示例潜在configuration如何在同一台服务器上处理多个SSLCACertificateFile以允许用户使用不同的智能卡提供的login。
<VirtualHost 127.0.0.1:443> # Real men use mod_proxy DocumentRoot "/nowhere" ServerName local-apache ServerAdmin [email protected] SSLEngine on SSLOptions +StdEnvVars +ExportCertData # Server-side HTTPS configuration SSLCertificateFile /etc/apache2/certificate-test/server.crt SSLCertificateKeyFile /etc/apache2/certificate-test/server.key # Normal SSL site traffic does not require verify client SSLVerifyClient none SSLVerifyDepth 999 # Provider 1 <Location /@@smartcard-login> SSLVerifyClient require SSLCACertificateFile /etc/apache2/certificate-test/ca.crt # Apache does not natively pass forward headers # created by SSLOptions +StdEnvVars, # so we pass them forward to Python using RequestHeader # from mod_headers RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e </Location> # Provider 2 <Location /@@smartcard-login-provider-2> # For real SSLVerifyClient require SSLCACertificateFile /etc/apache2/certificate-test/provider2.crt # Apache does not natively pass forward headers # created by SSLOptions +StdEnvVars, # so we pass them forward to Python using RequestHeader # from mod_headers RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e </Location> # Connect to Plone ZEO client1 running on fg ProxyPass / http://localhost:8080/VirtualHostBase/https/local-apache:443/folder_sits/sitsngta/VirtualHostRoot/ ProxyPassReverse / http://localhost:8080/VirtualHostBase/https/local-apache:443/folder_sits/sitsngta/VirtualHostRoot/ </VirtualHost>
正如Vlastimil Zima所回答的那样,您确实可以使用SSLRequire (至less如果您希望/需要在两个CA之间做出区分)。 否则,只要将两个证书合并成一个证书就足够了(就像柯蒂斯所说的那样:是的,你可以合并证书来完成类似的工作)。 看到你的榜样,只是组合就够了。
有了SSLRequire你可以检查发行者(假设CN是不同的),例如:
<Location /locationone> SSLRequire %{SSL_CLIENT_I_DN_CN} == "THE CN OF THE FIRST ISSUER" </location> <Location /locationtwo> SSLRequire %{SSL_CLIENT_I_DN_CN} == "THE CN OF THE SECOND ISSUER" </location>
而为了这个工作,你仍然需要将2个CA证书合并成一个。
指令SSLCACertificateFile具有虚拟主机上下文,所以即使在插入到Location时也会影响整个虚拟主机。 您需要使用SSLRequire来检查客户端是否使用正确的证书进行定位。
http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslrequire