2011-01-13 5 views
21

SSLSocket.getEnabledProtocols()メソッドは、[SSLv2Hello, SSLv3, TLSv1]を返します。 JSSEはないサポートしていますと言う2(確かに古い)の参照をなぜJavaのSSLSocketはバージョン2のクライアントを送信しますか?

main, WRITE: TLSv1 Handshake, length = 81 
main, WRITE: SSLv2 client hello message, length = 110 

しかし、私が見つけた:私はconnect()を呼び出すと、私はSSLのデバッグをオンにしているときには確かに、私はv2のクライアントのhelloが使用されていることがわかりSSLバージョン2:Fundamental Networking in Javaから

'でSSLv2Hello' はJavaはSSLv2の 'ハローメッセージ' とハンドシェイクを開始することを可能に擬似プロトコルです。これはではありません。は、SSLv2プロトコルの使用を引き起こします。これは、Javaではまったくサポートされていません。

そしてJSSE Reference Guideから:

JSSE実装J2SDK 1.4以降では、SSL 3.0およびTLS 1.0を実装しています。 SSL 2.0を実装していません。

は今、私の理解では、バージョン2.0クライアントのhelloのみクライアント サポートSSLバージョン2.0を実行したときに送信されるべきであるということです。 RFC 2246から:SSLバージョンをサポート

TLS 1.0クライアント2.0のサーバーがSSLに バージョン2.0クライアントhelloメッセージ[SSL2] ... 警告を送信する必要があります:能力を2.0クライアントhelloメッセージを段階的に廃止されるバージョンを送信しますすべての急いで急いで。

なぜJavaはそれを使用していますか?

+0

SSLv2Helloは、Sun/Oracle Java 6のJSSEではデフォルトでオンになっていますが、Java 7以降ではオンになっています。例えば、Java 6の場合はwww.howismyssl.comでコネクションを開きます。 – eckes

答えて

17

SunのJSSEはSSLv2をサポートしていませんが、それを必要とする一部のSSLサーバーをサポートするためにSSlv2ClientHelloをサポートしています。有効になっているプロトコルからそれを削除することでオフにすることができます。

IBMのJSSEはSSLv2を完全にサポートしています。 JSSE Reference Guideから

例えば、いくつかの古いサーバー 実装が唯一のSSLv3を話し、 は、TLSを理解していません。理想的には、これらの の実装は SSLv3にネゴシエーションする必要がありますが、単純にハングアップするものもあります。 下位互換性のために、一部のサーバ 実装(SunJSSEなど) SSLv3/TLS ClientHellosを SSLv2 ClientHelloパケットにカプセル化して送信します。一部の サーバはこの形式を受け入れません。 では、これらのケースでは、setEnabledProtocols〜 を使用して、カプセル化された SSLv2 ClientHellosの送信を無効にします。

「サーバーの実装」では上記の「SSLの実装」を読むべきでしょうか?

編集:私の本を引用してくれてありがとう!

+0

あなたの答えをありがとう。あなたは、これらのサーバーは、V2クライアントのおかげで、v3を使って応答すると言っていますか? –

+0

また、好奇心のために、ガイドが参照しているサーバーを知っていますか? ;-) –

+0

@Matt Solnit:(a)はい(b)いいえ。 – EJP

関連する問題