TLS1.3握手流程以及參數詳解
TLS1.3總共有兩層,分別是握手協議(handshake protocol)和記錄協議(record protocol),握手協議在記錄協議的上層,記錄協議是一個分層協議。其中握手協議中還包括了警告協議(alert protocol)。本文將詳細闡述握手協議,並且抓包分析。
我在一年前寫了一篇介紹TLS1.3的文章,最近工作遇到了TLS1.3協議。重新複習了下。
這篇文章想詳細的闡述交互過程,以及抓包分析參數的含義。
文章目錄
- TLS1.3概述
- TLS1.3記錄協議:
- TLS1.3警告協議:
- TLS1.3握手協議:
- 分析ClinetHello:
- 分析ServerHello:
- client的認證部分:
- 數據傳輸部分
TLS1.3概述
TLS1.3總共有兩層,分別是握手協議(handshake protocol)和記錄協議(record protocol),握手協議在記錄協議的上層,記錄協議是一個分層協議。其中握手協議中還包括了警告協議(alert protocol)。
TLS1.3概括如表格所示:
本文將詳細闡述握手協議,並且抓包分析。
TLS1.3記錄協議:
記錄協議位於握手協議下層,發送方從高層接受任意長度的非空數據,對其進行合併或分塊處理,然後利用帶有輔助數據的認證加密AEAD(authenticated encryption with associated data)進行加密傳輸。
接收方接受數據後對其進行解密和驗證,重組後再傳送給高層用戶。
TLS1.3警告協議:
目的是以簡單的通知機制告知通信出現異常情況,警告消息通常會攜帶Close_notify異常,在連接關閉的時候報告錯誤,Alert_Level字段標識告警的嚴重程度,可取值Warning或者Fatal,嚴重程度爲Fatal時會立即終止當前連接。
TLS1.3握手協議:
握手協議主要分爲三個流程
- 密鑰交換:選擇TLS協議版本和加密的算法,並且協商算法所需的參數。這段是明文傳輸的
- 服務器參數:建立其他握手協議參數,例如是否需要認證客戶端,支持何種應用層協議等。
- 認證:對服務器進行認證(包括可選的客戶端認證)並且提供密鑰確認和驗證握手完整性功能。
這三個階段完成後就可以進行應用層數據傳輸。
流程圖如下所示:
注:+:上一消息的擴展消息;*:可選發送
{}:用握手層流密鑰加密;[]:用流密鑰加密
TLS1.3的交互過程分爲1-RTT,RTT是時延往返的意思。RTT越小速度越快。
在TLS1.2裏交互過程需要2-RTT,可見TLS1.3加快了交互的速度。
正常連接(1-RTT)流程如下:
第1步,客戶端發送 ClientHello 消息,該消息主要包括客戶端支持的協議版本、會話ID、密碼套件、壓縮算法、以及擴展消息(密鑰共享、預共享密鑰、預共享密鑰模式);
第2步,服務端回覆 ServerHello,包含選定的加密套件;發送證書給客戶端;使用證書對應的私鑰對握手消息簽名,將結果發送給客戶端;選用客戶端提供的參數生成臨時公鑰,結合選定的參數計算出用於加密 HTTP 消息的共享密鑰;服務端生成的臨時公鑰通過 KeyShare 消息發送給客戶端;
第3步,客戶端接收到 KeyShare 消息後,使用證書公鑰進行簽名驗證,獲取服務器端的臨時公鑰,生成會話所需要的共享密鑰;
第4步,雙方使用生成的共享密鑰對消息加密傳輸,保證消息安全。
簡單的說就是:
即4部分。ClientHello,SeverHello,Client認證,數據交互。
接下來分析這4個部分。
分析ClinetHello:
Handshake Type
:ClientHello,表示握手消息類型,此處是ClientHelloLength
:574,即長度爲574Version
:TLS1.2(0x0303),表示版本號爲1.2,TLS1.3中規定此處必須置爲0x0303,即TLS1.2,起到向後兼容的作用。1.3版本用來協商版本號的部分在擴展當中,而之前的版本就在此處進行。Random
,隨機數,是由安全隨機數生成器生成的32個字節。Session ID Length
:會話ID的長度。Session ID
,會話ID,TLS 1.3之前的版本支持“會話恢復”功能,該功能已與1.3版本中的預共享密鑰合併。爲了兼容以前的版本,該字段必須是非空的,因此不提供TLS 1.3之前會話的客戶端必鬚生成一個新的32字節值。該值不必是隨機的,但應該是不可預測的,以避免實現固定在特定值,否則,必須將其設置爲空。Cipher Suites Length
,即下面Cipher Suites的長度
Cipher Suites是密碼套件,表示客戶端提供可選擇的加密方式,如圖所示:
每個加密套件都包含,密鑰交換,簽名算法,加密算法,哈希算法。
Compression Methons (1 method)表示壓縮方法,長度爲1,內容爲空
Exentisons擴展部分,是TLS1.3纔開始使用,是TLS1.3的顯著特徵。每一個擴展都包含類型(type),長度(length)和數據(data)三個部分。
下面分析幾個相對重要的擴展:
1)key_share
key_share 是橢圓曲線類型對應的公鑰,如圖所示
此處包含兩個KeyShareEntry,第一個是預留的空值,第二個是x25519曲線組,具體數據在KeyExchange字段中;每個KeyShareEntry都代表一組密鑰交換參數。
2)signature_algorithms
Signature_algorithms擴展是,客戶端提供簽名算法,讓服務器選擇
以第一個簽名算法爲例,ecdsa_secp256r1_sha256
,使用sha256作爲簽名中的哈希,簽名算法爲ecdsa。
3)psk_key_exchange_modes
psk_key_exchange_modes是psk密鑰交互模式選擇
此處的PSK模式爲(EC)DHE下的PSK,客戶端和服務器必須提供KeyShare
如果是僅PSK模式,則服務器不需要提供KeyShare。
4)pre_shared_key
psk是預共享密鑰認證機制,相當於session ticket再加一些檢驗的東西
Identity
中包含的是客戶端願意進行協商的服務器身份列表
PSK binder表示已經構建當前PSK與當前握手之間的綁定。
分析ServerHello:
發現和ClientHello類似。
CkientHello提供加密方式的選擇,而ServerHello實質是在Client提供的多種加密中選定加密的方式
client的認證部分:
待到client認證完成,發送給服務端,至此建立連接,可以發送數據。
數據傳輸部分
可見數據經過TLS1.3加密,進行傳輸。
轉載請註明:“轉自綠盟科技博客”: 原文鏈接. http://blog.nsfocus.net/tls1-3protocol/