13

リファレンス ガイドを見ています。を作成するにはJSSEのインスタンスを取得する必要があるため、で使用してセキュリティを有効にできます。SSLContextSSLEngineNetty

のインスタンスを取得するにはSSLContext、 を使用しますSSLContext.getInstance()。メソッドが複数回オーバーライドされているので、使用するプロトコルとセキュリティ プロバイダーを選択できます。

ここに、使用できるアルゴリズムのリストが表示されます。安全な通信を有効にするには、どのアルゴリズムを使用すればよいですか?

また、利用するセキュリティプロバイダを指定できるとのことですが、どのプロバイダを利用すればよいのでしょうか?

ありがとう

4

2 に答える 2

29

標準名のドキュメントでわかるように、すべてのエントリ (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(プロトコルSSLSSLv3TLS、 に使用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プロトコルTLSv1TLSv1.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

于 2012-07-16T14:02:37.730 に答える
3

プロトコルにはデフォルトがないため、JDK でサポートされている最新のもの (TLSv1、TLSv1.1、または TLSv1.2 のいずれか) を使用します。どれが機能するかを確認するか、 を参照してくださいgetSupportedProtocols()。デフォルトのセキュリティ プロバイダは、指定したすべての API を回避することによって使用されますKeyStore.getDefaultType()

また、SSLEngine を取得するときは、ホスト名とポートを使用する方法を使用してください。そうしないと、SSL セッション共有が得られません。

于 2012-07-16T12:29:57.067 に答える