標準名のドキュメントでわかるように、すべてのエントリ (SSLv3、TLSv1.0、TLSv1.1、...) は、他のバージョンをサポートする可能性があると述べています。
実際には、Oracle JDK (および OpenJDK) では、それらはすべて実行されます。ソース コードを見ると、TLS10Contextクラスは TLS、SSL、SSLv3 および TLS10 にTLS11Context使用されるものであり、TLSv1.1 および TLSv1.2 に使用されTLS12Contextます。すべてが SSL/TLS のすべてのバージョンをサポートします。デフォルトで有効になっているものはさまざまです。
これは、別のプロバイダーまたは JRE ベンダーによって異なる場合があります。もちろん、少なくとも使用したいプロトコル バージョンをサポートするものを選択する必要があります。
使用されるプロトコルは、後で使用するSSLSocket.setEnabledProtocols(...)か、またはSSLEngine同等のものを使用して決定されることに注意してください。
原則として、できるだけ高いバージョン番号 (SSLv3 < TLSv1.0 < TLSv1.1 ...) を使用します。これは、通信相手が何をサポートしているかによって異なります。
デフォルトで有効になるプロトコルは、Oracle JRE の正確なバージョンによって異なります。
OpenJDK 7u40-b43のソース コードをsun.security.ssl.SunJSSE見ると、プロトコルに関しては(および も同様)TLSは単なるエイリアスです。(それ自体の内部クラスである)のさまざまな実装を見る:TLSv1SSLSSLv3SSLContextSSLContextImplSSLContextImpl
- すべてがすべてのプロトコルをサポートします。
- デフォルトでは、すべてのプロトコルがサーバー側で有効になっています。
- デフォルトで有効になっているクライアント側のプロトコルはさまざまです。
TLS10Context(プロトコルSSL、SSLv3、TLS、 に使用TLSv1) は、クライアント側でデフォルトで SSLv3 から TLSv1.0 を有効にします。
TLS11Context( protocol に使用TLSv1.1) もデフォルトで TLSv1.1 を有効にします。
TLS12Context( protocol に使用TLSv1.2) もデフォルトで TLSv1.2 を有効にします。
- FIPS が有効になっている場合、SSL はサポートされません (デフォルトでは有効になっていません)。
これは、Java 8 で、新しいjdk.tls.client.protocolsシステム プロパティと連動して変更されます。
繰り返しになりますが、OpenJDK 8u40-b25のソース コードをsun.security.ssl.SunJSSE見ると、SSLContextプロトコルTLSv1、TLSv1.1、およびも 、 、およびTLSv1.2を利用しており、これらは Java 7 と同じロジックに従います。TLS10ContextTLS11ContextTLS12Context
ただし、プロトコルTLSはそれらのいずれにもエイリアスされなくなりました。むしろ、システム プロパティTLSContextの値に依存する which を使用します。JSSEリファレンスガイドjdk.tls.client.protocolsから:
クライアントで特定の SunJSSE プロトコルを有効にするには、それらを引用符で囲んでカンマ区切りのリストで指定します。その後、サポートされている他のすべてのプロトコルがクライアントで無効になります。たとえば、このプロパティの値が「TLSv1,TLSv1.1」の場合、TLSv1 および TLSv1.1 のクライアントのデフォルト プロトコル設定はクライアントで有効になり、SSLv3、TLSv1.2、および SSLv2Hello は無効になります。クライアント。
このプロパティが空の場合、クライアント側とサーバー側の両方ですべてのプロトコルがデフォルトで有効になります。
もちろん、Oracle JRE 8 の最近のバージョンでは、SSL もデフォルトで完全に無効になっています(そのため、これらのリストから削除されています)。
どちらの場合も (JRE 7 および 8)、SSLContextデフォルトで取得するは、プロトコルを使用して取得し、デフォルトのトラストストア パラメータなどで初期化したSSLContext.getDefault()ものとほぼ同じであることに注意してください。SSLContextTLS