我正在尝试在我的使用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将启用。我不想运行此程序,但我想在应用程序启动期间直接启用它。有没有办法做到这一点?
答案 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
处应用补丁应用补丁后,问题消失了,连接也很好。