這是我對SSL的理解,我不是這方面的專家,但是在沒有其他答案的情況下,我希望至少能給你一些想法。
當您爲服務器創建自簽名證書時,您需要以某種方式將其添加到客戶端,一旦客戶端連接,它就不會立即安裝,否則任何服務器都可能通過發送自簽名證書任何試圖連接到它的東西。在我的應用程序中,通過指定javax.net.ssl.truststore(「path/to/server/cert」)啓動服務器證書時,服務器證書將被加載到客戶機的信任庫中。
現在,當客戶端連接到服務器時握手發生。在這一點上,服務器會將它的證書發送給客戶端,客戶端將確認它實際上來自服務器,通過檢查它與信任庫(在這一點上它是否是自簽名無關緊要,因爲客戶端應該檢查根證書以及任何你已經添加的)。如果服務器發送的證書檢查出通信繼續並且共享數據。
會議behvaiour有某種形式發生,允許進行通信而無需每次交換證書。但我相信這僅限於單一連接,因此,只要關閉連接並創建新連接,就必須重複該過程,即服務器必須重新發送證書以進行驗證。
因此總結:自簽名服務器證書必須安裝在SSL通信之外的客戶端上(例如從一開始就如何在產品中安裝根CA證書)。 在客戶端和服務器之間建立的每個SSL連接都要求服務器將其證書發送到客戶端,以便它可以根據其信任庫進行檢查。
服務器可能會允許恢復會話,在這種情況下證書不會被重新發送(但我不確定在什麼情況下會話可以恢復,也許可以在不同的服務器上配置) 。
希望這至少給你一些想法。
我在java中編寫了一個https模擬器。我能夠使用自簽名證書在15秒內模擬12000-15000個請求。但是使用CA證書需要3分鐘?我真的不明白爲什麼會發生這種情況。處理自簽名和CA證書有什麼細微差別? – JKV 2010-04-26 11:26:24