SSL握手失败-Java 1.8
只是让大家知道我遇到的一个问题,很多人在升级到Java1.8后似乎遇到了这个问题。并非所有的解决方案都是相同的,因此我将如何解决这个问题 但是首先。。。这不是一个值得生产系统使用的解决方案,因为安全性正在被有效地降级。然而,如果你是阻塞测试等,它可能是非常合适的 我的问题是无论我做什么。。。已启用SSLv3等,我始终收到SSL握手失败-Java 1.8,java,security,ssl,sslhandshakeexception,Java,Security,Ssl,Sslhandshakeexception,只是让大家知道我遇到的一个问题,很多人在升级到Java1.8后似乎遇到了这个问题。并非所有的解决方案都是相同的,因此我将如何解决这个问题 但是首先。。。这不是一个值得生产系统使用的解决方案,因为安全性正在被有效地降级。然而,如果你是阻塞测试等,它可能是非常合适的 我的问题是无论我做什么。。。已启用SSLv3等,我始终收到 "javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure". 以下是我为“解
"javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure".
以下是我为“解决”这个问题所采取的步骤
首先,我发现了服务器使用的密码。我是通过openssl实现的
openssl s_client -host yourproblemhost.com -port 443
这会产生(最后…)
现在。。我们如何使用“Java智能”来启用该密码
在该链接中,它有名称和Java对应项。所以对于RC4-MD5,我们有SSL\u RSA\u和RC4\u 128\u MD5
好的,很好。现在我添加了一个系统属性
-Dhttps.cipherSuites=SSL_RSA_WITH_RC4_128_MD5
在我的代码中
Security.setProperty("jdk.tls.disabledAlgorithms", "" /*disabledAlgorithms */ );
再一次这绝对是最后的“修复”。。。但是,如果你为了让它运行(用于测试)而不顾一切,我希望它会有用。Java不再支持RC4作为客户端(也作为服务器)来协商SSL握手,RC4被认为是弱密码(并且被破坏),这就是删除的原因
但是,您仍然可以通过从Java安全配置中删除jdk.tls.disabledAlgorithms
中的RC4来启用它,或者使用setEnabledChiperSuites()
方法编程启用它们
不过,更好的解决方案是更新服务器配置(如果在您的控制下),以升级到更强大的密码
RC4现在被认为是一个折衷的密码。在Oracle JSSE实现中,RC4密码套件已从客户端和服务器默认启用的密码套件列表中删除。这些密码套件仍然可以通过SSLEngine.setenablediphersuites()
和SSLSocket.setenablediphersuites()
方法启用
至于您使用Security.setProperty()
设置它的方法,这是不可靠的,因为如果先加载该类,您无法控制它,您也可以尝试创建属性文件
像这样
## override it to remove RC4, in disabledcipher.properties
jdk.tls.disabledAlgorithms=DHE
java -Djava.security.properties=disabledcipher.properties blah...
在JVM中,您可以像这样将其称为系统属性
java -Djava.security.properties=disabledcipher.properties blah...
RC4有效地开裂了- Fluhrer、Mantin和Shamir(FMS)攻击,发表在他们的2001上 论文“RC4密钥调度算法的弱点”,以 RC4密钥调度算法的一个弱点的优点是 从加密消息重建密钥 问题不在Java8中
问题是您的服务器正在使用RC4。感谢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