我们有一个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!");
非常感谢您的宝贵时间,
-达米安
最佳答案
检查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,", ""));