抓包使用的是WireShark2.6.7,抓包内容为https://tls13.crypto.mozilla.org/(Mozilla的TLS1.3测试页面),浏览器为chrome(需开启TLS1.3),这里我先给出抓包结果:
本次从握手的第一步开始分析,即ClientHello,下面是ClientHello的报文内容:
我们需要关注的是Secure Sockets Layer,即安全套接字层,下面是ClientHello所包含的内容:
Record Layer
,记录层Content Type
:HandShake,表示内容类型为握手消息Version
:TLS1.0(0x0301),版本号为1.0,后面是握手部分(Handshake)的内容,首先上图:
Handshake Type
:ClientHello,表示握手消息类型,此处是ClientHelloLength
:557,即长度为557Version
: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
:密码套件,如图所示该图中包含17个密码套件,每个加密套件一般包含密钥交换、加密算法以及哈希算法。
Compression Methods
:压缩方法,TLS1.3中未涉及,所以固定长度为1,内容为空。后面是Extensions扩展部分,扩展是TLS1.3才开始使用的,在之前的版本是没有的,所以扩展是1.3的显著特征,TLS 1.3 ClientHello消息始终包含扩展(最低限度为“supported_versions”,否则它们将被解释为TLS 1.2 ClientHello消息)。
后面是扩展部分的分析,每个扩展一般都包含类型(Type)、长度(Length)和数据(Data)三个部分。
Reserved
:预留位置,为空。Renegotiation info
:重新协商信息,如果是新发送的ClientHello一般是0,该扩展结构如图Servername
:所请求的服务器名,结构如图这里的服务器名为tls13.crypto.mozilla.org,是由Mozilla提供的用来测试TLS1.3的地址。
extended_master_secret
:内容为空,长度为0。SessionTicket TLS
:会话Ticket,此处为空,长度为0。signature_algorithms
:签名算法,内容如图所示以第一个签名算法为例,
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下早期数据的发送情况。channel_id
:此处长度为0,内容为空,ec_point_formats
:椭圆曲线点的格式,Key_share
:共享密钥,结构如图此处包含两个KeyShareEntry,第一个是预留的空值,第二个是x25519曲线组,具体数据在KeyExchange字段中;每个KeyShareEntry都代表一组密钥交换参数。
psk_key_exchange_modes
:PSK密钥交换模式选择,如图此处的PSK模式为(EC)DHE下的PSK,客户端和服务器必须提供KeyShare;如果是仅PSK模式,则服务器不需要提供KeyShare。
supported_versions
:客户端所支持的TLS版本,进行版本的协商,一般从优先级从高到低进行排列,此处优先选择1.3版本。supported_groups
:客户端所支持的曲线组,如图此处包含了三组曲线,分别是x25519、secp256r1和secp384r1,其中x25519在KeyShare部分已经进行了相关计算,并进行密钥协商。
Unknown type 27
:未知类型的数据,内容为02002。Reserved
:保留位置,置为空。pre_shared_key
:预共享密钥,如图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的模糊版本。