Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java7中启用TLS1.2_Java_Jboss_Java 7_Tls1.2 - Fatal编程技术网

如何在Java7中启用TLS1.2

如何在Java7中启用TLS1.2,java,jboss,java-7,tls1.2,Java,Jboss,Java 7,Tls1.2,我正在尝试在使用JBoss6.4和Java1.7的web应用程序中启用TLS1.2。我的应用程序环境中有-Dhttp.protocols=TLSv1.2,但它似乎不适合我 我可以做些什么来启用TLS1.2吗 我写了一个简单的程序 context = SSLContext.getInstance("TLSv1.2"); context.init(null,null,null); SSLContext.setDefault(context); SSLSocketFactory factory =

我正在尝试在使用JBoss6.4和Java1.7的web应用程序中启用TLS1.2。我的应用程序环境中有
-Dhttp.protocols=TLSv1.2
,但它似乎不适合我

我可以做些什么来启用TLS1.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将启用。我不想运行这个程序,但我想在应用程序启动时直接启用它。有什么方法可以做到这一点吗?

System.setProperty(“https.protocols”、“TLSv1.2”)在我的案例中起作用。您是否检查了应用程序中的参数?

将此参数添加到
JAVA\u OPTS
或Maven中的命令行:
-Dhttps.protocols=TLSv1.2

有很多建议,但我发现其中两个最常见

重新。JAVA_选项 在启动程序之前,我第一次尝试在命令行上导出JAVA_OPTS=“-Dhttps.protocols=SSLv3,TLSv1,TLSv1.1,TLSv1.2”
,但它对我不起作用

重新。建造师 然后我在startup类构造函数中添加了以下代码,它对我很有用

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
还有一个选项:
System.setProperty(“https.protocols”、“SSLv3、TLSv1、TLSv1.1、TLSv1.2”)。它也将进入代码中,但我还没有尝试过。

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

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

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

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

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


声明的答案是正确的,但我只是分享一个适用于我的案例的额外问题:除了使用
setProtocol
/
with protocol
,您可能会有一些讨厌的罐子,即使有正确的罐子加上旧罐子也不会消失:

去除
您可能应该查看通过
-Djdk.TLS.client.protocols=TLSv1.2
控制底层平台TLS实现的配置

为了在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。

我使用

Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);

我在连接RDS Oracle时遇到了类似的问题,即使客户端和服务器都设置为TLSv1.2证书正确,java为1.8.0141 所以最后我不得不在


应用补丁后,问题消失,连接正常。

这是一款COTS产品。我不能用那个。至少当系统启动时,我不知道如何使用它。您是否检查过这种情况?sysprop
https。协议只有在同时拼写为s时才有效,并且仅适用于使用
URL进行的连接。openConnection
不是像
sslslsocketfactory
Sridhar这样的其他方式,因此,通过这些更改以及Dhttp.protocols=TLSv1.2,1.7.0_80是否默认支持TLSv1.2(正如我看到的sslHandshake正在使用TLSv1),或者我是否需要将JDK升级到更高版本?即使我在eclipse运行时环境中提供了'-Dhttps.protocols=TLSv1.2'。或者catalina属性中的“https.protocols=TLSv1.2”-它不工作!!我感觉到你的痛苦。我理解,并非所有情况下都可以升级。它在java 7上确实对我有效,但我需要我的架构师来找出这个不需要的jar。是的,谢谢你的建议,但不知怎么的,它对我不起作用,每次它默认为TLSv1时都会发生同样的情况。它似乎只适用于JDK 1.7.0_95或更高版本,但这里的问题是JDK 1.7上最后一次公开发布/更新是JDK 1.7.0_80,因此,从技术上讲,这适用于使用JDK版本且拥有Oracle支持或Oracle客户的用户!!请让我知道它是否适用于JDK1.7.0 P 80。你能分享到这个的链接吗?这是一个带有发行说明的页面。我该如何下载jdk?@Udayredy你需要是一个商业用户才能下载。它在非商业版本jdk1.7.0_80中对我有效-但我必须添加
-Dhttps.protocols=TLSv1、TLSv1.1、TLSv1.2
,正如Ankit和Meeraj所建议的,这应该是公认的答案。在java 7_80中,java选项的-Dhttps.protocols=“TLSv1.2”属性似乎有一个bug。我也尝试了java选项(例如https.protocols),但没有成功-看起来它甚至没有查看该选项。我有一个问题,这个更改做了什么?它是否为所有传入和传出连接请求启用TLS?有没有办法记录TLS握手?
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)
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");
        }
    }
}
Service.setSslSecurityProtocol(SSLSecurityProtocol.TLSv1_2);