クライアント証明書を受け取り、それを別のサーバーに渡すようにApacheを構成したいと思います。私が使用しているもの:
私はこの設定を試しました:
<VirtualHost *:443>
ServerName apacheserver.domain.com
SSLEngine on
SSLProxyEngine on
SSLCertificateFile "e:/Apache/Apache2/conf/server.cer"
SSLCertificateKeyFile "e:/Apache/Apache2/conf/server.key"
SSLCACertificateFile "e:/Apache/Apache2/conf/certca.cer"
SSLVerifyClient require
SSLVerifyDepth 2
ProxyPreserveHost on
ProxyRequests off
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
# initialize the special headers to a blank value to avoid http header forgeries
RequestHeader set SSL_CLIENT_S_DN ""
RequestHeader set SSL_CLIENT_I_DN ""
RequestHeader set SSL_SERVER_S_DN_OU ""
RequestHeader set SSL_CLIENT_VERIFY ""
<Directory />
# add all the SSL_* you need in the internal web application
RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}e"
RequestHeader set SSL_CLIENT_I_DN "%{SSL_CLIENT_I_DN}e"
RequestHeader set SSL_SERVER_S_DN_OU "%{SSL_SERVER_S_DN_OU}e"
RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}e"
ProxyPass https://192.168.10.191/
ProxyPassReverse https://192.168.10.191/
</Directory>
</VirtualHost>
この設定を試してみると、Apacheのerror.logファイルに次のエラーがあります。
[Tue Dec 31 12:14:52 2013] [warn] Proxy client certificate callback: (apacheserver.domain.com:443) downstream server wanted client certificate but none are configured
何か案は?
クライアント証明書は、SSL接続でユーザーのIDを確認するために使用されます。検証は、公開鍵暗号を使用して行われます。クライアントは秘密鍵で何かに署名し、署名は公開鍵で検証できます。また、秘密鍵はクライアントだけが知っているが、公開鍵はすべての人に知られている(証明書に含まれている)ため、署名できるのはクライアントだけですが、誰もが署名を確認できます。したがって、署名されたテキストはクライアントからのものであることが証明されます。 。
クライアント証明書を要求するプロキシとしてApacheを使用する場合、Apacheはクライアント公開鍵を含む証明書を受け取り、クライアントの署名を検証できます。ただし、クライアントの秘密鍵にアクセスできないため、クライアントの元の証明書を使用して別のhttps接続を作成することはできません。クライアントの証明書を確認してから、重要な情報をHTTPヘッダーとしてアップストリームサーバーに転送するだけです。
クライアント証明書からの情報をHTTPヘッダー内に配置しようとしているように見えますが、アップストリームサーバーにはさらに多くの情報が必要です。提供できないクライアント証明書が必要です(エラーメッセージ:「..ダウンストリームサーバーがクライアント証明書を必要としていました..」)。したがって、アップストリームサーバーを変更して、クライアント証明書なしで接続を受け入れ、プロキシに挿入したHTTPヘッダーから認証情報を読み取るようにする必要があります。
使用する http:
の代わりに https:
ProxyPass
ディレクティブ内。 Apacheはヘッダーでクライアント証明書を渡します。