5

私は Amazon を使用し、証明書 ( http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pemで入手可能なデフォルトの証明書)RDS MySQLで接続しています。次の手順を実行しています。SSL

  1. ダウンロードしたmysql-ssl-ca-cert.pem
  2. 上記のファイルをJKSフォーマットに変更しました
  3. Spring - Hibernateテンプレートを介してWebアプリケーションから接続し( org.springframework.beans.factory.config.PropertyPlaceholderConfigurer)、さらに を使用してc3p0、追加のURLパラメータを次のように設定していますjdbc:URL/DB?autoReconnect=true&useUniCode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false&requireSSL=true

しかし、私は以下の問題に直面しています...

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0

どうすればこれを修正できますか?

4

2 に答える 2

4

基本的に、SSL パーサーが失われていることを意味します。ソケット層は、SSL プロトコルに適合しないいくつかのバイトを渡しました。

SSL ソケットを使用して送信すると、暗号化されたパケットを作成するためにフォーマットおよび暗号化ルーチンが呼び出されます。次に、プレーン ソケット レイヤーを呼び出して、暗号化されたパケットをサーバーに転送します。サーバーのソケット層はパケットを受信し、SSL パッケージを呼び出してパケットを復号化します。パケットが SSL 形式に適合しない場合、サポートされていないバージョンの例外が発生します。

ソケット層に到着したすべてのバイトは、SSL パッケージに送信されます。したがって、そのエラーを取得する最も簡単な方法は、SSL 接続の確立後にプレーン ソケット レイヤーを使用してプレーン テキスト メッセージを送信することです。

私の特定のケースでは、余分なバイトを送信していたため、このエラー メッセージが表示されました。私の間違いを明確に説明できるかどうか見てみましょう。

(たとえば)100バイトのバッファがありました。バッファに 50 バイトのメッセージを詰め込み、SSL 暗号化ルーチンを呼び出しました。結果のパケットの長さは 75 バイトでした。バッファを送信するために send() を呼び出しました。これは単純なソケット送信です。それは、100バイトのバッファ全体を送信するという、私が指示したことを実行しました。

サーバーでは、100 バイト全体が受信されました。SSL パッケージがパケットの暗号化を解除しようとしました。受信した最初の 75 バイトに完全に適切な SSL メッセージがパックされていることがわかりました。ここまでは順調ですね。次に、残りの 25 バイトの意味を理解しようとしました。それが SECOND SSL メッセージであると主張し、復号化を試みました。それは、その厄介な例外を窒息させて追い出したときです。

コードで何を探すべきかについての手がかりが得られることを願っています。

于 2013-01-09T23:53:22.327 に答える
1

サポートされていないクライアント証明書を提示すると、このエラーが見つかりました。「-Djavax.net.ssl.keyStore」を空白にし、クライアント証明書なしで接続すると機能しました。

http://feed.askmaclean.com/archives/secure-java-connections-by-default.htmlも参照してください。

さまざまな TLS バージョンのサポートは、使用される JRE バージョンによって異なります。特定の TLS バージョンを制限する前に、使用している JDK の機能を確認してください。上記のテストを最初に実行したとき、Eclipse は予想どおり JRE 1.8.0_65 ではなく JRE 1.6.0_45 を使用しており、TLSv1.0 暗号を使用して接続していました。MySQL サーバーが TLSv1.1 と TLSv1.2 のみを許可するように構成されている場合、次の例外を受け取りました。

原因: javax.net.ssl.SSLException: サポートされていないレコード バージョン Unknown-0.0 at com.sun.net.ssl.internal.ssl.InputRecord.readV3Record(InputRecord.java:504)

TLSv1.0 を無効にする前に、古い JRE の使用状況を評価する必要があります。幸いなことに、PERFORMANCE_SCHEMA を使用すると、すべてのアプリケーション サーバーを検査することなく、クライアント JRE を簡単に調査できます。

于 2016-07-04T09:58:19.040 に答える