[英]SSL Handshake Failed - Java 1.8
只是讓人們知道我升級到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 */ );
再說.. 這是一個絕對的最后手段'修復' ...但是如果你的頭撞到牆上讓它運行(進行測試),我希望它有用。
使用JDK 1.8.0_51版本 ,Java不再支持RC4作為客戶端(也作為服務器)來協商SSL握手,RC4被認為是弱(和受損)密碼,這就是刪除的原因
http://bugs.java.com/view_bug.do?bug_id=8076221
您仍然可以但是通過由移除RC4啟用jdk.tls.disabledAlgorithms
從Java安全性配置或使用progamatically使他們setEnabledCipherSuites()
方法
然而,更好的解決方案是更新服務器配置(如果它在您的控制之下)以升級到更強的密碼
RC4現在被視為受損密碼。 已從Oracle JSSE實現中的客戶端和服務器默認啟用的密碼套件列表中刪除RC4密碼套件。 這些密碼套件仍然可以通過
SSLEngine.setEnabledCipherSuites()
和SSLSocket.setEnabledCipherSuites()
方法啟用。
至於你使用Security.setProperty()
設置它的方法,它不是可靠的方式,因為保存禁用算法的字段是靜態的和最終的 ,所以如果該類首先加載你沒有控制它,你可以或者嘗試創建屬性文件
像這樣
## override it to remove RC4, in disabledcipher.properties
jdk.tls.disabledAlgorithms=DHE
在您的JVM中,您可以將其稱為系統屬性
java -Djava.security.properties=disabledcipher.properties blah...
RC4在14年前被有效破解。
Fluhrer,Mantin和Shamir(FMS)攻擊發表在2001年的論文 “RC4的密鑰調度算法中的弱點”中,利用了RC4密鑰調度算法中的弱點來從加密消息中重建密鑰。
問題不在Java 8中。
問題是您的服務器正在使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.