我们有一个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()方法。
不幸的是,对于像我这样的人(依赖于抽象的安全层),这还不够。
评论
有人能提供一些更详细的线索,了解如何在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
答案 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,", ""));