スマートカード認証を行うように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>
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つに結合する必要があります。
ディレクティブSSLCACertificateFile
には仮想ホストコンテキストがあるため、Location
に挿入された場合でも仮想ホスト全体に影響します。 SSLRequire
を使用して、クライアントが場所に正しい証明書を使用しているかどうかを確認する必要があります。
http://httpd.Apache.org/docs/2.2/mod/mod_ssl.html#sslrequire