web-dev-qa-db-ja.com

Locationディレクティブが設定されている場合、クライアント証明書認証sslv3アラートハンドシェイクの失敗

Railsで実行されているWebサービスのクライアント証明書認証を設定しようとしています。このサービスは、Apache2、passenger、およびmod_sslで実行されています。キーを正常に生成し、ドメイン全体のクライアント証明書認証を設定することができました。これは正常に機能しますが、Locationディレクティブを含めようとすると、常にこのエラーが発生します(ブラウザーおよびRubyクライアント)から):

SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure (OpenSSL::SSL::SSLError).  

Curlからコマンドを実行すると、次のエラーが発生します。

curl: (52) Empty reply from server

ディレクティブを削除すると、正常に動作します。これは、この仮想ホストに対する私の確認の様子です。

 <VirtualHost *:443 *:80>
    ServerName wrangler.optimis.local
    DocumentRoot "/Users/jmoore/Sites/data-wrangler/public/"
    RackEnv development
    ErrorLog "/Users/jmoore/Sites/data-wrangler/log/error.log"
    CustomLog "/Users/jmoore/Sites/data-wrangler/log/access.log" common
    SetEnv GEM_HOME /Users/jmoore/.rvm/gems/ree-1.8.7-2010.02
    SetEnv GEM_PATH /Users/jmoore/.rvm/gems/ree-1.8.7-2010.02

# Enable SSL on this domain
SSLEngine on
SSLProtocol ALL
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/Apache2/ssl.key/new/wrangler_servercert.pem
SSLCertificateKeyFile /etc/Apache2/ssl.key/new/wrangler_server.nopass.key

# Enable SSL client certificates, but disable verification for the entire domain (we only want it on specific URLs)
#SSLCACertificatePath /etc/Apache2/ssl.key/new/demoCA
SSLCACertificateFile /etc/Apache2/ssl.key/new/demoCA/cacert.pem
#SSLCertificateChainFile /etc/Apache2/ssl.key/new/demoCA/cacert.pem
#SSLVerifyClient require
SSLVerifyClient none
#SSLVerifyDepth 1

<Location /test>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>

 </VirtualHost>

私の調査によると、これは通常、証明書の不良が原因であるため、証明書を数回再生成し、そのたびにドメイン全体で正常に機能しますが、1つの場所だけに制限しようとするとハンドシェイクエラーが発生します。これらの構成はApacheのドキュメントで提案されているため、何が問題になっているのかわかりません。クライアント認証を1つの場所に制限しようとしたときに発生するハンドシェイクの問題を解決する方法を知っている人はいますか?

2
Josh Moore

サーバーはTLS再ネゴシエーション拡張機能(RFC 5746)をサポートしていますか?再ネゴシエーションを完全にブロックするバージョンのOpenSSLがありますか(これはCVE-2009-3555の暫定修正でした)?

SSLVerifyClientが場所に制限されている場合、これには、クライアント証明書を再ネゴシエートするための2回目のハンドシェイクが必要です。これは、SSL/TLS(CVE-2009-3555)のセキュリティ問題が発生していた場所であり、RFC 5746が修正したものです(クライアントもサポートしている場合)。

このStackOverflowの回答 のバージョンに関する詳細情報。

1
Bruno

問題はSSLVerifyClientディレクティブです。ロケーションまたはディレクトリ内にある場合、この問題が発生します。 SSLVerifyClientは必須であり、SSLVerifyDepthは仮想ホストレベルで設定する必要があります。

1