如何在Java7中启用TLS1.2
我正在尝试在使用JBoss6.4和Java1.7的web应用程序中启用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 =
-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产品。我不能用那个。至少当系统启动时,我不知道如何使用它。您是否检查过这种情况?sysprophttps。协议只有在同时拼写为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);