TLS 握手中發生什麼事情?| SSL 握手

在 TLS/SSL 握手中,客戶端和伺服器交換 SSL 憑證,並隨機生成資料來創建工作階段金鑰。

學習目標

閱讀本文後,您將能夠:

  • 瞭解什麼是 TLS 握手
  • 瞭解 TLS 握手的作用
  • 說明 TLS 握手中的步驟
  • 探索不同類型的 TLS 握手

複製文章連結

什麽是 TLS 握手?

TLS 是一種旨在保護網際網路通信安全的加密協定。TLS 握手是啟動 TLS 加密通信工作階段的過程。在 TLS 握手過程中,通信雙方交換消息以相互確認,彼此驗證,確立它們將使用的加密演算法,並生成一致的工作階段金鑰。TLS 握手是 HTTPS 工作原理的基礎部分。

TLS 與 SSL 握手

SSL (安全通訊端層)是為 HTTP 開發的原始加密協定。不久前,SSL 被 TLS (傳輸層安全性)所取代。SSL 握手現在稱為 TLS 握手,儘管「SSL」這個名稱仍在廣泛使用。

TLS 握手什麼時候發生?

用戶導航到一個使用 HTTPS 的網站,瀏覽器首先開始查詢網站的原始伺服器,這時就會發生 TLS 握手。在任何其他通信使用 HTTPS 時(包括 API 調用和 DNS over HTTPS 查詢),也會發生 TLS 握手。

通過 TCP 握手打開 TCP 連接後,將發生 TLS 握手。

TLS 握手過程中發生什麼事情?

TLS 握手過程中,客戶端和伺服器將進行如下操作:

  • 指定它们将使用的 TLS 版本(TLS 1.0、1.2、1.3等)
  • 决定它们将使用的密码套件(如下)
  • 通過伺服器的公開密鑰和 SSL 憑證頒發機構的電子簽名驗證伺服器的身份
  • 生成工作階段金鑰,以便在握手完成後使用對稱加密

TLS 握手的步驟是什麼?

TLS 握手是客戶端和伺服器之間交換的一系列資料包(消息)。TLS 握手涉及多個步驟,客戶端和伺服器交換完成握手和進行進一步對話所需的資訊。

TLS 握手中的具體步驟將根據使用的金鑰交換演算法的類型和雙方支持的密碼套件而變化。RSA 金鑰交換演算法最為常用。其步驟如下:

  1. 「用戶端問候(client hello)」消息: 用戶端通過向伺服器發送「問候」消息來開始握手。該消息將包含用戶端支援的 TLS 版本,支援的密碼套件,以及稱為一串稱為「用戶端亂數(client random)」的隨機位元組。
  2. 「伺服器問候(server hello)」消息: 作為對 client hello 消息的回復,伺服器發送一條消息,內含伺服器的 SSL 憑證、伺服器選擇的密碼套件,以及「伺服器亂數(server random)」,即由伺服器生成的另一串隨機位元組。
  3. 身份驗證: 用戶端使用頒發該憑證的憑證授權驗證伺服器的 SSL 憑證。此舉確認伺服器是其聲稱的身份,且客戶端正在與該域的實際所有者進行交互。
  4. 預主密鑰: 用戶端再發送一串隨機位元組,即「預主密鑰(premaster secret)」。預主密鑰是使用公開金鑰加密的,只能使用伺服器的私密金鑰解密。(用戶端從伺服器的 SSL 憑證中獲得公開金鑰。)
  5. 私密金鑰被使用:伺服器對預主密鑰進行解密。
  6. 生成工作階段金鑰:用戶端和伺服器均使用用戶端亂數、伺服器亂數和預主密鑰生成工作階段金鑰。雙方應得到相同的結果。
  7. 用戶端就緒:用戶端發送一條「已完成」消息,該消息用工作階段金鑰加密。
  8. 伺服器就緒:伺服器發送一條「已完成」消息,該消息用工作階段金鑰加密。
  9. 實現安全對稱加密:已完成握手,並使用工作階段金鑰繼續進行通信。

所有 TLS 握手都使用非對稱加密(公開金鑰和私密金鑰),但並不是所有的 TLS 握手都會在生成工作階段密鑰的過程中使用私密金鑰。例如,臨時 Diffie-Hellman 握手的步驟如下:

  1. 用戶端問候:用戶端發送用戶端問候消息,內含協定版本、用戶端亂數和密碼套件清單。
  2. 伺服器問候:伺服器以其 SSL 憑證、其選定的密碼套件和伺服器亂數回復。與上述 RSA 握手不同,伺服器在此消息中還包括以下內容(步驟 3):
  3. 伺服器的數位簽章:伺服器使用其私密金鑰對用戶端亂數、伺服器亂數及其 DH 參數* 進行加密。加密後的資料用作伺服器的數位簽章,從而確定服務器具有與 SSL 憑證中的公開金鑰相匹配的私密金鑰。
  4. 確認數位簽章:用戶端使用公開金鑰解密伺服器的數位簽章,驗證伺服器控制私密金鑰並且是其聲稱的身份。 用戶端 DH 參數:用戶端將其 DH 參數發送到伺服器。
  5. 用戶端和伺服器計算預主密鑰:用戶端和伺服器使用交換的 DH 參數分別計算匹配的預主密鑰,而不像 RSA 握手那樣由用戶端生成預主密鑰並將其發送到伺服器。
  6. 創建工作階段金鑰:與 RSA 握手中一樣,用戶端和伺服器現在從預主密鑰、用戶端亂數和伺服器亂數計算工作階段金鑰。
  7. 客戶端就緒:與 RSA 握手相同。
  8. 伺服器就緒
  9. 實現安全對稱加密

*DH 參數:DH 代表 Diffie-Hellman。Diffie-Hellman 演算法使用指數計算來得到相同的預主密鑰。服務器和客戶端各爲計算提供一個參數,當它們組合在一起時,會在每一邊產生不同的計算,結果是相等的。

要詳細瞭解臨時 Diffie-Hellman 握手與其他類型握手之間的區別,以及它們如何實現前向保密,請參閱什麼是 Keyless SSL?

什麽是密碼套件?

密碼套件是一套用於建立安全通信連接的加密演算法。(加密演算法是使數據顯得隨機的一組數學運算。)目前有許多廣泛使用的密碼套件,TLS 握手的一個重要部分是商定將用於該握手的密碼套件。

要進一步瞭解 TLS/SSL,請參閱 SSL 的工作原理。要測試某個網站是否正確使用了 TLS,請訪問 Cloudflare Diagnostic Center