2012-04-17 63 views
1

これは "SSL Handshaking Using Self-Signed Certs and SSLEngine (JSSE)"へのフォローアップの質問です。SSLEngine(JSSE)を使用している古いクライアントとのSSLハンドシェイク

私は、同じポート上でSSLメッセージと非SSLメッセージを処理できるNIO Webサーバーを実装しました。 SSLと非SSLのメッセージを区別するために、着信要求の最初のバイトがSSL/TLSメッセージかどうかを確認します。例:parseTLSで

byte a = read(buf); 
if (totalBytesRead==1 && (a>19 && a<25)){ 
    parseTLS(buf); 
} 

()メソッド私は握手、ラップ/アンラップメッセージを開始し、SSLEngineのをインスタンス化、などすべてがFirefoxの10、IE 9、Safariの5(最も近代的なWebブラウザのため正常に動作するようです、など)。

問題は、IE 6やJavaのURLConnectionクラスのような古いWebブラウザは、SSL/TLSハンドシェイクを別々に開始しているようです。例えば、このようなIE 6ルック何か(16進値)から最初の数バイト:私はSSLEngineのにメッセージを渡すと

80 4F 01 03 00 ... 

は、メッセージを認識しているように見えると例外をスローしません。

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

IE 6とJavaのURLConnectionクラスが送信するのは正確ですか?これは、JSSE SSLEngineがサポートできる有効なSSL/TLSメッセージですか?別のメッセージを送信するためにクライアントといくつかの前処理またはネゴシエーションを行う必要がありますか?

ありがとうございます!

UPDATE

ブルーノとEJPに感謝し、さらにいくつかのデバッグ私は何が起こっているのより良い理解を持っています。 Bruno氏が正しく指摘しているように、IE6とJava 6クライアントはSSLv2 ClientHelloを送信しています。以前のコメントの1つとは異なり、Java 1.6のSSLEngineは実際にSSLv2メッセージをアンラップし、有効な応答を生成してクライアントに送り返すことができます。私が以前に報告したSSLExceptionは私の側のエラーであり、SSLEngineとは何の関係もありませんでした(クライアントがデータを送信したと誤って推測され、SSLEngineがデータをunwrapするときにByteBufferが空になりました)。

答えて

4

これはan SSLv2 Client Hello (see TLS specification)のようになります。

TLS 1.1 SSLバージョン2.0のサーバーをサポートするクライアントは、SSLに バージョン2.0クライアントhelloメッセージ[SSL2]を送らなければなりません。 TLSサーバは、同じ接続ポート 上のSSL 2.0クライアントをサポートする場合は、 クライアントのhello形式を受け入れるべきです(SHOULD)。バージョン2.0 仕様からの唯一の逸脱は、 の値を持つバージョンを指定する機能と、CipherSpecでより多くの暗号化タイプをサポートすることです。

  • 80 4Fmsg_length description参照)の長さであり、高いビットが1に設定されなければなりません。
  • 01
  • 03 00が最高のサポートされているバージョンである(ここでのSSLv3)メッセージタイプ(クライアントこんにちは)でのJava 7、this is now disabled by default以来

EDIT:

ただ、明確に、これは本当にこんにちはSSLv2のクライアントではありません、これはSSLv2の形式でのSSLv3のクライアントこんにちはです。この場合、サーバーは(適切な)SSLv3サーバーHello(03 00要求されたバージョン番号に対応)で応答します。この形式の使用法は徐々に廃止されていますが、TLS 1.0,1.1および1.2でも同様です。

JSSE 7 SSLServerSocketはこのようなクライアントHelloをまだ理解しており、SSLv3/TLS1.x Server Helloで適切に応答します。

+0

ありがとうございました。また、[http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#Introduction(JSSEリファレンスガイド)によると、SUNのSSLEngineはSSLv2をサポートしていません。だから私はクライアントに何を返すべきですか?接続をシャットダウンするだけですか? – Peter

+0

このSSLv2 ClientHelloで開始されたより高いバージョンのSSL/TLSをサポートしています(サポートされているバージョンがSSLv3またはTLS 1.xであることを前提としています)。そのメッセージはSSLv3 ServerHelloで返信されます。 80 4F 01 03 00'。 – Bruno

+0

申し訳ありませんが、私は早すぎる入力キーを押す。だから、私はSSLv2 ServerHelloでSSLv2 ClientHelloに応答すべきだと言っていますか? – Peter

関連する問題