1. 程式人生 > >javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

這裡寫圖片描述

Hello,小夥伴好久不見!今天在聯調介面時,遇到一個錯誤,糾結了好久才解決.雖然是粗心引起的,但是也大概明白了引起這個錯誤的來龍去脈,現在整理一下,分享給大家,希望大家在遇到這個類似問題了,不會太無助;

前言

我們來看下問題發生的大背景;這次我們聯調是一個獲取單筆訂單詳情的介面,採用https請求方式.我方是請求方,現需請求能力開發平臺(對方)的介面
1.Https加密認證過程是什麼樣的?
我們來看看介面文件的描述(對方視角):
能力開放平臺介面傳輸採用HTTPS加密傳輸。介面為RESTFul風格的WebService,資訊互動過程為使用者按我方提供的webservice地址進行呼叫,我方接到呼叫請求後,為使用者返回JSON格式組織的資訊,使用者依據約定的介面規範對資料進行解析。它將使用者與移動商城開放平臺之間傳輸的內容進行加密認證。使內容的傳輸處於安全的加密狀態,以防止資料在傳輸中途被竊取。
客戶端認證:由能力開放平臺為各個商戶自有系統頒發客戶端的自簽發SSL證書和金鑰,通過該證書和金鑰來訪問能力開放平臺介面。
能力開放平臺使用自身的根證書為商戶自有系統頒發客戶端證書和金鑰:
1. client.crt:客戶端證書檔案
2. client.key : 客戶端金鑰檔案
3. 客戶端證書密碼
2.什麼是SSL證書?


SSL 證書就是遵守 SSL協議,由受信任的數字證書頒發機構CA,在驗證伺服器身份後頒發,具有伺服器身份驗證和資料傳輸加密功能。
3.環境情況
1)jdk1.7
2)httpclient_4.2.1.jar

一.場景再現

當我們請求對方介面時,發現報瞭如下錯誤

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

這裡寫圖片描述

二.刨根問底

1.溫故知新

遇到未見過錯誤,第一時間拿報錯資訊去問了度娘,首先發現這位兄臺的部落格,是我明白了
在我們分析什麼原因導致了這個問題之前,我們需要搞明白一件事:https的socket工作原理是怎樣的?
https的socket工作原理流程圖如下:
這裡寫圖片描述


接下來,我們需要搞清楚什麼原因會導致這類報錯,下面這邊部落格可以給我們一些思路;peer not authenticated的終極解決方案
在這邊文章中,作者介紹可能引發這個報錯的幾種原因,總結如下:
  首先,要知道導致報這個異常的原因不僅僅是因為證書校驗不通過。
  1.在我們通過https連結伺服器時,伺服器會給我們返回一個證書,這個證書可能經過CA認證,也可能是未認證的自制證書,客戶端拿到這個證書後會對這個證書進行驗證,如果是經過CA驗證的證書,自然證書校驗就能通過,自制證書自然就校驗不同過,從而導致上邊的異常。
  2.證書校驗通過後,還需要校驗訪問的域名是否和證書指定的域名是否匹配。未匹配也會導致如上異常。
  3.上邊兩步都校驗通過了才開始進行握手,但握手也有可能失敗,從而導致上邊的異常。
  以上三個步驟中任何一個出了問題,都會連線失敗。

2.問題探究

根據報錯資訊的堆疊資訊,我去跟蹤了原始碼,發現在錯誤的傳送在SSLSessionImpl類的下面方法中
這裡寫圖片描述

public Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
    if(this.cipherSuite.keyExchange != KeyExchange.K_KRB5 && this.cipherSuite.keyExchange != KeyExchange.K_KRB5_EXPORT) {
        if(this.peerCerts == null) {
            throw new SSLPeerUnverifiedException("peer not authenticated");
        } else {
            return (Certificate[])((Certificate[])this.peerCerts.clone());
        }
    } else {
        throw new SSLPeerUnverifiedException("no certificates expected for Kerberos cipher suites");
    }
}

根據如上原始碼,我們發現只有peerCerts==null時候,才導致了報錯.繼續跟蹤原始碼,我們發現下面的方法會給他賦值
這裡寫圖片描述

void setPeerCertificates(X509Certificate[] var1) {
    if(this.peerCerts == null) {
        this.peerCerts = var1;
    }

}

現在有一個問題,什麼時候我們會呼叫這個方法去給他賦值?這個問題困擾了好久,直到看到這位大佬的文章:jdk6出現peer not authenticated問題原因分析與解決
在這篇文章中,我們發現peerCerts是用來儲存服務端返回的證書;附上文章中作者的一段程式碼
1.httpclient未獲取到伺服器證書
這裡寫圖片描述
2.httpclient獲取到了伺服器證書
這裡寫圖片描述
這樣,我們就基本定位問題原因:沒有獲取到服務端證書;

三.解決方案

當我們去搜這個問題解決方案時,會發現很多都是重寫底層的驗證方法來繞過校驗,可能這種解決思路適合需要發起https請求,但是沒有證書的情況;
因為本次介面呼叫時一定需要證書的,所以這類解決思路並不適合我,定位了問題的原因以後,經過排除居然是請求地址未加埠號,導致無法獲取到服務端證書;

重要的事情說三遍:細心,細心,細心!!!

相關推薦

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 問題解決

最近線下除錯銀聯支付時報錯: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SS

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

Hello,小夥伴好久不見!今天在聯調介面時,遇到一個錯誤,糾結了好久才解決.雖然是粗心引起的,但是也大概明白了引起這個錯誤的來龍去脈,現在整理一下,分享給大家,希望大家在遇到這個類似問題了,不會太無助; 前言 我們來看下問題發生的大背景;這次我們聯

HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”異常

在開發https應用時,你的測試伺服器常常沒有一個(有效的)SSL證書。在你的客戶端連線測試伺服器時,如下的異常會被丟擲:”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。 1. 程

避免HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”異常

在開發https應用時,你的測試伺服器常常沒有一個(有效的)SSL證書。在你的客戶端連線測試伺服器時,如下的異常會被丟擲:”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”。 解決方案:修改建

xUtils3 Https請求報錯:javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified,跳過證書檢測

使用xUtils3傳送https請求報錯javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified。 我想不驗證證書直接進行訪問(和http一樣了)。 解決過程:    剛開始設定 (

javax.net.ssl.SSLPeerUnverifiedException: No peer certificate【已解決】

新浪微博 Android SDK 分享時出錯,錯誤資訊:javax.net.ssl.SSLPeerUnverifiedException: No peer certificate com.weibo.net.WeiboException: javax.net.ssl.SSLP

Cas單點登入配置SSL時遇到的javax.net.ssl.SSLPeerUnverifiedException問題的解決方法

網上有很多資料介紹如何整合CAS單點登入產品。由於整合CAS需要預先在tomcat中配置SSL,而且還要在客戶端匯入證書,但是許多人按照網上介紹的操作操作卻發現以下問題:儘管配置了SSL後可以訪問也能登入但是在位址列輸入自己的Web應用的連線,自動跳到Cas登入頁面,登入成

https請求報錯解決:javax.net.ssl.SSLException: Not trusted ...

通過https協議請求資料報錯了一下錯誤:javax.net.ssl.SSLException: Not trusted server certificate exception.在國外論壇上找了個解決的方案和大家分享。      我們需要自定義一個繼承org.apache.http.conn.ssl.SS

Android studio 報錯 gradel project sync failed Error:Cause: peer not authenticated

authent post -m -h cal all del erro 文件 在網上找了半天,應該是找不到gradel的路徑,試了網上非常多方法。本人解決例如以下: 在android studio中設置gradle。打開File-> settings->Gr

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

span color create utf ray [] ret res 調用方法 使用HttpClient4.3 調用https出現如下錯誤: javax.net.ssl.SSLHandshakeException: sun.security.validator.V

解決 Java 調用 Azure SDK 證書錯誤 javax.net.ssl.SSLHandshakeException

初始 rac lis pos 開發 nor 過程 slc cnn Azure 作為微軟的公有雲平臺,提供了非常豐富的 SDK 和 API 讓開發人員可以非常方便的調用的各項服務,目前除了自家的 .NET、Java、Python、 nodeJS、Ruby,PHP 等語言都提供

https 調用驗證失敗 peer not authenticated

實現 不同 not org 失敗 下載 efault ltr net https 調用驗證失敗 peer not authenticated 報錯日誌: Caused by: javax.net.ssl.SSLPeerUnverifiedException: pe

SoapUI 請求 https 報 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

  在 E:\ProgramFiles\SmartBear\SoapUI-Pro-5.1.2\bin\SoapUI-Pro-5.1.2.vmoptions 中新增一行程式碼,程式碼如下: -Dsoapui.https.protocols=TLSv1.1,TLSv1.2 新增一行程式碼

javax.net.ssl.SSLHandshakeException: Remote host closed connection during han 報錯解決

javax.net.ssl.SSLHandshakeException: Remote host closed connection during han 北京某銀行信用卡網申開發團隊發來協助請求,內容是這樣的: 內網中應用伺服器要實現某一功能,需要從外網銀聯端獲取一段資

javax.net.ssl.SSLException 解決辦法(踩坑)

剛剛安裝了ubuntu18.04 ,執行/gradlew assembleDebug的時候報異常javax.net.ssl.SSLException     在網上找找別人的踩坑指南,找了很久很久,終於在stackoverflow上的一行小字找到了解決方法

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 痛苦解決之旅

  上週另外一專案組的同事找到我說,遇到一個問題很棘手兩天了還沒解決掉,報錯如下: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at su

解決javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path

參考部落格:https://blog.csdn.net/u014256984/article/details/73330573 1、新建一個空的InstallCert.java 檔案,用notepad++開啟 2、複製下面的程式碼到檔案裡面,儲存 /*  * Copyright

Fresco 在Android 4.4 版本 載入https圖片問題 javax.net.ssl.SSLHandshakeException

由於Android系統的不同版本支援的TLS 版本不同,導致Fresco 載入https圖片(圖片來源於不同伺服器,並且配置不一樣)出現SSLHandshakeException TLS 用於在兩個通訊應用程式之間提供保密性和資料完整性。TLS 1.0可以理解成

Java呼叫ssl異常,javax.net.ssl.SSLHandshakeException: No appropriate protocol

今天正常執行專案的時候,發現java呼叫SSL的時候,突然一下丟擲一個異常,之前都還是好好的。 javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled

關於sun.net.www.protocol.http.HttpURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection

sun.net.www.protocol.http.HttpURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection 解決方法: 報錯的寫法:URL realUrl = new URL(url);