如何在Java 7中启用TLS 1.2

时间:2016-08-26 02:22:22

标签: java jboss java-7 tls1.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将启用。我不想运行此程序,但我想在应用程序启动期间直接启用它。有没有办法做到这一点?

10 个答案:

答案 0 :(得分:15)

您可以将Java 7版本升级到1.7.0_131-b31

对于Oracle站点中的JRE 1.7.0_131-b31:

  

TLS客户端现在默认启用TLSv1.2和TLSv1.1   终点。这与JDK 8中已经发生的行为类似   版本。

答案 1 :(得分:13)

有许多建议,但我发现其中两个最常见。我在程序启动之前首先在命令行上尝试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");。它也将用于代码,但我没有尝试过。

答案 2 :(得分:10)

为java应用程序添加以下选项:

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

答案 3 :(得分:6)

将此参数添加到JAVA_OPTS或maven中的命令行: -Dhttps.protocols=TLSv1.2

答案 4 :(得分:4)

System.setProperty("https.protocols", "TLSv1.2");在我的案例中工作。你在申请表中检查了吗?

答案 5 :(得分:4)

陈述的答案是正确的,但我只是分享了一个适用于我的情况的附加陷阱:除了使用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)

答案 6 :(得分:1)

要在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的操作系统连接到Windows 10。

答案 7 :(得分:0)

您可能应该考虑通过-Djdk.tls.client.protocols=TLSv1.2控制基础平台TLS实现的配置。

答案 8 :(得分:0)

我通过使用

解决了这个问题
Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);

答案 9 :(得分:0)

即使将客户端和服务器都设置为TLSv1.2时,证书也正确,而Java为1.8.0_141,连接到RDS Oracle时我也遇到了类似的问题 所以最后我不得不在Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files

处应用补丁

应用补丁后,问题消失了,连接也很好。