第一步
浏览器给出TLS协议版本号、一个客户端生成的随机数 1(Client random),以及客户端支持的加密方法。(明文通信)



第二步
服务器确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数2(Server random)。(明文通信)


第三步
浏览器确认数字证书有效,然后生成一个新的随机数3(Pre-master secret),并使用数字证书中的公钥加密这个随机数,发给服务器。(使用非对称加密算法)
浏览器确认数字证书有效:浏览器和操作系统内部内置了很多CA机构的证书,是否篡改、是否在有效期内、域名和访问的网站是否匹配。
第四步
服务端使用自己的私钥,获取客户端发来的随机数(即Pre-master secret)。双方就都有三个一模一样的随机数,前两个是明文发送的,最后客户端生成的这个是使用证书中的公钥密文发送的。
第五步
客户端和服务器根据约定的加密方法,使用前面的三个随机数经过特定的算法,生成"对话密钥"(sesionkey),用来加密接下来的整个对话过程
对话密钥,又叫做会话密钥,其实就是将之前通讯中的三个随机数生成一个密钥(对称加密)
三个随机数----->第三个是使用非对称加密---->相同的算法---->会话密钥
第六步
客户端和服务器都会第一次使用会话密钥加密一个消息发送给对方。

https://mermaid.ai/
bash
sequenceDiagram
participant 客户端 as 浏览器
participant 服务器
客户端->>服务器: ClientHello<br/>(TLS版本, 支持的加密方法, 随机数1:Client Random)
服务器-->>客户端: ServerHello<br/>(确认双方使用的加密方法, 随机数2:Server Random, 证书)
客户端-->>客户端: 验证数字证书有效性
客户端->>服务器: 使用证书中公钥加密随机数3:Pre-master secret
服务器-->>服务器: 用私钥解密Pre-master secret
Note over 客户端,服务器: 此时双方都可获得三份随机数<br/>(Client Random, Server Random, Pre-master secret)
客户端-->>客户端: 生成会话密钥(session key)
服务器-->>服务器: 生成会话密钥(session key)
Note over 客户端,服务器: 使用相同算法生成对称会话密钥
客户端->>服务器: 用会话密钥加密的消息(Finished)
服务器->>客户端: 用会话密钥加密的消息(Finished)
Note over 客户端,服务器: 开始后续所有加密通讯