在 Apache 的不同位置下可能有不同的 SSLCACertificateFiles(客户端 ssl 证书)

Mik*_*maa 5 ssl https openssl apache-2.2

我正在设置 Apache 来进行智能卡身份验证。智能卡登录基于由操作系统驱动程序处理的客户端 SSL 证书。

我目前只有一个智能卡提供商,但将来可能会有几个。我不确定 Apache 2.2. 处理每个位置的客户端认证。我做了一些快速测试,不知何故似乎只有最后一个 SSLCACertificateFile 指令才会有效,这听起来不对。

如下所述,是否可以在 Apache(2.2、2.4)中的每个位置使用不同的 SSLCACertificateFile,或者 SSL 协议是否以某种方式限制了每个 IP 不能拥有多个 SSLCACertificateFile?

下面的示例潜在配置我希望如何在同一服务器上处理多个 SSLCACertificateFile 以允许用户使用不同的智能卡提供登录。

<VirtualHost 127.0.0.1:443>

    # Real men use mod_proxy
    DocumentRoot "/nowhere"

    ServerName local-apache
    ServerAdmin you@example.com

    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>
Run Code Online (Sandbox Code Playgroud)

小智 5

正如 Vlastimil Zima 所回答的,您确实可以用于SSLRequire此目的(至少如果您想要/需要在两个 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>
Run Code Online (Sandbox Code Playgroud)

为此,您仍然需要将 2 个 CA 证书合并为一个。


小智 2

指令SSLCACertificateFile具有虚拟主机上下文,因此即使插入到Location. 您需要用于SSLRequire检查客户端是否使用正确的位置证书。

http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslrequire