Client Hello
建立 TCP 连接之后,浏览器率先发出 Client Hello 消息。
挑几个重点字段说一下。
Version 表示客户端最高支持的 TLS 版本,向下兼容。上图中是 TLS 1.2 (0x0301) 。
Random 是客户端生成的一个随机数,后面用于生成主密钥。下文中用 client_random 表示。Random 是 32 字节,但其实随机数的长度是 28 字节,前面四个字节是 UNIX 时间戳,并没有什么意义。
Session ID 传递给服务器用于复用缓存的 TCP 连接。这里 Session ID 是有值的,但并不代表就一定会复用之前的连接,这要看服务器是否能找到该 Session ID 的连接。
Cipher Suites 是客户端支持的密码套件列表,服务器会从中选择合适的密码套件,排在第一个的优先选择。密码套件是 TLS 协议的核心,可以说它是保证 TLS 安全性的根本。密码套件决定了 TLS 使用的身份认证、密钥交换、对称加密、消息认证码的算法。在 TLS 1.2 中可选择的密码套件比较多,但在 TLS 1.3 中进行了删减,去除了部分不再安全的密码套件。
Compression Methods 表示客户端支持的压缩方法。由于存在安全性问题,一般不启用,值为 null 。
Extension 为扩展字段,可以让客户端和服务器在不更新 TLS 版本的基础上获取更多的能力。客户端可以发送服务端不理解的扩展,但服务端不能返回客户端无法理解的扩展,否则将发生错误。另外在 TLS 1.3 中,为了保证向下兼容性,并没有去修改 Version 字段,而是通过 Supported Version: TLS 1.3 这样的扩展字段来说明支持 TLS 1.3 。
Server Hello
服务端在收到 Client Hello 之后,根据客户端发来的消息内容,作出回应。
Version 表示服务器选定使用的 TLS 版本,上图中是 TLS 1.2 (0x0303) 。
Random 是服务器生成的随机数,其作用和 client_random 一样,也是用来计算主密钥,下文中用 server_random 表示。现在浏览器,服务器都拥有了 client_random 和 server_random 两个随机数。
Session ID 为 null 表示服务器没有可复用的 TCP 连接。因为我模拟的第一次建立 TCP 连接的完整的 HTTPS 通信