2012-08-15 76 views
1

關於如何處理使用Java的自簽名證書並經常提供實現,已經問了很多次問題。但是,我不確定這些實現是否會給我所需的安全/信任。需要關於自簽名SSL和Java的建議

我的情況如下:我有一個客戶端程序連接到我們的服務器應用程序。這兩個我們都有完全的控制權。我們的客戶帖子使用https到我們的服務器的URL,並且服務器響應。目前(這正是我想解決的問題)服務器有一個自簽名證書。 Java並不喜歡這種情況,並且僅僅用於測試,我們幾乎完全忽視了任何證書的認證。

我對SSL有一點了解。我的老闆說我們可以使用我們的自簽名證書,只要我們不加密,它就會安全。關鍵公衆。這聽起來對我來說是正確的,但很多帖子都說自簽名證書會自動容易受到中間人攻擊。這是否意味着SSL發送crypt。鑰匙連同證書?

既然我們對兩端都有控制權,那麼我們是否應該用密鑰對自己的數據進行加密,然後用密鑰對它進行解密?還是有理由使用SSL?

+0

不是這方面的專家,但我相信如果您從證書中請求特定的公鑰(而不是相信自簽名或由特定發行者簽署),您可以避免中間人攻擊。 – antlersoft 2012-08-15 22:11:21

回答

3

不要盲目地信任任何證書(這會使連接容易受到MITM攻擊),請將您的Java客戶端配置爲信任該特定證書。自簽名證書本身不會使SSL/TLS連接容易受到MITM攻擊的影響,他們只是將它們的分發和信任評估更特定於此特定部署(即,您必須手動配置它)。

可以在至少3種方式做到這一點(挑最簡單的一個你,我建議子彈點#2):

  • 導入服務器證書到你客戶的全球信任存儲(lib/security/cacerts你的JRE目錄)。這將使所有使用此JRE的應用程序都信任此證書。
  • 將服務器證書導入到另一個信任庫(可能是本地副本lib/security/cacerts),並使此特定應用程序使用此信任庫。這可以使用javax.net.ssl.trustStore系統屬性完成。
  • 使您的客戶端應用程序使用SSLContext初始化,配置爲信任該證書:TrustManagerFactory通過加載包含特定證書的本地密鑰存儲庫(如上一個方法)手動寫入的信息。

你會在JSSE Reference Guide找到更多關於這一切的細節。

This answer to a similar question應該給你詳細的做所有這些,特別是keytool -import ...。)

+0

使用keytool修改密鑰庫似乎並不現實,因爲這不在代碼庫中。我想在運行時使用它,所以在運行時,證書不在密鑰庫中。 – Dave 2012-08-15 22:27:53

+0

您可以使用第三種方法(請參閱鏈接中的erickson答案),並從您的類路徑中的輸入流中加載的新密鑰庫加載您的信任庫,如果您想將其與您的代碼一起分發。第二種方法通常不是什麼大問題,正如我所說的那樣,創建'cacerts'的本地副本(或者創建一個新的密鑰庫)並僅爲該應用程序設置系統屬性。它不一定是影響所有應用程序的文件。這只是配置,無論如何你都必須配置這種或那種方式。 – Bruno 2012-08-15 22:45:37

0

針對自簽名證書的論據主要適用於網絡應用程序。由於使用當前的基礎設施,瀏覽器將無法驗證您的自簽名證書。

由於您可以控制客戶端,因此您可以簡單地將您期望的證書硬編碼到客戶端。例如,您可以計算證書的sha1哈希值,並檢查它是否與預期值匹配。這樣你甚至不需要信任數百個CA.

0

要實現安全通信,您需要先確保您與正確的計算機通話。當客戶端首次嘗試建立安全連接時,它會ping服務器,服務器會以其證書進行響應。此時,您必須在繼續之前驗證服務器證書。該證書包含可用於確保證書有效的公鑰和簽名。例如,在Web瀏覽器中,這意味着檢查是否已經在瀏覽器設置中列出爲可信的授權機構簽名,如果檢查失敗,您將在瀏覽器中看到紅色警告。在你的情況下,這意味着你已經手動(或在代碼中)將服務器證書添加到信任存儲中,以便它被信任。