2010-04-23 210 views
5

我在SSL握手中有一個非常基本的疑問。假設我們有一個使用自簽名證書的服務器S.我編寫一個連接到S的Java客戶端C.當C連接到S時,C從S獲得證書並將它們保存到它的信任庫,並且通信的其餘部分繼續。一段時間後,我使用相同的C連接到S,所以S將證書再次發送給C,否則C將使用已存儲在信任庫中的證書。我不擅長SSL中的Java和Truststore功能的底層實現。Java客戶端SSL握手

將S發送證書給C不變的C是否在其信任庫上有證書?我相信,如果我在Truststore C信任證書中,當我再次連接時,S和C不會要求證書?我的假設是否正確?

自簽名證書和CA證書的過程是否相同?

在此先感謝。

+1

我在java中編寫了一個https模擬器。我能夠使用自簽名證書在15秒內模擬12000-15000個請求。但是使用CA證書需要3分鐘?我真的不明白爲什麼會發生這種情況。處理自簽名和CA證書有什麼細微差別? – JKV 2010-04-26 11:26:24

回答

6

這是我對SSL的理解,我不是這方面的專家,但是在沒有其他答案的情況下,我希望至少能給你一些想法。

當您爲服務器創建自簽名證書時,您需要以某種方式將其添加到客戶端,一旦客戶端連接,它就不會立即安裝,否則任何服務器都可能通過發送自簽名證書任何試圖連接到它的東西。在我的應用程序中,通過指定javax.net.ssl.truststore(「path/to/server/cert」)啓動服務器證書時,服務器證書將被加載到客戶機的信任庫中。

現在,當客戶端連接到服務器時握手發生。在這一點上,服務器會將它的證書發送給客戶端,客戶端將確認它實際上來自服務器,通過檢查它與信任庫(在這一點上它是否是自簽名無關緊要,因爲客戶端應該檢查根證書以及任何你已經添加的)。如果服務器發送的證書檢查出通信繼續並且共享數據。

會議behvaiour有某種形式發生,允許進行通信而無需每次交換證書。但我相信這僅限於單一連接,因此,只要關閉連接並創建新連接,就必須重複該過程,即服務器必須重新發送證書以進行驗證。

因此總結:自簽名服務器證書必須安裝在SSL通信之外的客戶端上(例如從一開始就如何在產品中安裝根CA證書)。 在客戶端和服務器之間建立的每個SSL連接都要求服務器將其證書發送到客戶端,以便它可以根據其信任庫進行檢查。

服務器可能會允許恢復會話,在這種情況下證書不會被重新發送(但我不確定在什麼情況下會話可以恢復,也許可以在不同的服務器上配置) 。

希望這至少給你一些想法。

+0

這很不錯。恢復能力不受連接限制;它通常只是會話有一定的生命週期的問題,通常是五分鐘,在此期間,相同SSL對等體之間的新SSL連接可以重用開始時生成的主密鑰。 – 2010-04-24 00:55:06

+0

我用java編寫了一個https模擬器。我能夠使用自簽名證書在15秒內模擬12000-15000個請求。但是使用CA證書需要3分鐘?我真的不明白爲什麼會發生這種情況。處理自簽名和CA證書有什麼細微差別? – JKV 2010-04-26 11:28:47

+1

我不認爲他們的處理方式有任何不同,但是證書本身可能存在差異。也許自簽名證書中使用的密鑰大小比CA證書短? CA證書可能有一長串證書,因此爲了驗證客戶端證書,它必須查看更長的可信證書列表。 我認爲有辦法看openssl這些東西。 – DaveJohnston 2010-04-27 08:58:03