Как включить TLS 1.2 в Java 7

Я пытаюсь включить TLS 1.2 в своем веб-приложении, которое использует JBoss 6.4 и Java 1.7. У меня есть -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 активируется. Я не хочу запускать эту программу, но я хочу включить ее непосредственно во время запуска приложения. Есть ли способ сделать это?

Ответ 1

Вы можете обновить версию Java 7 до версии 1.7.0_131-b31

Для JRE 1.7.0_131-b31 на сайте Oracle:

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) работают отлично для меня.

Существует еще один вариант: System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2"); , Он также будет идти в коде, но я не пробовал.

Ответ 3

Добавьте следующий вариант для приложения Java:

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

Ответ 4

Добавьте этот параметр в JAVA_OPTS или в командную строку в maven: -Dhttps.protocols=TLSv1.2

Ответ 5

System.setProperty("https.protocols", "TLSv1.2"); работал в моем случае. Вы проверили это в приложении?

Ответ 6

Указанные ответы верны, но я просто разделяю один дополнительный вопрос, который применим к моему делу: помимо использования setProtocol/withProtocol вас могут быть некоторые неприятные банки, которые не исчезнут, даже если у них есть правильные банки плюс Старый:

Удалить

<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)

Ответ 7

Для принудительного включения TLSv1.2 в JRE7u_80 мне пришлось использовать следующий фрагмент кода перед созданием соединения 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");
        }
    }
}

Возможность подключения к Windows 10 с SQL Server 2017 & ОС TLSv1.2 с поддержкой.

Ответ 8

Я решил эту проблему с помощью

Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);

Ответ 9

Вероятно, вам следует искать конфигурацию, которая управляет реализацией TLS базовой платформы с помощью -Djdk.tls.client.protocols=TLSv1.2.