HttpClient HTTPS使用方法

cow977發表於2011-04-29

處理HTTPS協議

 

HttpClient提供了對SSL的支援,在使用SSL之前必須安裝JSSE。在Sun提供的1.4以後的版本中,JSSE已經整合到JDK中,如果你使用的是JDK1.4以前的版本則必須安裝JSSEJSSE不同的廠家有不同的實現。下面介紹怎麼使用HttpClient來開啟Https連線。這裡有兩種方法可以開啟https連線,第一種就是得到伺服器頒發的證照,然後匯入到本地的keystore中;另外一種辦法就是透過擴充套件HttpClient的類來實現自動接受證照。

 

方法1,取得證照,並匯入本地的keystore

 

•安裝JSSE (如果你使用的JDK版本是1.4或者1.4以上就可以跳過這一步)。本文以IBMJSSE為例子說明。先到IBM網站上下載JSSE的安裝包。然後解壓開之後將ibmjsse.jar包複製到\lib\ext\目錄下。

•取得並且匯入證照。證照可以透過IE來獲得:

1. 用IE開啟需要連線的https網址,會彈出如下對話方塊:

2. 單擊"View Certificate",在彈出的對話方塊中選擇"Details",然後再單擊"Copy to File",根據提供的嚮導生成待訪問網頁的證照檔案

3. 嚮導第一步,歡迎介面,直接單擊"Next"

4. 嚮導第二步,選擇匯出的檔案格式,預設,單擊"Next"

5. 嚮導第三步,輸入匯出的檔名,輸入後,單擊"Next"

6. 嚮導第四步,單擊"Finish",完成嚮導

7. 最後彈出一個對話方塊,顯示匯出成功

 

•用keytool工具把剛才匯出的證照倒入本地keystoreKeytool命令在\bin\下,開啟命令列視窗,併到\lib\security\目錄下,執行下面的命令:

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,如果用的是IBMJSSE Provider,在程式中加入這樣的一行:

 if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null)

 Security.addProvider(new IBMJSSEProvider());

 

或者也可以開啟\lib\security\java.security,在行

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複製到\lib\ext\目錄下。

 

3. 丟擲異常javax.net.ssl.SSLHandshakeException: unknown certificate。出現這個異常表明你的JSSE應該已經安裝正確,但是可能因為你沒有把證照匯入到當前執行JREkeystore中,請按照前面介紹的步驟來匯入你的證照。

 

方法2,擴充套件HttpClient類實現自動接受證照

 

因為這種方法自動接收所有證照,因此存在一定的安全問題,所以在使用這種方法前請仔細考慮您的系統的安全需求。具體的步驟如下:

 

•提供一個自定義的socket factorytest.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中使用代理伺服器非常簡單,呼叫HttpClientsetProxy方法就可以,方法的第一個引數是代理伺服器地址,第二個引數是埠號。另外HttpClient也支援SOCKS代理。

 

httpClient.getHostConfiguration().setProxy(hostName,port);

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-694108/,如需轉載,請註明出處,否則將追究法律責任。

相關文章