javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure问题解决
最近在生產環境調用Https接口出現這個問題javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure,經查詢,見到網上大部分答案是替換%JAVA_HOME%\jre\lib\security路徑下的兩個jar包,local_policy.jar和US_export_policy.jar,由于自己替換后發現依舊出現了這個問題,最終解決了,于是總結一下自己的解決方法以及出現的問題,調用接口我使用的是jdk自帶的類,沒有使用第三方包。自己出現的問題如下
一、是使用錯誤,如下圖,調用Https接口,應該使用HttpsURLConnection這個來創建連接,而不是HttpURLConnection,
二、沒有設置協議版本,可能使用了默認的版本,Https接口時會進行一個協議版本校驗,校驗客戶端協議的版本和服務端版本是否一致,可以在這個網站查詢?https://myssl.com/?調用地址支持的協議版本,使用的是什么協議,如下圖,
然后設置HttpsURLConnection請求時使用的協議,如下圖,第一個紅框中SLContext.getInstance("TLSv1.2")中的參數TLSv1.2就是為協議版本,應該對應填寫服務器端支持的協議版本。
然后提供下完成代碼
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import java.io.*; import java.net.*;public static String insureResponsePost(String url, String param) {PrintWriter out = null;InputStream is = null;BufferedReader br = null;String result = "";HttpsURLConnection conn = null;StringBuffer strBuffer = new StringBuffer();try {// 創建SSLContextSSLContext sslContext = SSLContext.getInstance("TLSv1.2");TrustManager[] tm = {new RecX509TrustManager()};// 初始化sslContext.init(null, tm, new java.security.SecureRandom());// 獲取SSLSocketFactory對象SSLSocketFactory ssf = sslContext.getSocketFactory();URL realUrl= new URL(url);conn = (HttpsURLConnection) realUrl.openConnection();// 設置通用的請求屬性conn.setRequestMethod( "POST");conn.setConnectTimeout(20000);conn.setReadTimeout(300000);conn.setRequestProperty("Charset", "UTF-8");// 傳輸數據為json,如果為其他格式可以進行修改conn.setRequestProperty( "Content-Type", "application/json; charset=utf-8");// 發送POST請求必須設置如下兩行conn.setDoOutput( true);conn.setDoInput( true);conn.setUseCaches( false);conn.setSSLSocketFactory(ssf);// 獲取URLConnection對象對應的輸出流out = new PrintWriter(conn.getOutputStream());// 發送請求參數log.info(url+"post請求數據"+param);out.print(param);// flush輸出流的緩沖sout.flush();is = conn.getInputStream();br = new BufferedReader( new InputStreamReader(is));String line = null;while ((line=br.readLine())!= null) {strBuffer.append(line);}result = strBuffer.toString();log.info("響應結果"+result);} catch (Exception e) {log.info("請求異常",e);}// 使用finally塊來關閉輸出流、輸入流finally {try {if (out != null) {out.close();}if (br != null) {br.close();}if (conn!= null) {conn.disconnect();}} catch (IOException ex) {log.info("調用異常",ex);}}log.info(url+"post請求響應結果"+result);return result;}網上有其他的解決方法,有的是這樣設置System.setProperty(“https.protocols”, “TLSv1.2,TLSv1.1,SSLv3”),這種個人感覺還是不太好,這個像是全文設置,可能會影響別的地方,希望能給你提供幫助。
總結
以上是生活随笔為你收集整理的javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02 如何测量节点特征?
- 下一篇: Laya 2.1.1.1 Unity模型