Ответ 1
Вы можете обновить версию Java 7 до версии 1.7.0_131-b31
Для JRE 1.7.0_131-b31 на сайте Oracle:
TLSv1.2 и TLSv1.1 теперь включены по умолчанию в конечных точках клиента TLS. Это похоже на то, что уже происходит в версиях JDK 8.
Я пытаюсь включить 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 активируется. Я не хочу запускать эту программу, но я хочу включить ее непосредственно во время запуска приложения. Есть ли способ сделать это?
Вы можете обновить версию Java 7 до версии 1.7.0_131-b31
Для JRE 1.7.0_131-b31 на сайте Oracle:
TLSv1.2 и TLSv1.1 теперь включены по умолчанию в конечных точках клиента TLS. Это похоже на то, что уже происходит в версиях JDK 8.
Есть много предложений, но я нашел два из них наиболее распространенными. Я сначала попытался 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");
, Он также будет идти в коде, но я не пробовал.
Добавьте следующий вариант для приложения Java:
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
Добавьте этот параметр в JAVA_OPTS или в командную строку в maven: -Dhttps.protocols=TLSv1.2
System.setProperty("https.protocols", "TLSv1.2");
работал в моем случае. Вы проверили это в приложении?
Указанные ответы верны, но я просто разделяю один дополнительный вопрос, который применим к моему делу: помимо использования 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)
Для принудительного включения 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 с поддержкой.
Я решил эту проблему с помощью
Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);
Вероятно, вам следует искать конфигурацию, которая управляет реализацией TLS базовой платформы с помощью -Djdk.tls.client.protocols=TLSv1.2
.