如何在JRE8u60

时间:2015-10-08 06:38:46

标签: java ssl

我们有一个Java桌面产品,我们的客户(小型企业)使用(其中包括)通过几种不同的SOAP协议与大型保险公司进行通信。 (我们是SOAP客户端)。这里的重点是保险公司是房间里的大猩猩 - 我们只是让保险公司和客户之间的沟通成为可能。

我们使用AXIS1作为SOAP客户端库。通常是完美的工作,它已有多年。

一家大型保险公司仍在使用TLS1.0作为其SOAP服务器。除了国际空间站影响地球轨道之外,我们对此没有任何影响。

不幸的是(对我们而言)最新的Java版本8u60会自动禁用TLS1.0。 请参阅 JDK-8076221 :禁用RC4密码套件 在http://bugs.java.com/view_bug.do?bug_id=8076221

所以现在我们的客户无法通过8u60进行连接。我们可以将它们恢复到8u51,但这至多是短期的。

JDK-8076221 提供了一些关于如何重新启用TLS1.0的线索,如下所示......

  

可以通过删除“RC4”表单重新激活这些密码套件   java.security中的“jdk.tls.disabledAlgorithms”安全属性   文件或通过动态调用Security.setProperty(),以及   使用它将它们读取到启用的密码组列表   SSLSocket / SSLEngine.setEnabledCipherSuites()方法。

不幸的是,对于像我这样的人(依赖于抽象的安全层),这还不够。

评论

  • TLS级别控制不是我的事 - 我们依靠AXIS等来做 所有这些都在幕后,因此有大量的知识 这对我来说并不熟悉。
  • 我们无法使用TLS1.0接口控制保险公司。
  • 如果我们不在这里工作,我们的客户将被迫使用其他产品 这将使用TLS1.0 - 所以我们不能发挥硬球并拯救任何人 这里。在保险公司另有决定之前,他们将使用TLS1.0。
  • 动态(基于代码)解决方案优先于任何命令行解决方案,因为我们是一个桌面应用程序,会发现命令行部署非常有问题。

有人能提供一些更详细的线索,了解如何在Java 8u60中以编程方式启用TLS1.0吗?

也许就像......

Security.setProperty("jdk.tls.disabledAlgorithms", "SSLv3");
SSLContext sslCtx = SSLContext.getInstance("TLS");
SSLSocket.setEnabledCipherSuites("please help me!");
SSLEngine.setEnabledCipherSuites("please help me!");

非常感谢您的时间, -Damian

1 个答案:

答案 0 :(得分:1)

检查http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html是否有算法名称。

TLS 1.0匹配" TLSv1" (部分SSLContext算法),因此类似于以下内容将启用TLS 1.0(请注意,这适用于createEngine()返回的SSLEngine实例。)

SSLContext.getDefault().createSSLEngine().setEnabledCipherSuites(new String[] {"TLSv1"});

要启用密码套件,您必须使用不同的方式覆盖当前值。您的代码禁用已禁用的SSLv3。相反,你需要类似于

的东西
Security.setProperty("jdk.tls.disabledAlgorithms", "");

然而,在此之前检查这些属性实际上是如何工作的。它期望Security属性包含密码组的名称,例如以逗号分隔的列表。所以你应该做类似

的事情
String disabledAlgorithms = Security.getProperty("jdk.tls.disabledAlgorithms");
Security.setProperty("jdk.tls.disabledAlgorithms", disabledAlgorithms .replace("RC4,", ""));