2011-10-07 139 views
7

我想加深對Apache Commons的HttpClient庫(3.1版),以忽視的事實是服務器證書不能作爲信任建立(被拋出的異常javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target證明)。如何使Apache Commons HttpClient 3.1忽略HTTPS證書無效?

我發現Make a connection to a HTTPS server from Java and ignore the validity of the security certificate以及Disable Certificate Validation in Java SSL Connections,但接受的答案首先是HttpClient的4.0(可惜我不能升級,除非有人能指出我如何使用兩個不同版本的同一方向圖書館在同一個項目中),雖然它確實有another answer with little more than a dead link that supposedly went to a 3.x solution。當我使用稍微調整後的版本時(第二頁的代碼似乎沒有任何效果)(基本上,以舊的方式聲明類而不是使用匿名內聯的類,以及除SSL之外的TLS,使用SSL作爲示例代碼中完成的默認HTTPS套接字工廠)。

最好,我想的東西,是thread- /實例範圍,因此任何HttpClient實例(和/或相關的類)創建從我的servlet代碼內另一個servlet中運行相同的容器)將使用寬鬆的證書驗證邏輯,但是現在我開始覺得只要接受自簽名證書的有效性,任何事情都會執行。

是的,我知道有安全隱患,但爲什麼我需要這在所有的唯一原因是用於測試目的。這個想法是實現一個配置選項,該選項控制通常不可信的證書是否可信,並將其保留爲「不信任不可信的服務器證書」作爲默認值。這種方式可以很容易地在開發中打開或關閉,但在生產中這樣做需要走出困境。

回答

11

接受自簽名的證書,我們使用下面的代碼爲特定HttpConnection從公共HTTP客戶端。

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

EasySSLProtocolSocketFactory可以在contrib ssl包中找到。這可以用於僅使用降低的安全設置進行單一連接。 好像這也可以用於設置爲每個客戶端的協議如下所示:

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

但我認爲這也將影響到其他的servlet的連接。

[編輯] 對不起,我不知道這是否會爲你工作。只是認識到我們正在使用客戶端3.0.1而不是3.1。

+0

是的,3.1已棄用您所舉例的協議構造函數,並且顯然沒有HttpConnection#setProtocol方法。可惜,它確實看起來很有希望。 :( –

+0

的構造也被棄用3.0.1)根據apache的源代碼庫'HttpConnection'仍具有3.1'setProtocol'方法:http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

工廠可以轉換爲'ProtocolSocketFactory',這僅是一個上溯造型,因此沒有必要的,如果它們刪除廢棄的構造,那麼它現在已經使用了不推薦使用的構造函數,我會更新我的文章。 – Gandalf