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