異常訊息如下:
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庫中
導入辦法:
打開命令列窗口,並到
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 的目標地址,程式碼如下:
•然後依照一般程式設計 方式打開