10

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

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に更新し、2つのプロパティを有効/無効にして試してみました。それでも同じ振る舞いをします。

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

4

4 に答える 4

8

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

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

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

これらのモードを設定するには、次の2つのシステムプロパティを使用します。

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

それでも問題が解決しない場合は、SSL dedugをオンにして、ハンドシェイクを確認してみてください。
-Djavax.net.debug=all

于 2011-01-28T11:52:41.387 に答える
3

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

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

于 2012-08-25T12:49:41.290 に答える
1

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

于 2011-02-02T05:51:27.530 に答える
1

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

デバッグ情報を提示すると、TLSv1ハンドシェイクを実行していることが示されます。

ブラウザでTLSv1が有効になっていることを確認しますか?

Chrome:ChromeでTLS 1.0を有効にするには、次の手順を実行します。

  1. レンチアイコンをクリックします。
  2. オプションを選択
  3. [フードの下]タブを選択します
  4. [プロキシ設定の変更]をクリックします
  5. 「詳細」タブを選択
  6. スコールダウンしてTLS1.0を確認します
  7. 開いているすべてのブラウザを閉じて再起動します。

IE:

  1. [ツール]メニューをクリックします
  2. [インターネットオプション]をクリックします
  3. 詳細設定タブ
  4. [セキュリティ]セクションまでスクロールします
  5. TLS1.0を有効にする

Firefox:

  1. [ツール]をクリックします
  2. [オプション]をクリックします
  3. 詳細設定タブ
  4. [暗号化]タブ
  5. TLS1.0を有効にする

次に、次のことにも言及します。

これは、サーバーがクライアント証明書の要求とと​​もに証明書を送信するメッセージです。

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

最初に相互認証/クライアント認証なしですべてが機能することを確認してから、機能したら、再び追加します。

于 2011-02-05T19:09:23.860 に答える