TLS1.3抓包分析(1)——ClientHello


抓包使用的是WireShark2.6.7,抓包内容为https://tls13.crypto.mozilla.org/(Mozilla的TLS1.3测试页面),浏览器为chrome(需开启TLS1.3),这里我先给出抓包结果:

TLS1.3抓包分析(1)——ClientHello
本次从握手的第一步开始分析,即ClientHello,下面是ClientHello的报文内容:
TLS1.3抓包分析(1)——ClientHello
我们需要关注的是Secure Sockets Layer,即安全套接字层,下面是ClientHello所包含的内容:
TLS1.3抓包分析(1)——ClientHello
Record Layer,记录层
Content Type:HandShake,表示内容类型为握手消息
Version:TLS1.0(0x0301),版本号为1.0,为什么是1.0?之前看的draft好像固定1.2版本
后面是握手部分(Handshake)的内容,首先上图:
TLS1.3抓包分析(1)——ClientHello
Handshake Type:ClientHello,表示握手消息类型,此处是ClientHello
Length:557,即长度为557
Version: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:密码套件,如图所示
TLS1.3抓包分析(1)——ClientHello
该图中包含17个密码套件,每个加密套件一般包含**交换、签名算法、加密算法以及哈希算法。
Compression Methods:压缩方法,TLS1.3中未涉及,所以固定长度为1,内容为空。
后面是Extensions扩展部分,扩展是TLS1.3才开始使用的,在之前的版本是没有的,所以扩展是1.3的显著特征,TLS 1.3 ClientHello消息始终包含扩展(最低限度为“supported_versions”,否则它们将被解释为TLS 1.2 ClientHello消息)。

后面是扩展部分的分析,每个扩展一般都包含类型(Type)、长度(Length)和数据(Data)三个部分。
TLS1.3抓包分析(1)——ClientHello
Reserved:预留位置,为空。
Renegotiation info:重新协商信息,如果是新发送的ClientHello一般是0,该扩展结构如图
TLS1.3抓包分析(1)——ClientHello
Servername:所请求的服务器名,结构如图
TLS1.3抓包分析(1)——ClientHello
这里的服务器名为tls13.crypto.mozilla.org,是由Mozilla提供的用来测试TLS1.3的地址。
extended_master_secret:内容为空,长度为0。
SessionTicket TLS:会话Ticket,此处为空,长度为0。
signature_algorithms:签名算法,内容如图所示
TLS1.3抓包分析(1)——ClientHello
以第一个签名算法为例,ecdsa_secp256r1_sha256,使用sha256作为签名中的哈希,签名算法为ecdsa。
status_request:协商OCSP,服务器可以通过在其CertificateRequest消息中发送空的“status_request”扩展来请求客户端使用其证书呈现OCSP响应。
signed_certificate_timestamp:请求时间戳,可以简称为SCT,服务器将在CertificateEntry的扩展中携带时间戳。
application_layer_protocol_negotition:ALPN协议,是TLS的扩展,允许在安全连接的基础上进行应用层协议的协商。ALPN协议的选择将会影响PSK Mode下早期数据的发送情况。
TLS1.3抓包分析(1)——ClientHello
channel_id:此处长度为0,内容为空,频道id
ec_point_formats:椭圆曲线点的格式,此处为uncompressed格式
Key_share:共享**,结构如图
TLS1.3抓包分析(1)——ClientHello
此处包含两个KeyShareEntry,第一个是预留的空值,第二个是x25519曲线组,具体数据在KeyExchange字段中;每个KeyShareEntry都代表一组**交换参数。
psk_key_exchange_modes:PSK**交换模式选择,如图
TLS1.3抓包分析(1)——ClientHello
此处的PSK模式为(EC)DHE下的PSK,客户端和服务器必须提供KeyShare;如果是仅PSK模式,则服务器不需要提供KeyShare。
supported_versions:客户端所支持的TLS版本,进行版本的协商,一般从优先级从高到低进行排列,此处优先选择1.3版本。
supported_groups:客户端所支持的曲线组,如图
TLS1.3抓包分析(1)——ClientHello
此处包含了三组曲线,分别是x25519、secp256r1和secp384r1,其中x25519在KeyShare部分已经进行了相关计算,并进行**协商。
Unknown type 27:未知类型的数据,内容为02002。
Reserved:保留位置,置为空。
pre_shared_key:预共享**,如图
TLS1.3抓包分析(1)——ClientHello
Identity中包含的是客户端愿意进行协商的服务器身份列表,PSK binder值构建PSK与当前握手之间的绑定。
Obfuscated Ticket Age,客户端的the age of a ticket(票据生存时间)是自收到NewSessionTicket消息以来的时间,客户不得尝试使用age大于ticket中的ticket_lifetime值的ticket。每个PskIdentity的obfuscated_ticket_age字段包含由age(以毫秒为单位)并添加ticket中包含的ticket_age_add值,模2^32形成的Ticket Age的模糊版本。
同步简书:https://www.jianshu.com/p/13f7175cb4df