web-dev-qa-db-ja.com

Java 7でTLS 1.2を有効にする方法

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が有効になります。このプログラムを実行したくないが、アプリの起動時に直接有効にしたい。それを行う方法はありますか?

30
New Bee

Java 7バージョンを1.7.0_131-b31にアップグレードできます

OracleサイトのJRE 1.7.0_131-b31の場合:

TLSv1.2およびTLSv1.1は、TLSクライアントエンドポイントでデフォルトで有効になりました。これは、JDK 8リリースで既に発生している動作と似ています。

18

多くの提案がありますが、そのうちの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");。コードにも含まれますが、試したことはありません。

16
ankit.vishen

Javaアプリケーションに次のオプションを追加します。

-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2  
12

このパラメーターをJava_OPTSまたはmavenのコマンドラインに追加します:-Dhttps.protocols=TLSv1.2

7
AntonioOtero

System.setProperty("https.protocols", "TLSv1.2");は私の場合うまくいきました。アプリケーション内でそれを確認しましたか?

5
Sirsendu

記載された答えは正しいですが、私は私のケースに適用できるもう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)
4

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に接続できます。

1
Vaibhav Jain

を使用してこの問題を解決しました

Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);
0
Omar