SSL握手失败 - Java 1.8

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'来启用该密码?

Oracle链接

在该链接中,它具有名称和它们的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)

再说.. 这是一个绝对的最后手段'修复' ...但是如果你的头撞到墙上让它运行(进行测试),我希望它有用.

Jig*_*shi 5

使用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)