在Java 7上为客户端启用TLS 1.1和1.2


50

Java 7为客户端禁用TLS 1.1和1.2。从Java密码学体系结构Oracle Providers文档

尽管Java SE 7发行版中的SunJSSE支持TLS 1.1和TLS 1.2,但是对于客户端连接,默认情况下均未启用任何版本。某些服务器无法正确实现前向兼容性,因此拒绝与TLS 1.1或TLS 1.2客户端通信。为了实现互操作性,SunJSSE默认情况下不为客户端连接启用TLS 1.1或TLS 1.2。

我对启用系统范围设置(可能通过配置文件)而不是针对每个Java应用程序的解决方案感兴趣。

如何在系统范围内管理性启用 TLS 1.1和1.2 ?

注意:从POODLE开始,我想在系统范围内禁用 SSLv3。(SSLv3的问题至少在POODLE之前已有15年之久,但是Java / Oracle / Developers不尊重基本的最佳实践,因此像您和我这样的用户都不得不清理混乱。)


这是Java版本:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

唯一对我
有用的

Answers:


31

您可以仅添加以下属性-Dhttps.protocols=TLSv1.1,TLSv1.2,该属性将JVM配置为指定在https连接期间应使用哪个TLS协议版本。


6
请详细说明其功能。否则,这会产生含糊不清的信息,并有可能在错误的手中造成损害。
studiohack

1
@Thomasz-我在这里与他人达成共识...如何在系统范围内进行管理?是否将其添加到计算机的配置文件中?如果是这样,文件是什么,我应该在哪里添加?
jww

3
maybye此链接将帮助 您:blogs.oracle.com/java-platform-group/entry/…您可以在命令行示例中将-Dhttps.protocols属性添加为参数:java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2或应用程序(服务器)配置文件中的某个位置。您可以通过添加其他参数来验证其是否有效:-Djavax.net.debug = all之后,当应用程序协商HTTPS连接时,它将打印所有协商信息,包括已使用的协议版本
Tomasz Rebizant 2015年

此参数(https.protocols)配置Java虚拟机,该虚拟机应在https连接期间使用哪个协议版本。
Tomasz Rebizant,2015年

3
@TomaszRebizant,是的,您是对的。例如,添加export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"Tomcat的setenv.sh会为从应用程序服务器上的应用程序进行的所有SSL连接启用TLSv1和TLSv2。
Zaki 2015年

14

假设使用Java 1.7,则可以尝试将以下内容添加到启动脚本中:

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

其他一些建议:https : //blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


在其中找到这些属性文档的地方,我看不到它们在JAVA7文档中提到的“ -D Deployment.security。{ProtocolName} = True / False;”。
2014年

@runco​​de,不一定完全确定,但是上面提到的oracle.com博客中已提及
cnst 2014年

1
@cnst-这里的问题是我需要联系每一个Java软件的每个开发人员,并告诉他们这样做。因此,我想在我的计算机上一次进行管理的原因。
jww 2015年

没为我工作。
Sridhar Sarnobat

9

对于Mac OS X上的Java 7,请转到System Preferences > Java,然后在单独的窗口中打开Java控制面板。然后,转到Advanced选项卡并向下滚动到该Advanced Security Settings部分,然后选中Use TLS 1.1Use TLS 1.2复选框。

在此处输入图片说明


谢谢Spiff。正如您所显示的,我已经为TLS 1.0及更高版本进行了设置。但是,当我创建一个SSLSocket(并且我假设其他Java程序会发生这种情况)时,启用TLS 1.0(并且TLS 1.1和1.2可用)。
jww

3
您也可以在系统上进行测试(如果有兴趣)。从此错误报告中下载ProtocolTest.java并执行它。要编译和执行,请在终端中运行。查看“ 启用的协议”下显示的内容。javac ProtocolTest.java && java ProtocolTest
jww 2014年

2
这仅适用于WebStart客户端和小程序。它不影响以Java可执行文件启动的应用程序服务器。
eckes

8

我刚刚对此进行了研究,并希望添加-这不适用于JDK,仅与Applet和JRE中运行的其他内容相关的deployment.properties。

对于JDK应用程序(例如,需要连接到LDAP的服务器),该服务器是客户端,但是Deployment.security。将无法正常工作。

除非编写类似SSLContext.getInstance(“ TLSv1.2”)的代码,否则无法更改它;


4

看起来Deployment.security。*设置适用于在桌面上运行的Java Applet和Java Web Start程序。就像其他人在这里提到的那样,您可以编辑deployment.properties进行指定。

以下文章显示了如何使用组策略为所有用户部署相同的deployment.properties文件:http : //www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

不幸的是,无法对直接调用java.exe或javaw.exe的计算机上的所有Java程序启用此功能。您必须找到每个使用Java的程序,找到在其中指定要传递给Java的参数并对其进行更改的配置文件。

对于Tomcat,我们必须传递此参数,以便从Tomcat到其他服务器的连接使用TLS 1.1+ :-Dhttps.protocols=TLSv1.1,TLSv1.2。在Linux上,可以通过编辑bin/catalina.sh或创建来完成bin/setenv.sh

我不知道要如何使Tomcat在服务器端仅使用TLS 1.2。我们首先介绍Apache HTTP。


1

如果您坚持使用Java 7,则可以将其添加-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2到JVM的参数中。

请注意,这有几个警告:

尽管存在这些缺点,我认为这可能还是有用的,特别是当一个协议感兴趣的协议使用TLS但不使用HTTPS(例如LDAPS)时。

[更新]在我的公司中,它在Ubuntu上运行其服务器池,我们已经意识到,即使OpenJDK 7的更新121也不足以正确实现此目的。我们已经更新了所有服务器,以使其更新到181。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.