让大家知道我在升级到Java 1.8后似乎遇到的问题。并非所有的解决方案都是相同的,因此我发布了解决这个问题的方法。
但首先......这不是一个值得生产系统的解决方案,因为安全性正在被有效降级。但是,如果你被阻止测试等,它可能是非常合适的。
我的问题是无论我做了什么......启用SSLv3等我总是收到
"javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure".
以下是我解决这个问题的步骤。
首先,我发现了服务器使用的密码。我是通过openssl做到的。
openssl s_client -host yourproblemhost.com -port 443
这会产生(最后......)
SSL-Session:
Protocol : TLSv1.2
Cipher : RC4-MD5
现在..我们使用'Java-wise'来启用该密码?
在该链接中,它具有名称和Java对应物。所以对于RC4-MD5,我们有SSL_RSA_WITH_RC4_128_MD5。
好的,好的。现在我添加了一个System属性。-Dhttps.cipherSuites=SSL_RSA_WITH_RC4_128_MD5
在我的代码中......
Security.setProperty("jdk.tls.disabledAlgorithms", "" /*disabledAlgorithms */ );
再次.. 这是一个绝对的最后手段'修复' ......但是如果你的头撞到墙上让它运行(进行测试),我希望它能进来是有用的。
答案 0 :(得分:5)
使用JDK 1.8.0_51 release不再支持Java作为客户端(也作为服务器)来协商SSL握手,RC4被认为是弱(和受损)密码,这就是删除的原因
http://bugs.java.com/view_bug.do?bug_id=8076221
但是,您仍然可以通过从Java安全配置中删除jdk.tls.disabledAlgorithms
中的RC4或使用setEnabledCipherSuites()
方法
然而,更好的解决方案是更新服务器配置(如果它在您的控制之下)以升级到更强的密码
RC4现在被视为受损密码。已从Oracle JSSE实现中的客户端和服务器默认启用的密码套件列表中删除RC4密码套件。这些密码套件仍然可以通过
SSLEngine.setEnabledCipherSuites()
和SSLSocket.setEnabledCipherSuites()
方法启用。
关于使用Security.setProperty()
进行设置的方法,因为fields which hold disabled algorithms are static and final是不可靠的,所以如果该类首先被加载,你就无法控制它,你也可以尝试创建一个属性文件
## override it to remove RC4, in disabledcipher.properties
jdk.tls.disabledAlgorithms=DHE
在您的JVM中,您可以将其称为系统属性,如此
java -Djava.security.properties=disabledcipher.properties blah...
答案 1 :(得分:1)
RC4被有效破解 - 14 years ago。
Fluhrer,Mantin和Shamir(FMS)攻击,发表于 2001 论文" RC4"的密钥调度算法中的弱点 RC4密钥调度算法中的弱点的优点 从加密消息中重建密钥。
问题不在Java 8中。
问题是您的服务器正在使用RC4。
答案 2 :(得分:0)
请注意,这里的根本原因是服务器。我只发布了这个来提供解决方案,直到可以修复服务器(很可能不在开发人员的控制之下)
答案 3 :(得分:-1)
感谢alton共享这样的救生员信息。 我只想改变一件事 自
openssl s_client -host yourproblemhost.com -port 443
returned ->
Protocol : TLSv1.2
Cipher : 0000
openssl s_client -connect X.X.X.X:993 -prexit -tls1
returned -> the expected response as
Protocol : TLSv1
Cipher : RC4-MD5