httpclient傳送資料建立SSL連線時向HTTPS的異常

巴扎黑
發布: 2016-12-20 15:08:39
原創
1778 人瀏覽過

異常訊息如下:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertget 完成.

原因:伺服器的憑證不被信任。一般是這樣造成的。

使用KEYTOOL工具建立證書,然後用TOMCAT啟動後,在瀏覽器開啟網站時,會出現證書不被信任的提示。當然,利用HTTPCLIENT向服務端HTTPS傳送資料時,HTTPCLIENT也會偵測服務端的憑證是否被信任,不被信任就拋出上面的例外。

解決辦法有兩種,一種是讓憑證被客戶端信任。另一種是使用HTTPCLIENT傳送資料時不偵測伺服器憑證是否可信。

 

第一種辦法,使證書被信任。

 

找正規CA簽發證書,或是自己簽發證書(只能那一台客戶機上可信)。找正規CA簽發證書就不說了,自己簽發證書呢,見我的其他文章。

 

我發現,自己簽署的憑證弄好之後,從客戶端開啟服務端位址時,不再提示上面的錯誤,但是還是不能傳送資料。原因是什麼呢?因為那台憑證在客戶端作業系統上可信,但是在JAVA的KEYSTORE裡不可信,要把服務端的憑證導入KEYSTORE庫中

 

導入辦法:

打開命令列窗口,並到libsecurity 目錄下,執行下面的指令:

keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer

 

 

要注意的是,如果客戶端電腦上裝有許多個JAVA版本,要確定你導入的證書的JAVA版本是你TOMCAT使用的那個,一般TOMCAT使用的是環境變量指向的那個JAVA版本。

如果是在ECLIPSE中建立的TOMCAT伺服器,新建時會要你選擇預設JRE還是指向的JAVA,這裡一定要選指向剛才導入的那個JAVA的路徑,不然,你導入的憑證庫也沒效果。

 

第二種辦法,使用HTTPCLIENT時不檢測伺服器憑證是否可信任

 

擴充HttpClient 類實作自動接受憑證

 

因為此方法接收所有安全性, 

所以在使用這種方法前請仔細考慮您的系統的安全需求。具體的步驟如下:

 

•提供一個自訂的socket factory (test.MySecureProtocolSocketFactory )。這個自訂的類別必須實作介面org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory ,在實作介面的類別中呼叫自訂的X509TrustManager(test.MyX509TrustManager) ,這兩個類別可以在隨本文帶的配件中得到

•建立一個org.apache.commons.httpclient.protocol.Protocol 的實例,指定協定名稱和預設的連接埠號碼

Protocol myhttps = new Protocol("https", new MySecureProtocolSocketet (Factory), 443);

•註冊剛剛建立的https 協定物件

Protocol.registerProtocol("https ", myhttps);

 

•然後依照一般程式設計 方式開啟https 的目標地址,程式碼如下:

•然後依照一般程式設計 方式打開

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板