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 systemワイド?
注: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)
Https接続中にどのTLSプロトコルバージョンを使用するかを指定するようにJVMを設定する次のプロパティ-Dhttps.protocols=TLSv1.1,TLSv1.2
を追加するだけです。
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
私は最近これを研究し、私が付け加えたいのですが - これはJDKでは機能しません。deployment.propertiesはJREで実行されているアプレットや他のものにのみ関連しています。
jDKアプリケーション(たとえばLDAPに接続する必要があるサーバー)の場合、サーバーはクライアントですがdeployment.securityです。うまくいかないでしょう。
sSLContext.getInstance( "TLSv1.2")のようなコードを書かない限り、変更する方法はありません。
Mac OS X上のJava 7の場合、System Preferences > Java
に移動すると、Javaコントロールパネルが別ウィンドウで開きます。それからAdvanced
タブに行き、Advanced Security Settings
セクションまでスクロールして、Use TLS 1.1
とUse TLS 1.2
チェックボックスをチェックします。
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に立ち向かいます。
Java 7を使い慣れている場合は、JVMの引数に-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2
を追加できます。
これにはいくつかの注意点があります。
Java_OPTS
)に設定されていても、これはシステム全体のソリューションではありません。その場合は、Javaアプリケーションでのenvvarのサポートに依存します。これらの欠点にもかかわらず、私はこれが有用であると思います、特に興味があるプロトコルがTLSを使用するがHTTPSではない場合、特に。 LDAPS.
[更新] Ubuntu上でサーバーのプールを運用している私の会社では、OpenJDK 7の更新121でさえこれを正しく実装するのに十分ではないことがわかりました。それがうまくいく前に、すべてのサーバーを更新して181に更新しました。