0%

SSL/TLS 协议

讲述 HTTP 核心 SSL/TLS 协议,本篇从 SSL/TLS 发展历史到握手以及传输的详细过程来讲解。

SSL/TLS 协议

SSL/TLS 在计算机网络模型中位于 传输层应用层 之间的协议,例如 TCP/IPHTTP 之间,它通过 握手协议 (Handshake Protocol)传输协议 (Record Protocol) 来解决传输安全的问题。

SSLNetScape 公司设计发布,更新到 SSL3.0 之后, IETFSSL 标准化改名为 TLS,发布 1.0 版,最新版本为 TLS 1.3

SSL/TLS 运行过程

主要有两个阶段: 握手传输

  1. 握手协议 就是建立起连接的过程,这个阶段采用 非对称加密,这个过程完毕后会生成一个 对话秘钥
  2. 传输协议 过程,就是用这个 对话秘钥 使用 对称加密 进行传输
  3. 之所以这样做,是因为,非对称加密是很耗性能的。而握手协议过程中,使用数字证书保证了公钥的安全性。当然这个过程既可以双向证书验证,也可以只验证服务端的证书单向证书验证

SSL/TLS 运行过程:
SSL 运行过程

客户端发出请求 (Client Hello)

首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做 ClientHello 请求。客户端主要向服务器提供以下信息:

  1. 支持的 SSL/TLS 协议版本
  2. 支持的加密套件列表 (cipher suite)
  3. 支持的压缩算法列表 (compression methods),用于后续的压缩传输
  4. 产生的一个随机数 random_C(random number),客户端有存留,稍后用于生成 "对话密钥 (session key)"

服务端回应 (Server Hello)

服务器收到客户端请求后,向客户端发出回应,这叫做 SeverHello。服务器的回应包含以下内容:

  1. 确认使用的加密通信协议版本,比如 TLS 1.0 版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信
  2. 确认加密套件,压缩算法
  3. 产生的一个随机数 random_S(random number),服务端有存留,稍后用于生成 "对话密钥 (session key)"
  4. 服务端数字证书(证明自己的身份,传递公钥)
  5. 如果需要验证客户端,发出请求,要求客户端提供证书

客户端回应

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息:

  1. 如果服务端有请求证书,发送自己的数字证书
  2. 再产生一个随机数 pre-master key(random number),并且用服务端数字证书中的公钥加密,防止被窃听
  3. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
  4. 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的 hash 值,用来供服务器校验

客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把 对话密钥 (session key)

为什么使用三个随机数,解释:

不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于 SSL 协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。对于 RSA 密钥交换算法来说,pre-master-key 本身就是一个随机数,再加上 hello 消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master 的存在在于 SSL 协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么 pre master secret 就有可能被猜出来,那么仅适用 pre master secret 作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上 pre master secret 三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。

服务器的最后回应

如果有客户端的证书,就先验证客户端的证书

服务器收到客户端的第三个随机数 pre-master key 之后,计算生成本次会话所用的 对话密钥 (session key)。然后,向客户端最后发送下面信息。

  1. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
  2. 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的 hash 值,用来供客户端校验

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用 对话密钥 (session key) 加密内容。

Ref

  1. HTTPS 从原理到应用(三):SSL/TLS 协议
  2. SSL/TLS 协议运行机制的概述