什麽是 TLS 握手?
TLS 是設計用於保護網際網路通訊的加密和驗證通訊協定。TLS 交握是啟動使用 TLS 之通訊工作階段的過程。在 TLS 交握過程中,通訊雙方交換訊息以相互確認,彼此驗證,確立它們將使用的加密演算法,並協定一致的工作階段金鑰。TLS 交握是 HTTPS 工作原理的基礎部分。
TLS 與 SSL 握手
SSL(安全通訊端層)是為 HTTP 開發的原始安全通訊協定。不久前,SSL 被 TLS (Transport Layer Security) 所取代。SSL 交握現在稱為 TLS 交握,儘管「SSL」這個名稱仍在廣泛使用。
指南
保護應用程式存取的 Zero Trust 指南
TLS 握手什麼時候發生?
使用者導覽到一個使用 HTTPS 的網站,瀏覽器首先開始查詢網站的來源伺服器,這時就會發生 TLS 交握。對於 HTTPS 的任何其他通訊(包括 API 呼叫和 DNS over HTTPS 查詢),也會發生 TLS 交握。
通過 TCP 握手打開 TCP 連接後,將發生 TLS 握手。
安全 SSL
所有 Cloudflare 方案中均包含免費 SSL
TLS 握手過程中發生什麼事情?
TLS 握手過程中,客戶端和伺服器將進行如下操作:
- 指定它们将使用的 TLS 版本(TLS 1.0、1.2、1.3等)
- 决定它们将使用的密码套件(如下)
- 通過伺服器的公開密鑰和 SSL 憑證頒發機構的電子簽名驗證伺服器的身份
- 生成工作階段金鑰,以便在握手完成後使用對稱加密
TLS 握手的步驟是什麼?
TLS 握手是客戶端和伺服器之間交換的一系列資料包(消息)。TLS 握手涉及多個步驟,客戶端和伺服器交換完成握手和進行進一步對話所需的資訊。
TLS 交握中的確切步驟將根據所使用的金鑰交換演算法的種類和雙方支援的密碼套件而有所不同。RSA 金鑰交換演算法雖然現在被認為不安全,但曾在 1.3 之前的 TLS 版本中使用。大致如下:
- 「用戶端問候(client hello)」消息: 用戶端通過向伺服器發送「問候」消息來開始握手。該消息將包含用戶端支援的 TLS 版本,支援的密碼套件,以及稱為一串稱為「用戶端亂數(client random)」的隨機位元組。
- 「伺服器問候(server hello)」消息: 作為對 client hello 消息的回復,伺服器發送一條消息,內含伺服器的 SSL 憑證、伺服器選擇的密碼套件,以及「伺服器亂數(server random)」,即由伺服器生成的另一串隨機位元組。
- 身份驗證: 用戶端使用頒發該憑證的憑證授權驗證伺服器的 SSL 憑證。此舉確認伺服器是其聲稱的身份,且客戶端正在與該域的實際所有者進行交互。
- 預主密鑰: 用戶端再發送一串隨機位元組,即「預主密鑰(premaster secret)」。預主密鑰是使用公開金鑰加密的,只能使用伺服器的私密金鑰解密。(用戶端從伺服器的 SSL 憑證中獲得公開金鑰。)
- 私密金鑰被使用:伺服器對預主密鑰進行解密。
- 生成工作階段金鑰:用戶端和伺服器均使用用戶端亂數、伺服器亂數和預主密鑰生成工作階段金鑰。雙方應得到相同的結果。
- 用戶端就緒:用戶端發送一條「已完成」消息,該消息用工作階段金鑰加密。
- 伺服器就緒:伺服器發送一條「已完成」消息,該消息用工作階段金鑰加密。
- 實現安全對稱加密:已完成握手,並使用工作階段金鑰繼續進行通信。
所有 TLS 交握都使用非對稱加密(公開金鑰和私密金鑰),但並不是所有的 TLS 交握都會在產生工作階段金鑰的過程中使用私密金鑰。例如,臨時 Diffie-Hellman 交握的步驟如下:
- 用戶端問候:用戶端發送用戶端問候消息,內含協定版本、用戶端亂數和密碼套件清單。
- 伺服器問候:伺服器以其 SSL 憑證、其選定的密碼套件和伺服器亂數回復。與上述 RSA 握手不同,伺服器在此消息中還包括以下內容(步驟 3):
- 伺服器的數位簽章:伺服器計算到目前為止所有訊息的數位簽章。
- 確認數位簽章:用戶端會驗證伺服器的數位簽章,確認伺服器是否為其聲稱的身分。
- 用戶端 DH 參數:用戶端將其 DH 參數傳送到伺服器。
- 用戶端和伺服器計算預主密鑰:用戶端和伺服器使用交換的 DH 參數分別計算匹配的預主密鑰,而不像 RSA 握手那樣由用戶端生成預主密鑰並將其發送到伺服器。
- 創建工作階段金鑰:與 RSA 握手中一樣,用戶端和伺服器現在從預主密鑰、用戶端亂數和伺服器亂數計算工作階段金鑰。
- 客戶端就緒:與 RSA 握手相同。
- 伺服器就緒
- 實現安全對稱加密
*DH 參數:DH 代表 Diffie-Hellman。Diffie-Hellman 演算法使用指數計算來得到相同的預主密鑰。服務器和客戶端各爲計算提供一個參數,當它們組合在一起時,會在每一邊產生不同的計算,結果是相等的。
要詳細瞭解臨時 Diffie-Hellman 握手與其他類型握手之間的區別,以及它們如何實現前向保密,請參閱什麼是 Keyless SSL?
TLS 1.3 中的交握有什麼不同之處?
TLS 1.3 不支援 RSA,也不支援其他容易受到攻擊的加密套件和參數。它還縮短了 TLS 交握的時間,讓 TLS 1.3 交握速度更快、更安全。
TLS 1.3 交握的基本步驟如下:
- Client hello:用戶端發送 client hello 訊息,內含通訊協定版本、用戶端隨機數和密碼套件清單。由於已從 TLS 1.3 中移除了對不安全密碼套件的支援,因此可能的密碼套件數量大大減少。client hello 訊息還包括將用於計算預主金鑰的參數。大體上來說,用戶端假設它知道伺服器的首選金鑰交換方法(由於簡化的密碼套件清單,它有可能知道)。這減少了交握的總長度——這是 TLS 1.3 交握與 TLS 1.0、1.1 和 1.2 交握之間的重要區別之一。
- 伺服器產生主金鑰:此時,伺服器已經接收到用戶端隨機數以及用戶端的參數和密碼套件。它已經擁有伺服器隨機數,因為它可以自己產生。因此,伺服器可以建立主金鑰。
- Server hello 和「完成」:server hello 包括伺服器的憑證、數位簽章、伺服器隨機數和選擇的密碼套件。因為它已經有了主金鑰,所以它還會傳送一個「完成」訊息。
- 最後步驟和用戶端「完成」:用戶端驗證簽章和憑證,產生主金鑰,並傳送「完成」訊息。
- 實現安全對稱加密
用於工作階段繼續執行的 0-RTT 模式
TLS 1.3 還支援一個更快的 TLS 交握版本,根本不需要任何往返,或用戶端和伺服器之間的來回通訊。如果用戶端和伺服器之前已經相互連接(例如,如果使用者之前造訪過該網站),它們可以各自從第一個工作階段中得出另一個共用金鑰,稱為「恢復主金鑰」。在第一個工作階段期間,伺服器還會向用戶端傳送稱為工作階段票證的東西。用戶端可以使用此共用金鑰,在下一次工作階段的第一條訊息中將加密資料連同該工作階段票證一起傳送到伺服器。然後 TLS 會在用戶端和伺服器之間恢復。
什麽是密碼套件?
密碼套件是一套用於建立安全通訊連線的加密演算法。目前有許多廣泛使用的密碼套件,TLS 交握的一個重要部分是商定將用於該交握的密碼套件。
要進一步瞭解 TLS/SSL,請參閱 SSL 的工作原理。