Skip to main content

TSL握手

HTTPS 建立连接

https 开头的网址输入后,浏览器从 URI 中拿到协议名和域名,端口号是 443,再用 DNS 解析拿到 IP。

然后通过 TCP 三次握手建立 TCP 连接。

进行 TLS 握手,在 TCP 上建立安全连接,之后就可以进行安全通信了。

概括讲,https连接大致可分为两个部分:第一是建立连接时的非对称加密握手,第二是握手后的对称加密报文传输。

TLS 握手

我的理解是,TLS 握手本质是通信双方通过协商最终获得对称加密的密钥的过程。

  1. TLS 包含几个子协议,可以理解成是职责不同的模块,常用的有记录协议(Record Protocol),警报协议(Alert Protocol),握手协议(Handshake Protocol),变更密码规范协议

ECDHE 握手过程

ECDHE握手过程

  1. 建立 TCP 连接后,浏览器发送Client Hello消息,包含客户端版本号,Client Random,支持的密码套件

  2. 服务器收到后,返回Server Hello消息,包含Server Random,选中的密码套件(Cipher Suite)

  3. 服务器返回证书给客户端,供客户端验证身份

  4. 服务器返回Server key Exchange消息,包含Server Params。这个消息用服务器的私钥签名后传输

  5. 服务器返回Server Hello Done消息

  6. 客户端拿到证书后,先验证证书的有效性。

  7. 然后根据选中的密码套件,生成Client Params。用Client key Exchange消息发送给服务器

  8. 现在客户端和服务器都拿到密钥交换算法的两个参数:Client ParamsServer Params,然后用 ECDHE 算法生成“Pre-Master”,是个随机数。

客户端和服务器手里都有三个随机数:Client RandomServer RandomPre-Master。用这个三个参数生成用于加密会话的主密钥:Master Secret.

主密钥不是最终用于通信的会话密钥,它会扩展出更多密钥,避免只用一个密钥带来的安全隐患。

  1. 客户端发送Change Cipher Spec消息,告知之后的消息用加密方式发送。然后发送Finished消息,把之前的数据做个摘要,加密发送,让服务器做验证。

  2. 服务器同样发送Change Cipher SpecFinished消息,验证加密解密OK,握手结束。之后的收发数据就都是加密传输了。

RSA 握手

其与ECDHE握手的以主要区别是,Pre-Master不用算法生成,而是客户端生成随机数,通过Client Key Exchange消息发给服务器。这样就不会有Server Key Exchange消息。