繼續(xù)上次的報文分析,這次主要內容是TLS握手中的ServerHello消息领突。
首先是記錄層(Record Layer)內容荐健,
Content Type
表示內容類型為握手(Handshake)酱畅,Version
表示版本為TLS1.2,接下來是長度(Length
)江场。后面是握手協議部分的內容圣贸,我將逐個解釋(其實大部分都和ClientHello的內容類似):
Handshake Type
:ServerHello,表示握手消息類型扛稽,此處是ServerHello吁峻。Length
:118,表示ServerHello的長度。Version
:TLS1.2(0x0303)在张,表示版本號為1.2用含。Random
缸夹,隨機數,由服務器生成螺句,必須獨立于ClientHello.random的生成(即客戶端和服務器的隨機數是分別獨立生成的)虽惭。Session ID Length
:會話ID的長度。Session ID
蛇尚,會話ID芽唇,TLS 1.3之前的版本支持“會話恢復”功能,該功能已與1.3版本中的預共享密鑰合并取劫。為了兼容以前的版本匆笤,該字段必須是非空的研侣,因此不提供TLS 1.3之前會話的客戶端必須生成一個新的32字節(jié)值。該值不必是隨機的炮捧,但應該是不可預測的庶诡,以避免實現固定在特定值。Cipher Suites Length
,即下面Cipher Suites的長度咆课。Cipher Suites
:密碼套件,此處為TLS_AES_128_GCM_SHA256
,服務器從ClientHello.cipher_suites的列表中選擇的單個密碼套件末誓。Compression Methods
:壓縮方法,TLS1.3中未涉及,所以固定長度為1傀蚌,內容為空基显。后面是擴展(Extensions)的內容,ServerHello的擴展只包括了兩個內容,共享密鑰和所支持的版本:
key_share
:共享密鑰,如圖這里的類型跟長度不再解釋,Key Share Entry中只包含了一個曲線組x25519(從ClientHello.key_share選擇的結果),在Key Exchange中包含的就是相關參數蘸吓。
supported_versions
:服務器所支持的TLS版本號,進行版本號的協商善炫,如圖:此處是服務器在ClientHello.Versions上的選擇,此處服務器選擇了1.3版本库继。
當使用帶有(EC)DHE密鑰建立的PSK時,當前的ServerHello消息需包含 “pre_shared_key”和“key_share”擴展,其他擴展將在EncryptedExtensions消息中單獨發(fā)送箩艺。
TLS 1.3具有嵌入在服務器隨機值中的降級保護機制,響應ClientHello并協商TLS 1.2或更低版本的TLS時宪萄,服務器必須專門設置其Random值的最后8個字節(jié)艺谆。
如果協商TLS 1.2,TLS 1.3服務器必須將其Random值的最后八個字節(jié)設置為字節(jié):
44 4F 57 4E 47 52 44 01
如果協商TLS 1.1或更低版本拜英,TLS 1.3服務器必須和TLS 1.2服務器應該將其Random值的最后8個字節(jié)設置為字節(jié):
44 4F 57 4E 47 52 44 00
客戶端接收到ServerHello之后也將對隨機數中的這8個字節(jié)進行檢查静汤,如果不匹配將會利用警報協議停止握手。
這里在ServerHello后面還有一點內容居凶,即Change Cipher Spec虫给,如圖:
Change Cipher Spec
的目的是為了告知客戶端,之后的消息將會加密傳輸侠碧;在1.2及之前的版本中都包含Change Cipher Spec抹估,所以在TLS1.3中為了保證兼容性,也保留了這一部分弄兜。