2013-02-24 46 views
0

我正在用java構建一個網絡驗證系統。 我想用SSL加密連接,所以我使用SSLServerSocket。 我產生了keytool密鑰庫(在SSL目錄)未經驗證的SSL加密(SSH Like)

keytool -genkey -keystore myKeystore -keyalg RSA 

然後在我的服務器類:

System.setProperty("javax.net.ssl.keyStore", "ssl/myKeystore"); 
System.setProperty("javax.net.ssl.keyStorePassword", "123456"); 

然後在我的客戶:

System.setProperty("javax.net.ssl.trustStore", "ssl/myKeystore"); 
System.setProperty("javax.net.ssl.trustStorePassword", "123456"); 

這工作,但我不能依靠客戶來創建密鑰庫。

我的目標是一個類似於SSH的模型:客戶端有一個私鑰,它將發送給服務器,服務器使用公鑰對其進行驗證。

我不能使用簡單的RSA密鑰文件而不是密鑰庫嗎?

+0

如果沒有證書,則無法執行SSL。您可以在初始握手中規避身份驗證;但是證書也用於加密密鑰。也許http://stackoverflow.com/questions/859111/how-do-i-accept-a-self-signed-certificate-with-a-java-httpsurlconnection顯示你想要做什麼。 – 2013-02-24 18:59:56

+1

@PeterRitchie證書不用於加密。 SSL使用兩端獨立生成的對稱會話密鑰。 – EJP 2013-02-24 20:24:00

+0

@ejp證書中的密鑰可能用於加密......並且可能用於協商的某些部分。如果沒有至少一個證書,你就不能這麼做任何SSL(包括加密)。即對等方不能在沒有初始證書的情況下協商加密算法或交換新的密鑰。 – 2013-02-25 02:07:08

回答

1

您似乎在這裏混淆了很多方面。雖然SSH不依賴於SSL/TLS,但這些概念確實大致相同。

通過在您的客戶端上設置與服務器上的密鑰庫匹配的信任庫,您可以使客戶端信任服務器的公鑰(在其證書中)。

這是具有預加載的可信服務器密鑰指紋的SSH等效項。大多數SSH客戶端會在建立第一個連接時學習服務器的公鑰或其指紋(原則上您要手動驗證該指紋):您可以在Java中使用SSL/TLS實現此操作,這或多或少是Andreas Sterbenz's InstallCert呢。

這樣做的目的是爲了允許客戶端驗證服務器的身份(如果沒有這種身份驗證,MITM攻擊是可能的)。

客戶端有一個私鑰,它將發送到服務器,並且 服務器使用公鑰驗證它。

當客戶端有一個私鑰(它實際上使用,但從來沒有發送到服務器),這只是用於驗證客戶端。這樣做的目的是允許服務器驗證客戶端的身份(例如,作爲密碼認證的替代方法)。

這也可以使用SSL/TLS使用客戶端證書認證完成。

SSH和SSL/TLS之間的主要區別(協議不在)是SSL/TLS傾向於使用X.509證書(包含公鑰和描述實體身份的附加屬性),而SSH傾向於直接使用原始公鑰。 (還有SSH的擴展使用X.509證書,但它們並不常見)。

在這兩種情況下,客戶端都需要驗證服務器的身份以防止MITM攻擊。這更常規地使用公鑰基礎設施(和X.509證書)進行SSL/TLS,但您也可以在初次連接時學習關鍵字,例如SSH:這需要更多工作(您需要一個自定義信任管理器) 。合理的妥協(在受控環境中)是在客戶端上使用信任存儲,並預裝了服務器的證書。這或多或少是你已經完成的,除了你永遠不應該把服務器的私鑰給別人。 你真的不應該在這裏使用相同的密鑰庫,因爲服務器的密鑰庫將包含它的私鑰:相反,只導出證書並將其導入到密鑰庫中,您將在另一方使用它作爲信任庫。

+0

我實際上並不在意使用SSL。實際上,我的理想場景是讓服務器端在首次安裝時生成SSL證書,然後讓客戶端信任任何證書(後者我已經知道如何)。我並不擔心MITM,因爲客戶端連接時首先需要進行身份驗證,並且連接已經安全。此外,我不能使用keytool來生成證書,因爲我的項目也被嵌入到像Android這樣的設備中,沒有完整的java安裝,所以我需要一種方法來加密連接或在運行時生成證書。 – Twinone 2013-02-26 17:51:22

+0

「*我不擔心MITM,因爲當他連接時請求客戶端的第一件事就是進行身份驗證,並且連接已經安全。*」。什麼保證連接呢? – Bruno 2013-02-26 23:00:36