HttpClient HTTPS使用方法
處理HTTPS協議
HttpClient提供了對SSL的支援,在使用SSL之前必須安裝JSSE。在Sun提供的1.4以後的版本中,JSSE已經整合到JDK中,如果你使用的是JDK1.4以前的版本則必須安裝JSSE。JSSE不同的廠家有不同的實現。下面介紹怎麼使用HttpClient來開啟Https連線。這裡有兩種方法可以開啟https連線,第一種就是得到伺服器頒發的證照,然後匯入到本地的keystore中;另外一種辦法就是透過擴充套件HttpClient的類來實現自動接受證照。
方法1,取得證照,並匯入本地的keystore:
•安裝JSSE (如果你使用的JDK版本是1.4或者1.4以上就可以跳過這一步)。本文以IBM的JSSE為例子說明。先到IBM網站上下載JSSE的安裝包。然後解壓開之後將ibmjsse.jar包複製到
•取得並且匯入證照。證照可以透過IE來獲得:
1. 用IE開啟需要連線的https網址,會彈出如下對話方塊:
2. 單擊"View Certificate",在彈出的對話方塊中選擇"Details",然後再單擊"Copy to File",根據提供的嚮導生成待訪問網頁的證照檔案
3. 嚮導第一步,歡迎介面,直接單擊"Next",
4. 嚮導第二步,選擇匯出的檔案格式,預設,單擊"Next",
5. 嚮導第三步,輸入匯出的檔名,輸入後,單擊"Next",
6. 嚮導第四步,單擊"Finish",完成嚮導
7. 最後彈出一個對話方塊,顯示匯出成功
•用keytool工具把剛才匯出的證照倒入本地keystore。Keytool命令在
keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer
其中引數alias後跟的值是當前證照在keystore中的唯一識別符號,但是大小寫不區分;引數file後跟的是剛才透過IE匯出的證照所在的路徑和檔名;如果你想刪除剛才匯入到keystore的證照,可以用命令:
keytool -delete -keystore cacerts -storepass changeit -alias yourEntry1
•寫程式訪問https地址。如果想測試是否能連上https,只需要稍改一下GetSample例子,把請求的目標變成一個https地址。
GetMethod getMethod = new GetMethod("");
執行該程式可能出現的問題:
1. 丟擲異常java.net.SocketException: Algorithm SSL not available。出現這個異常可能是因為沒有加JSSEProvider,如果用的是IBM的JSSE Provider,在程式中加入這樣的一行:
if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null)
Security.addProvider(new IBMJSSEProvider());
或者也可以開啟
security.provider.1=sun.security.provider.Sun
security.provider.2=com.ibm.crypto.provider.IBMJCE
後面加入security.provider.3=com.ibm.jsse.IBMJSSEProvider
2. 丟擲異常java.net.SocketException: SSL implementation not available。出現這個異常可能是你沒有把ibmjsse.jar複製到
3. 丟擲異常javax.net.ssl.SSLHandshakeException: unknown certificate。出現這個異常表明你的JSSE應該已經安裝正確,但是可能因為你沒有把證照匯入到當前執行JRE的keystore中,請按照前面介紹的步驟來匯入你的證照。
方法2,擴充套件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 MySecureProtocolSocketFactory (), 443);
•註冊剛才建立的https協議物件
Protocol.registerProtocol("https ", myhttps);
•然後按照普通程式設計方式開啟https的目標地址,程式碼請參見test.NoCertificationHttpsGetSample
處理代理伺服器
HttpClient中使用代理伺服器非常簡單,呼叫HttpClient中setProxy方法就可以,方法的第一個引數是代理伺服器地址,第二個引數是埠號。另外HttpClient也支援SOCKS代理。
httpClient.getHostConfiguration().setProxy(hostName,port);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-694108/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HttpClient初步使用方法HTTPclient
- 通過 Apache Commons HttpClient 傳送 HTTPS 請求ApacheHTTPclient
- 關於httpclient 請求https (如何繞過證書驗證)HTTPclient
- HttpclientHTTPclient
- httpclient 4.5.3HTTPclient
- Apache之HttpClientApacheHTTPclient
- HttpClient介紹HTTPclient
- HttpClient 完整教程HTTPclient
- 【HttpClient】httpclient之post 方法(引數為Map型別)HTTPclient型別
- Java用HttpClient3傳送http/https協議get/post請求,傳送map,jsoJavaHTTPclient協議JS
- 工具篇:apache-httpClient 和 jdk11-HttpClient的使用ApacheHTTPclientJDK
- Go - httpclient 常用操作GoHTTPclient
- HttpClient--入門HTTPclient
- httpclient的池化HTTPclient
- HttpClient 簡單例子HTTPclient單例
- Httpclient 介面自動化HTTPclient
- 聊聊jdk httpclient的executorJDKHTTPclient
- HttpClient請求工具類HTTPclient
- httpclient基礎知識HTTPclient
- HttpClient 不能做的事情HTTPclient
- HttpClient的簡單使用HTTPclient
- Web介面測試-HttpClientWebHTTPclient
- HttpClient 下載檔案HTTPclient
- Java用HttpClient3傳送http/https協議get/post請求,傳送map,json,xml,txt資料JavaHTTPclient協議JSONXML
- .NET Core HttpClient原始碼探究HTTPclient原始碼
- 為HttpClient開啟HTTP/2HTTPclient
- Java HttpClient Basic Credential 認證JavaHTTPclient
- HttpClient設定超時(轉)HTTPclient
- HttpURLConnection和HttpClient的使用HTTPclient
- HttpClient--傳送請求HTTPclient
- HttpClient 解決中文亂碼HTTPclient
- 使用HttpClient時出錯NoClassDefFoundErrorHTTPclientError
- HttpClient 進行soap請求HTTPclient
- RestTemplate和 apache HttpClient 使用方式RESTApacheHTTPclient
- 優雅通過HttpClientFactory使用HttpClientHTTPclient
- Java11 HttpClient小試牛刀JavaHTTPclient
- Apache httpclient的execute方法除錯ApacheHTTPclient除錯
- .Netcore HttpClient原始碼探究NetCoreHTTPclient原始碼