これは "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が空になりました)。
ありがとうございました。また、[http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#Introduction(JSSEリファレンスガイド)によると、SUNのSSLEngineはSSLv2をサポートしていません。だから私はクライアントに何を返すべきですか?接続をシャットダウンするだけですか? – Peter
このSSLv2 ClientHelloで開始されたより高いバージョンのSSL/TLSをサポートしています(サポートされているバージョンがSSLv3またはTLS 1.xであることを前提としています)。そのメッセージはSSLv3 ServerHelloで返信されます。 80 4F 01 03 00'。 – Bruno
申し訳ありませんが、私は早すぎる入力キーを押す。だから、私はSSLv2 ServerHelloでSSLv2 ClientHelloに応答すべきだと言っていますか? – Peter