Jam*_*mes 9 java security ssl sslhandshakeexception
只是让人们知道我升级到Java 1.8后似乎已经遇到的一个问题.并非所有解决方案都相同,因此发布了我如何解决这个问题.
但首先......由于安全性正在被有效降级,因此这不是一个值得生产系统的解决方案.但是,如果你被阻止测试等,它可能是非常合适的.
我的问题是无论我做了什么......启用SSLv3等我总是收到
"javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure".
Run Code Online (Sandbox Code Playgroud)
以下是我为解决这个问题所采取的步骤.
首先,我发现了服务器使用的密码.我通过openssl做到了这一点.
openssl s_client -host yourproblemhost.com -port 443
Run Code Online (Sandbox Code Playgroud)
这会产生(最后......)
SSL-Session:
Protocol : TLSv1.2
Cipher : RC4-MD5
Run Code Online (Sandbox Code Playgroud)
现在..我们使用'Java-wise'来启用该密码?
在该链接中,它具有名称和它们的Java对应物.所以对于RC4-MD5,我们有SSL_RSA_WITH_RC4_128_MD5.
好的.现在我添加了一个System属性.
-Dhttps.cipherSuites=SSL_RSA_WITH_RC4_128_MD5
Run Code Online (Sandbox Code Playgroud)
在我的代码中......
Security.setProperty("jdk.tls.disabledAlgorithms", "" /*disabledAlgorithms */ );
Run Code Online (Sandbox Code Playgroud)
再说.. 这是一个绝对的最后手段'修复' ...但是如果你的头撞到墙上让它运行(进行测试),我希望它有用.
使用JDK 1.8.0_51版本,Java不再支持RC4作为客户端(也作为服务器)来协商SSL握手,RC4被认为是弱(和受损)密码,这就是删除的原因
http://bugs.java.com/view_bug.do?bug_id=8076221
但是,您仍然可以通过jdk.tls.disabledAlgorithms从Java安全配置中删除RC4 或使用setEnabledCipherSuites()方法以其方式启用它们来启用它
然而,更好的解决方案是更新服务器配置(如果它在您的控制之下)以升级到更强的密码
RC4现在被视为受损密码.已从Oracle JSSE实现中的客户端和服务器默认启用的密码套件列表中删除RC4密码套件.这些密码套件仍然可以通过
SSLEngine.setEnabledCipherSuites()和SSLSocket.setEnabledCipherSuites()方法启用.
至于你通过使用Security.setProperty()它来设置它的方法,它是不可靠的方式,因为持有禁用算法的字段是静态的和最终的,所以如果该类首先加载你没有控制它,你可以尝试创建一个属性文件
像这样
## override it to remove RC4, in disabledcipher.properties
jdk.tls.disabledAlgorithms=DHE
Run Code Online (Sandbox Code Playgroud)
在您的JVM中,您可以将其称为系统属性
java -Djava.security.properties=disabledcipher.properties blah...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13642 次 |
| 最近记录: |