Java 7のクライアントでTLS 1.1および1.2を有効にする


50

Java 7は、クライアントのTLS 1.1および1.2を無効にします。Java暗号化アーキテクチャOracleプロバイダのドキュメント

Java SE 7リリースのSunJSSEはTLS 1.1とTLS 1.2をサポートしますが、どちらのバージョンもデフォルトではクライアント接続に対して有効になりません。一部のサーバーは、前方互換性を正しく実装せず、TLS 1.1またはTLS 1.2クライアントとの通信を拒否します。相互運用性のために、SunJSSEはクライアント接続に対してデフォルトでTLS 1.1またはTLS 1.2を有効にしません。

Javaアプリケーションごとのソリューションではなく、システム全体の設定でプロトコルを有効にすることに興味があります(おそらく、構成ファイルを使用して)。

TLS 1.1および1.2 システム全体で管理上有効にするにはどうすればよいですか?

:POODLE以降、システム全体で SSLv3を管理上無効にします。(SSLv3の問題は少なくとも15年前にPOODLEよりも前にありましたが、Java / Oracle / Developersは基本的なベストプラクティスを尊重していなかったため、あなたや私のようなユーザーは混乱を片付けなければなりません)。


Javaバージョンは次のとおりです。

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

私のために働いたのは、ここで説明されているようにデフォルトのSSLContextを設定することだけでした:stackoverflow.com/questions/39157422/…–
shmert

回答:


31

次のプロパティ-Dhttps.protocols=TLSv1.1,TLSv1.2を追加するだけで、JVMを構成し、https接続中に使用するTLSプロトコルバージョンを指定できます。


6
これが何をするのかを詳しく説明してください。そうでなければ、これはあいまいで、間違った手で損傷を与える可能性があります。
studiohack

1
@Thomasz-私はここで他の人に同意します...システム全体で管理するにはどうすればよいですか?マシンの構成ファイルに追加されますか?もしそうなら、ファイルは何ですか、どこに追加しますか?
jww

3
このリンクは役立つかもしれ ません:blogs.oracle.com/java-platform-group/entry/…コマンドラインの例で-Dhttps.protocolsプロパティをパラメーターとして追加できます:java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2またはアプリケーション(サーバー)構成ファイルのどこかに。追加のparam:-Djavax.net.debug = allを追加することにより、それが機能するかどうかを確認できます。アプリケーションがhttps接続をネゴシエートするとき、使用されたプロトコルバージョンを含むすべてのネゴシエーション情報を出力します
Tomasz Rebizant

このパラメーター(https.protocols)は、https接続中に使用するプロトコルバージョンをJava仮想マシンに設定しています。
トマスレビザント

3
@TomaszRebizant、はい、あなたは正しいです。たとえばexport JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"、Tomcatのsetenv.shを追加すると、アプリケーションサーバー上のアプリから作成されたすべてのSSL接続でTLSv1とTLSv2の両方が有効になります。
ザキ

14

Java 1.7を想定して、起動スクリプトに次のようなものを追加してみてください。

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

その他の提案:https : //blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


これらのプロパティドキュメントを見つけたところ、JAVA7ドキュメントで「-D deployment.security。{ProtocolName} = True / False;」について言及している箇所は見当たりません。
runco​​de 14年

@runco​​deではなく、正確に確認してください、それが上に参照されているoracle.comのブログに記載されている
CNST

1
@cnst-ここでの問題は、すべてのJavaソフトウェアのすべての開発者に連絡し、これを行うように指示する必要があることです。それゆえ、私は自分のマシンで一度管理上それをしたいのです。
jww

私のために働かなかった。
シュリダールSarnobat

9

Mac OS X上のJava 7の場合、に移動するSystem Preferences > Javaと、Javaコントロールパネルが別のウィンドウで開きます。次に、Advancedタブに移動してAdvanced Security Settingsセクションまでスクロールダウンし、チェックボックスUse TLS 1.1Use TLS 1.2チェックボックスをオンにします。

ここに画像の説明を入力してください


感謝します。あなたが示したように、私はすでにTLS 1.0以上にセットアップしています。ただし、aを作成するとSSLSocket(そして、これが他のJavaプログラムでも起こると仮定すると)、TLS 1.0が有効になります(そしてTLS 1.1と1.2が使用可能になります)。
JWW

3
これもシステムでテストできます(興味がある場合)。このバグレポートからProtocolTest.javaをダウンロードして実行します。コンパイルして実行するには、ターミナルで実行します。Enabled Protocolsの下に表示されるものを参照してください。javac ProtocolTest.java && java ProtocolTest
jww 14

2
これは、WebStartクライアントとアプレットでのみ機能します。java実行可能ファイルで起動されたアプリケーションサーバーには影響しません。
1

8

私は最近これを調査し、追加したいと思います-これはJDKでは機能しません.deployment.propertiesはアプレットやJREで実行されている他のものにのみ関連しています。

JDKアプリケーション(たとえば、LDAPに接続する必要があるサーバー)の場合、サーバーはクライアントですが、deployment.securityです。動作しません。

SSLContext.getInstance( "TLSv1.2")のようなコードを記述しない限り、変更する方法はありません。


4

deployment.security。*設定は、デスクトップで実行されているJavaアプレットおよびJava Web Startプログラムで機能するようです。他の人がここで言及しているように、deployment.propertiesを編集してそれを指定できます。

グループポリシーを使用してすべてのユーザーに同じdeployment.propertiesファイルを展開する方法を示す記事は次のとおりです。http//www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

残念ながら、java.exeまたはjavaw.exeを直接呼び出すコンピューター上のすべてのjavaプログラムに対してこれを有効にする方法はありません。javaを使用する各プログラムを見つけ、javaに渡すパラメーターを指定する構成ファイルを見つけて変更する必要があります。

Tomcatの場合、Tomcatから他のサーバーへの接続がTLS 1.1+を使用するように、これを渡す必要がありました-Dhttps.protocols=TLSv1.1,TLSv1.2。Linuxでは、これを編集bin/catalina.shまたは作成することで実行できますbin/setenv.sh

Tomcatでサーバー側でTLS 1.2のみを使用するために必要なことはわかりません。私たちは、Apache HTTPを使用しています。


1

Java 7にこだわっ-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2ている場合は、JVMの引数に追加できます。

これにはいくつかの注意事項があることに注意してください。

  • Java 7アップデート95以降でのみ有効です。参照:https : //blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
  • 環境変数(たとえば、JAVA_OPTS)に設定されている場合でも、システム全体のソリューションではありません。この場合、Javaアプリケーションのenvvarのサポートに依存しています。

これらの欠点にもかかわらず、特にLDAPSなどのHTTPSではなくTLSを使用することに関心のあるプロトコルの場合、これは役立つと思います。

[更新] Ubuntuでサーバーのプールを実行している私の会社では、OpenJDK 7のアップデート121でさえ、これを正しく実装するには不十分であることがわかりました。動作する前に、すべてのサーバーを181に更新するように更新しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.