2011-01-28 46 views
10

私はJettyを埋め込んでいるアプリケーションを持っています。私はSSLでクライアント証明書認証を使用したいと思います。要求の開始時に次の例外が発生しています。しかし、その後、リクエストは適切に処理されています。この例外は、IEまたはChromeからアクセスされた場合にのみ発生します。 Firefoxからアクセスしたときには表示されません。 SslSocketConnectorを拡張したカスタムSSLConnectorがあります。私はそれをデバッグしようとしています。チェックを開始できる特定の場所/コードがあるかどうかを知りたがっています。要求の開始時に例外が発生しました - ClientAuth SSL

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:808) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123) 
     at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:631) 
     at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:451) 
Caused by: java.io.EOFException: SSL peer shut down incorrectly 
     at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789) 

更新:

私は、SSLのデバッグオプションを有効にし、すぐにServerHelloDoneメッセージの後、読み取りにこの例外を得ていました。これは、サーバーが証明書をクライアント証明書の要求とと​​もに送信するメッセージです。最初の読書で何が起きているのか分かりません。どんな援助も深く感謝しています。

*** ClientHello, TLSv1 
**** 
%% Created: [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA] 
*** ServerHello, TLSv1 
*** Certificate chain 
*** 
*** CertificateRequest 
Cert Types: RSA, DSS 
Cert Authorities: 
*** ServerHelloDone 
WRITE: TLSv1 Handshake, length = 703 
received EOFException: error 
handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 

アップデート:最新のJDKを更新 、23および有効/無効に二つの特性を試してみました。それでも同じ行動を取る。

詳細情報: TLSv1とSSLv3は、すべてのブラウザで有効です。クライアント認証が有効になっていなければ、通信は適切に行われています。クライアントの認証では、常に最初のハンドシェイクで例外が発生し、次は正常に処理され、例外なく処理されます。サーバー側でjettyバージョン6.1.14を使用

+0

@Danによると、 'javax.net.debug'システムプロパティを' all'または 'debug'に設定する必要があります。ほとんどのJavaランチャーでは、-Djavax.net.debug = all'を引数に追加するだけです。 –

答えて

8

TLS/SSLv3ネゴシエーションでこのような問題が発生しました。 http://www.oracle.com/technetwork/java/javase/documentation/tlsreadme2-176330.html

SSL/TLSでは、どちらの側でも再交渉を開始できます。フェーズ1の修正と同様に、相互運用可能モードでアップグレードされていないピアと通信し、再ネゴシエーションを開始しようとするアプリケーション(SSLSocket.startHandshake()またはSSLEngine.beginHandshake())はSSLHandshakeExceptionIOException)を受信し、接続はシャットダウンされます(handshake_failure)。非アップグレードピアから再ネゴシエーション要求を受け取るアプリケーションは、代わりに、接続の種類に応じて応答する。

  • のTLSv1:タイプ「no_renegotiation(100)」の警告Alertメッセージをピアに送信され、接続は開いたままです。古いバージョンのSunJSSEは、「no_renegotiation」アラートが受信されたときに接続をシャットダウンします。
  • SSLv3:アプリケーションはSSLHandshakeExceptionを受信し、接続は終了します(handshake_failure)。 (「no_renegotiationが」のSSLv3仕様で定義されていない)

これらのモードを設定するには、2つのシステムプロパティが使用される:

  • sun.security.ssl.allowUnsafeRenegotiation - フェーズ1で導入され、これは、レガシー(安全でない)かどうかを制御します再交渉は許可される。
  • sun.security.ssl.allowLegacyHelloMessages - フェーズ2で導入されました。これにより、適切なRFC 5746メッセージを要求せずに、ピアがハンドシェイクできるようになります。

それがまだ解決しない場合は、SSLのdedugをオンにし、ハンドシェイクを見てみてみることができます。
-Djavax.net.debug=all

+0

ありがとうございました。これらのプロパティを設定しても役に立ちませんでした。私はデバッグしようとしました。更新された質問をご覧ください。 – vpram86

+1

これは、追加する方法です:System.setProperty( "sun.security.ssl.allowUnsafeRenegotiation"、 "true"); System.setProperty( "sun.security.ssl.allowLegacyHelloMessages"、 "true"); – tibi

1

最新のjdkをお試しください。彼らはSSLハンドシェークのバグを修正しました。 http://www.java.net/blogs/kumarjayanti/

+0

これを試して、上記の2つのプロパティを設定してもしなくても同じエラーが発生する – vpram86

1

これはTLS/SSLネゴシエーションの問題だと思っています。

デバッグ情報をポーズした後、TLSv1ハンドシェイクを行っていることが示されます。

ブラウザでTLSv1を有効にしてもよろしいですか?

クローム:クロームでTLS 1.0を有効にするために は、次の手順を実行します。Selectタブ "フードの下に"

  • [変更]をクリックしてオプション
  • を選択してください
    1. レンチアイコンをクリックしますプロキシ設定
    2. 「詳細設定」タブを選択
    3. TLS 1.0を小さくしてチェックする
    4. 開いているブラウザをすべて閉じて再起動します。

    IE:

    1. [ツール]メニューをクリックし
    2. スクロールTLS 1.0

    のFirefoxを有効

  • セキュリティ]セクションに[詳細設定]タブインターネットオプション
  • をクリックします:

    1. [ツール]をクリックします
    2. [オプション]をクリックします
    3. [詳細設定]タブ
    4. 暗号化]タブ
    5. あなたは、その後もいることに言及TLS 1.0

    を有効にする:

    はこれがありますメッセージは、その証明書を クライアント証明書の要求と共に送信します。

    テストしている各Webブラウザにクライアント証明書をインストールしましたか?

    最初に相互/クライアント認証を行わずにすべての機能を使用できるようにしてから、動作したら元に戻してください。

  • +0

    はいDan。 TLSv1とSSLv3はすべてのブラウザで有効です。クライアント証明書がインストールされ、2番目のハンドシェイクから正常に動作します。私が言ったように、この例外を与えたのはちょうど最初の握手です。 2回目;私は証明書を選択することができ、通信はそれ以降は正常です。私はclient-authを無効にし、その例外は何も例外なくチェックしました。 : – vpram86

    +0

    「最初の時間」と「2回目」の意味をより具体的にする必要があると思います。クライアント側またはサーバー側から明示された意味ですか? net.debug = allを最初の実行から実行し、2回目の実行をファイルに書き出します。タイムスタンプ(perl、テキストエディタのマクロなど)を取り除き、2つのファイルを並べて比較し、重大な不一致を探します。私はクライアントが失敗した要求と成功した要求に同じクライアント証明書(指紋/ハッシュ)を提示しているかどうかを知りたいです。 – Dan

    +0

    サーバ側でデバッグが有効になっています。この現象は、クライアント証明書の選択ウィンドウがポップアップする前でも発生しています。ユーザーの観点からは違いは見えませんが、実際には2番目のハンドシェイクでのみ接続されています。どこかにssltapしてリンクしてください。私が見る限り、彼らはほとんど同じです。しかし、私は何かが欠けているかもしれません。 – vpram86

    3

    私は誤ってURLに非SSLポートを入れたが、httpsでURLを開始したときにこれを取得しました。 Doh。

    時には最も簡単な解決策は、私たちが忘れているものです!

    関連する問題