web-dev-qa-db-ja.com

Apacheの異なる場所に異なるSSLCACertificateFilesを持つことが可能です(クライアント側のSSL証明書)

スマートカード認証を行うようにApacheを設定しています。スマートカードログインは、OSドライバーによって処理されるクライアント側のSSL証明書に基づいています。

現在、スマートカードプロバイダーは1つしかありませんが、将来的には複数のプロバイダーが存在する可能性があります。 Apache2.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 [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>
5
Mikko Ohtamaa

Vlastimil Zimaが回答したように、これには実際にSSLRequireを使用できます(少なくとも2つのCAを区別する必要がある場合)。それ以外の場合は、2つの証明書を1つに組み合わせるだけで十分です(Curtisの質問によると、そうです。証明書を組み合わせて、このような機能を実現できます)。そして、あなたの例を見ると、組み合わせるだけで十分です。

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証明書を1つに結合する必要があります。

3
DelGurth

ディレクティブSSLCACertificateFileには仮想ホストコンテキストがあるため、Locationに挿入された場合でも仮想ホスト全体に影響します。 SSLRequireを使用して、クライアントが場所に正しい証明書を使用しているかどうかを確認する必要があります。

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

1
Vlastimil Zíma