JBoss 6.4およびJava 1.7を使用するWebアプリでTLS 1.2を有効にしようとしています。アプリケーション環境に-Dhttp.protocols = TLSv1.2
がありますが、うまくいかないようです。
TLS 1.2を有効にするためにできることはありますか?
簡単なプログラムを書きました
context = SSLContext.getInstance("TLSv1.2");
context.init(null,null,null);
SSLContext.setDefault(context);
SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket();
protocols = socket.getEnabledProtocols();
アプリ内でこのプログラムを実行すると、TLS 1.2が有効になります。このプログラムを実行したくないが、アプリの起動時に直接有効にしたい。それを行う方法はありますか?
Java 7バージョンを1.7.0_131-b31にアップグレードできます
OracleサイトのJRE 1.7.0_131-b31の場合:
TLSv1.2およびTLSv1.1は、TLSクライアントエンドポイントでデフォルトで有効になりました。これは、JDK 8リリースで既に発生している動作と似ています。
多くの提案がありますが、そのうちの2つが最も一般的であることがわかりました。プログラムの起動前に最初にコマンドラインでexport Java_OPTS="-Dhttps.protocols=SSLv3,TLSv1,TLSv1.1,TLSv1.2"
を試しましたが、うまくいきませんでした。
次に、スタートアップクラスコンストラクターに次のコードを追加しました。
try {
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(null, null, null);
SSLContext.setDefault(ctx);
} catch (Exception e) {
System.out.println(e.getMessage());
}
率直に言って、ctx.init(null, null, null);
の理由は詳細にはわかりませんが、すべて(SSL/TLS)がうまく機能しています。
もう1つのオプションがあります:System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2");
。コードにも含まれますが、試したことはありません。
Javaアプリケーションに次のオプションを追加します。
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
このパラメーターをJava_OPTSまたはmavenのコマンドラインに追加します:-Dhttps.protocols=TLSv1.2
System.setProperty("https.protocols", "TLSv1.2");
は私の場合うまくいきました。アプリケーション内でそれを確認しましたか?
記載された答えは正しいですが、私は私のケースに適用できるもう1つの落とし穴を共有しています:setProtocol
/withProtocol
を使用することに加えて、消えないいくつかの厄介なjarファイルがあります適切なjarファイルと古いjarファイルがあったとしても:
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.6</version>
</dependency>
Javaは後方互換性がありますが、ほとんどのライブラリはそうではありません。より多くの日が経つにつれて、共有ライブラリがこの説明責任の欠如によって非合法化されることを望みます。
Java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
JRE7u_80でTLSv1.2を強制的に有効にするには、JDBC接続を作成する前に次のコードスニペットを使用する必要がありました。
import Java.security.NoSuchAlgorithmException;
import Java.security.Provider;
import javax.net.ssl.SSLContextSpi;
import Sun.security.jca.GetInstance;
import Sun.security.jca.ProviderList;
import Sun.security.jca.Providers;
public static void enableTLSv12ForMssqlJdbc() throws NoSuchAlgorithmException
{
ProviderList providerList = Providers.getProviderList();
GetInstance.Instance instance = GetInstance.getInstance("SSLContext", SSLContextSpi.class, "TLS");
for (Provider provider : providerList.providers())
{
if (provider == instance.provider)
{
provider.put("Alg.Alias.SSLContext.TLS", "TLSv1.2");
}
}
}
SQL Server 2017およびTLSv1.2対応OSでWindows 10に接続できます。
を使用してこの問題を解決しました
Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);