我想加深對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中運行相同的容器)將使用寬鬆的證書驗證邏輯,但是現在我開始覺得只要接受自簽名證書的有效性,任何事情都會執行。
是的,我知道有安全隱患,但爲什麼我需要這在所有的唯一原因是用於測試目的。這個想法是實現一個配置選項,該選項控制通常不可信的證書是否可信,並將其保留爲「不信任不可信的服務器證書」作爲默認值。這種方式可以很容易地在開發中打開或關閉,但在生產中這樣做需要走出困境。
是的,3.1已棄用您所舉例的協議構造函數,並且顯然沒有HttpConnection#setProtocol方法。可惜,它確實看起來很有希望。 :( –
的構造也被棄用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
工廠可以轉換爲'ProtocolSocketFactory',這僅是一個上溯造型,因此沒有必要的,如果它們刪除廢棄的構造,那麼它現在已經使用了不推薦使用的構造函數,我會更新我的文章。 – Gandalf