2011-08-22 192 views
1

我目前正在測試SSL的水域,並且是SSL新手。作爲我的研究的一部分,我在java空間中遇到了兩種不同的SSL實現。我應該使用哪種SSL實現?

首先,讓我說明我的需求,這非常簡單,我只需要一個使用https將數據發佈到URL的流程。

這兩個解決方案中,第一個是純Java實現(僅使用核心Java類),另一個使用Apache HTTPClient執行http。最初,作爲我的測試的一部分,我會得到臭名昭着的「無法找到有效的證書路徑到請求的目標」異常,並且當我從證書(從服務器接收到)不是Java密鑰存儲。一旦我將證書添加到Java密鑰存儲中,應用程序在兩種情況下均可正常工作。 但是,在我使用HTTPClient時,我注意到了使用SSLSocketFactory。

當我測試的HttpClient用下面的代碼,

HttpClient httpClient = new HttpClient(); 
     PostMethod postMethod = new PostMethod(target); 
     postMethod.setQueryString("someQueryString"); 

     try { 
      httpClient.executeMethod(postMethod); 
      System.out.println("Response code: " + postMethod.getStatusLine()); 



      BufferedReader in = new BufferedReader (new InputStreamReader(postMethod.getResponseBodyAsStream())); 
      String temp; 
      while ((temp = in.readLine()) != null){ 
       response += temp + "\n"; 
      } 
      temp = null; 
      in.close(); 
      System.out.println("Server response:\n'" + response + "'"); 

     } catch (HttpException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally{ 
      postMethod.releaseConnection(); 
     } 

它工作得很好,所以我不知道有什麼用的SSLSocketFactory實現的?我最初認爲這很有用,因爲我們希望自動將證書添加到密鑰存儲區。在分析中,我是對的嗎?

如果我的分析屬實,哪個實施比較好?

  • 手動安裝證書是否更好?這種方法有什麼缺點?並且證書是否會過期?如果是這樣,我是否需要再次安裝新證書?
  • 或者我應該使用SSLSocketFactory自動完成整個密鑰存儲添加功能?

您的輸入將不勝感激。謝謝。

回答

2

你不應該這樣做。現有解決方案。

From the docs

有我們 貢獻包提供了一些自定義套接字工廠。他們可以是一個良好的開端對於那些誰尋求 裁縫HTTPS協議的行爲 其應用的特定需求:

  • EasySSLProtocolSocketFactory可以用來創建SSL 連接,讓目標服務器使用 自簽名證書進行身份驗證。

  • StrictSSLProtocolSocketFactory可用於創建SSL連接 可任選 順序執行主機名進行驗證,以防止人在這方面的中間人類型的攻擊。

  • AuthSSLProtocolSocketFactory可用於選擇強制執行 相互客戶端/服務器身份驗證。這是協議套接字工廠最靈活的 實現。它允許定製 大部分(如果不是全部的話)SSL認證的方面。

+0

嗯,據我所知,我不需要任何SSL定製。當我試圖使用HTTPClient開箱時,我得到的唯一錯誤是「無法找到有效的證書路徑到請求的目標」,我通過使服務器證書成爲Java密鑰存儲的一部分來解決這個問題。那麼這個實現對我來說是最好的選擇嗎? – Seagull

1

我跨越SSL的兩種不同的實現在Java領域來了。

不,你沒有。你遇到了內置的JSSE和Apache已經建立的左右的一些東西,它在左右。消息'無法找到有效的認證路徑到請求的目標'例如來自JSSE,實際上來自JCE。

我知道的JSSE本身的唯一其他實現是在IBM JVM中。