簡體   English   中英

Java客戶端上的SSL握手

[英]SSL HandShake on Java Client

我對SSL HandShake有一個非常基本的疑問。 假設我們有一個使用自簽名證書的服務器S。 我編寫了一個連接到S的Java客戶端C。當C連接到S時,C從S獲得證書並將其保存到其信任庫中,通信的其余部分繼續進行。 一段時間后,我使用相同的C連接到S,因此S將再次將證書發送給C,否則C將使用已經存儲在truststore中的證書。 我不擅長SSL和Java中Truststore功能的基礎實現。

S是否會向C發送證書,而C是否會在C的信任庫中擁有證書? 我相信,如果我在信任庫C中擁有證書,那么當我再次連接時,信任S和C不會要求提供證書? 我的假設正確嗎?

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

提前致謝。

這是我對SSL的理解,我不是該主題的專家,但是在沒有其他答案的情況下,希望我至少可以給您一些思考的方法。

當您為服務器創建自簽名證書時,需要以某種方式將其添加到客戶端,客戶端連接后就不會立即安裝該證書,否則任何服務器都可以通過將自簽名證書發送給任何嘗試訪問的服務器而變得受信任連接到它。 在我的應用程序中,服務器證書在啟動時通過指定javax.net.ssl.truststore(“ path / to / server / cert”)加載到客戶端的信任庫中;

現在,當客戶端連接到服務器時,握手發生了。 此時,服務器會將其證書發送給客戶端,客戶端將通過對照其信任庫檢查證書來確認它實際上是來自服務器的(此時,是否為自簽名無關緊要,因為客戶端應該檢查根證書以及您添加的任何根證書)。 如果服務器發送的證書簽出,則通訊將繼續並共享數據。

有某種形式的會話行為可以使通信繼續進行而不必每次都交換證書。 但是我認為這僅限於單個連接,因此,一旦關閉連接並創建一個新連接,就必須重復該過程,即服務器必須再次發送其證書以進行驗證。

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

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

希望這至少能給您一些思考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM