2017-10-13 35 views
0

我知道在正常的SSL握手過程中,客戶端收到服務器的證書並驗證它,然後使用服務器的公鑰來加密會話密鑰。客戶端如何使用預先存儲的服務器證書進行SSL握手?

我想在Linux上用C語言編寫SSL客戶端。在SSL握手期間,它不必等待服務器的證書,並且它會發送用服務器的公鑰加密的會話密鑰,這些密鑰以前已經下載過。

我正在學習如何使用OpenSSL,我只需要這裏的do-handshake部分。

感謝您的關注。爲什麼要這樣做? ISP或網關可以檢查證書並根據證書中的名稱阻止連接。

+0

爲什麼?如何告訴服務器不要發送證書?你如何處理更改的證書?聽起來對我來說是一個壞主意,這可能是一個[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

+0

爲了做到這一點,您需要訪問客戶端和服務器代碼,並且一旦實現,此握手只能在客戶端和服務器之間進行,即服務器無法與任何其他客戶端進行通信。 – mnistic

+0

「*客戶端如何使用預先存儲的服務器證書進行SSL握手?*」只需使用它,忽略服務器發送給客戶端的內容? – alk

回答

1

不幸的是,這是不可能的。作爲SSL(或TLS)協議的一部分,服務器將始終發送其證書。

如果你想繞過ISP審查,我推薦使用VPN或Tor。

+1

除非雙方支持並同意其中一個「匿名」或PSK或SRP密鑰交換 - 但沒有公共服務器會這樣做;你必須運行你自己的服務器,如果你這樣做,你可以更容易地(並且不那麼明顯)使用普通的基於證書的keyexchange和你選擇的無害的名字。 –

+0

@ dave_thompson_085客戶是否可以假裝接收證書(使用預先存儲的證書)並完成握手? – judian

+0

@judian:不太可能。如果ISP或其他MitM將證書消息從TCP中剪接出來,但將其他所有內容(包括調整後的序列號)都留下,並且您可以將證書消息(而不僅僅是單個證書)完美僞造,原則上握手可以繼續。請注意,它只能是證書信息而不是全部航班;你仍然需要serverhello,通常serverkx。但事實上,MitM將完全阻止連接,除非你讓服務器根本不發送證書,而且只有在你運行的服務器(或者有朋友運行)時纔會發生。 _並且你禁用SNI。 –

相關問題