web-dev-qa-db-ja.com

Apacheでのクライアント証明書認証の構成

クライアント認証を要求するために、ApacheでVirtualhostの一部をセットアップしようとしています。問題のVirtualHostは、実際のWebサーバーのリバースプロキシとしても機能します。これが私がやったことです:

  • CAとして使用しているサーバー上にca.crtca.csr、およびca.keyを作成しました。
  • VirtualHostの設定を次のように変更しました:

...

ProxyPass / http://xxx.xxx.xxx.xxx:80/
ProxyPassReverse / http://xxx.xxx.xxx.xxx:80/
ProxyPassReverseCookiePath / /

SSLEngine On
SSLCertificateFile "/private/etc/Apache2/server.crt"
SSLCertificateKeyFile "/private/etc/Apache2/server.key"
SSLCertificateChainFile "/private/etc/Apache2/ca_bundle.crt"
SSLCACertificateFile "/private/etc/Apache2/self_ca.crt"
SSLVerifyClient none
SSLOptions StrictRequire   
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

<Location /clientauth>
    # These options force the client to authenticate with a client certificate.
    SSLVerifyClient require
    SSLVerifyDepth 1
</Location>
  • カスタムCAを使用してテストクライアント証明書を作成しました。
  • クライアント証明書をMac OS X Lionのログインキーチェーンにインストールし、手動でFirefoxにインストールしました。

しかし、/clientauthパスを参照できません。

  • Firefoxは、「SSLピアは、許容可能なセキュリティパラメータのセットをネゴシエートできなかった」と述べています。
  • Operaは「安全な接続:サーバーからの致命的なエラー(40)」と言います。
  • ChromeとSafariは「HTTP 403 Forbidden」と言います。
  • 何らかの理由でcURL(.p12ファイルを使用)がキーを見つけられません...
  • cURL(.crtファイルと.keyファイルを使用)はハンドシェイクを実行し、要求を送信してから、「サーバーからの空の応答」と言います。
  • ApacheエラーログはRe-negotiation handshake failed: Not accepted by client!?という行を繰り返し続けます

これはクライアント認証の使用とリバースプロキシの競合ですか?それとも私は何か間違ったことをしましたか?

8
DanielGibbs

ここでの根本的な問題は、再交渉の拒否です。これは、TLSの脆弱性を修正するための過去1〜2年の活動に起因しており、新しいTLS拡張が実装されるまで再ネゴシエーションを拒否するさまざまな暫定的な修正がありました。したがって、SSL(OpenSSL)を確実にして、Apache HTTPDもできるだけ最新であることを確認する必要があります。

5
user207421

HTTPクライアントは、SSLセッションがネゴシエートされた後でのみHTTP要求を送信します。つまり、サーバーは、SSLがセットアップされた後のみ、クライアントによって要求されたURLを認識します。 URLに基​​づいてSSLVerifyClientの値を変更しているので、ApacheはSSLセッションが最初にネゴシエートされるときにクライアント証明書を要求できません。代わりに、URLがわかると、セッションの再ネゴシエーションを強制する必要があります。問題はこの再交渉にあるようですので、SSLVerifyClient requireVirtualHostブロックに追加し、Locationブロックから削除します。

5
mgorven