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


person New Bee    schedule 26.08.2016    source источник
comment
sysprop https.protocols работает только в том случае, если он написан как s, и только для соединений, сделанных с помощью URL.openConnection, а не другими средствами, такими как SSLSocketFactory   -  person dave_thompson_085    schedule 08.06.2018


Ответы (10)


Есть много предложений, но я нашел два наиболее распространенных.

Re. JAVA_OPTS

Я сначала попробовал export JAVA_OPTS="-Dhttps.protocols=SSLv3,TLSv1,TLSv1.1,TLSv1.2" в командной строке перед запуском программы, но у меня это не сработало.

Re. конструктор

Затем я добавил следующий код в конструктор класса запуска, и у меня он сработал.

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

Re. System.setProperty

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

person ankit.vishen    schedule 17.02.2017
comment
Это должен быть принятый ответ. Кажется, есть ошибка со свойством -Dhttps.protocols = TLSv1.2, поскольку java выбирает в Java 7_80. - person karnesJ.R; 20.05.2020
comment
Я также пробовал с параметрами Java (например, https.protocols) и не работал - казалось, что он даже не смотрел на этот вариант. - person Victor; 07.12.2020

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

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

TLSv1.2 и TLSv1.1 теперь включены по умолчанию на конечных точках клиентов TLS. Это похоже на то, что уже происходит в выпусках JDK 8.

person Joby Wilson Mathews    schedule 05.10.2017
comment
Не могли бы вы поделиться ссылкой на это? - person Uday Reddy; 14.08.2018
comment
oracle.com/technetwork/java/javase/7u131-relnotes- 3338543.html - person Joby Wilson Mathews; 14.08.2018
comment
Это страница с примечаниями к выпуску. Как мне скачать jdk? - person Uday Reddy; 15.08.2018
comment
@UdayReddy, чтобы загрузить его, вы должны быть профессиональным пользователем. - person Joby Wilson Mathews; 16.08.2018
comment
У меня это сработало с не бизнес-версией jdk1.7.0_80, но мне пришлось добавить -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2, как предложили Ankit и Meeraj - person JGlass; 21.02.2019
comment
Я подтверждаю, что он работает с jdk1.7.0_80, просто не забудьте компилировать классы с этим jdk. - person luandrea; 27.05.2019

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

-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2  
person Meeraj Kanaparthi    schedule 07.09.2017
comment
У меня вопрос, для чего это изменение? Включает ли он TLS для всех входящих и исходящих запросов на подключение? Есть ли способ зарегистрировать рукопожатие TLS? - person praxmon; 03.09.2020

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

person AntonioOtero    schedule 26.12.2016

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

person Sirsendu    schedule 26.08.2016
comment
это продукт COTS. я не могу это использовать. по крайней мере, я не знаю, как это использовать при запуске системы - person New Bee; 26.08.2016
comment
Вы проверили developer.jboss.org/thread/251967?start=0&tstart=0? в таком случае? - person Sirsendu; 26.08.2016

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

Удалять

<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)
person Sridhar Sarnobat    schedule 14.07.2018
comment
Sridhar, Итак, с этими изменениями вместе с Dhttp.protocols = TLSv1.2 1.7.0_80 поддерживает TLSv1.2 по умолчанию (поскольку я вижу, что sslHandshake использует TLSv1) или мне нужно обновить наш JDK до более поздних версий? даже когда я предоставляю '-Dhttps.protocols = TLSv1.2' в среде выполнения eclipse env. или https.protocols = TLSv1.2 в свойствах каталины - не работает !! - person whoami - fakeFaceTrueSoul; 02.08.2018
comment
Я чувствую твою боль. Я понимаю, что обновление возможно не во всех ситуациях. У меня это работает на java 7, но мне нужно было, чтобы мой архитектор обнаружил эту нежелательную банку. - person Sridhar Sarnobat; 03.08.2018
comment
Да, спасибо за предложение, но у меня почему-то это не сработало, то же самое происходит каждый раз, когда по умолчанию используется TLSv1. - person whoami - fakeFaceTrueSoul; 03.08.2018

Чтобы принудительно включить 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.

person Vaibhav Jain    schedule 16.11.2018

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

person Filip    schedule 18.07.2018
comment
Похоже, он будет работать только с JDK 1.7.0_95 или более поздней версии, но проблема здесь в том, что последний публичный выпуск / обновление на JDK 1.7 - это JDK 1.7.0_80, поэтому технически это работает для тех, кто когда-либо использовал версию JDK с поддержкой Oracle или Oracle клиент!! Пожалуйста, дайте мне знать, работает ли это для JDK 1.7.0_80 - person whoami - fakeFaceTrueSoul; 05.08.2018

Я решил эту проблему, используя

Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);
person Omar    schedule 07.08.2019
comment
Я не смог найти пакет для этой строки - person Pedro Joaquín; 29.07.2021

У меня была аналогичная проблема при подключении к RDS Oracle, даже когда клиент и сервер были настроены на TLSv1.2, сертификаты были правильными, а java - 1.8.0_141. Итак, наконец, мне пришлось применить патч на Файлы политики юрисдикции неограниченной надежности Java Cryptography Extension (JCE)

После применения патча проблема исчезла, и соединение прошло нормально.

person isubodh    schedule 17.02.2020