1. 程式人生 > 實用技巧 >記一次HttpClient+jdk8呼叫SSLv3介面的問題

記一次HttpClient+jdk8呼叫SSLv3介面的問題

1. 環境

org.apache.httpcomponents.httpclient 4.5.10版本 + jdk1.8_202版本

2. 問題

需要用HttpClient呼叫https介面,該https伺服器只支援SSLv3,呼叫時報錯:Received fatal alert: handshake_failure

3. 解決

百度:鋪天蓋地的告訴我如何讓HttpClient繞過SSL認證,包括類似下面的程式碼:赫然出現了SSLv3這樣的關鍵字,然並卵

ocketFactory = new SSLConnectionSocketFactory(
                    contextBuilder.build(),
                    
new String[]{"TLSv1.2", "SSLv3", "TLSv1", "TLSv1.1"}, null, NoopHostnameVerifier.INSTANCE );

後偶然看到需要更改jdk,因為jdk本身限制了SSLv3協議的使用,也有人說HttpClient根本就不管jdk那一套。遂跑去看原始碼:答案是,HttpClient還是符合jdk的設定的。於是解決辦法為:找到你的jre/lib/security下的java.security檔案,修改jdk.tls.disabledAlgorithms,把該項配置的SSLv3幹掉即可

4. 最後

只怪自己太垃圾。另附:開啟ssl的bug日誌:-Djavax.net.debug=ssl,當然也可以-Djavax.net.debug=all,開啟後如果沒有修改jdk配置,你會看到如下輸出:

Ignoring disabled protocol: SSLv3