继续上次的报文分析,这次主要内容是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。
在TLS1.3的草案当中规定此处必须置为0x0303,即TLS1.2,起到向后兼容的作用。1.3版本用来协商版本号的部分在扩展当中,而之前的版本就在此处进行。
Random
,随机数,由服务器生成,必须独立于ClientHello.random的生成(即客户端和服务器的随机数是分别独立生成的)。
Session ID Length
:会话ID的长度。
Session ID
,会话ID,TLS 1.3之前的版本支持“会话恢复”功能,该功能已与1.3版本中的预共享密钥合并。为了兼容以前的版本,该字段必须是非空的,因此不提供TLS 1.3之前会话的客户端必须生成一个新的32字节值。该值不必是随机的,但应该是不可预测的,以避免实现固定在特定值。
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消息中单独发送。
TLS 1.3具有嵌入在服务器随机值中的降级保护机制,响应ClientHello并协商TLS 1.2或更低版本的TLS时,服务器必须专门设置其Random值的最后8个字节。
如果协商TLS 1.2,TLS 1.3服务器必须将其Random值的最后八个字节设置为字节:
44 4F 57 4E 47 52 44 01
如果协商TLS 1.1或更低版本,TLS 1.3服务器必须和TLS 1.2服务器应该将其Random值的最后8个字节设置为字节:
44 4F 57 4E 47 52 44 00
客户端接收到ServerHello之后也将对随机数中的这8个字节进行检查,如果不匹配将会利用警报协议停止握手。
这里在ServerHello后面还有一点内容,即Change Cipher Spec,如图:
Change Cipher Spec
的目的是为了告知客户端,之后的消息将会加密传输;在1.2及之前的版本中都包含Change Cipher Spec,所以在TLS1.3中为了
保证兼容性
,也保留了这一部分。
同步简书:
简书-汪哈哈zzz