讲述 HTTP
核心 SSL/TLS 协议
,本篇从 SSL/TLS 发展历史到握手以及传输的详细过程来讲解。
SSL/TLS 协议
SSL/TLS
在计算机网络模型中位于 传输层
和 应用层
之间的协议,例如 TCP/IP
与 HTTP
之间,它通过 握手协议 (Handshake Protocol)
和 传输协议 (Record Protocol)
来解决传输安全的问题。
SSL
是 NetScape
公司设计发布,更新到 SSL3.0
之后, IETF
将 SSL
标准化改名为 TLS
,发布 1.0 版,最新版本为 TLS 1.3
SSL/TLS 运行过程
主要有两个阶段: 握手
和 传输
握手协议
就是建立起连接的过程,这个阶段采用非对称加密
,这个过程完毕后会生成一个对话秘钥
传输协议
过程,就是用这个对话秘钥
使用对称加密
进行传输- 之所以这样做,是因为,非对称加密是很耗性能的。而握手协议过程中,使用数字证书保证了公钥的安全性。当然这个过程既可以双向证书验证,也可以只验证服务端的证书单向证书验证
SSL/TLS 运行过程:
客户端发出请求 (Client Hello)
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做 ClientHello 请求
。客户端主要向服务器提供以下信息:
- 支持的
SSL/TLS
协议版本 - 支持的加密套件列表
(cipher suite)
- 支持的压缩算法列表
(compression methods)
,用于后续的压缩传输 - 产生的一个随机数
random_C(random number)
,客户端有存留,稍后用于生成"对话密钥 (session key)"
服务端回应 (Server Hello)
服务器收到客户端请求后,向客户端发出回应,这叫做 SeverHello
。服务器的回应包含以下内容:
- 确认使用的加密通信协议版本,比如
TLS 1.0 版本
。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信 - 确认加密套件,压缩算法
- 产生的一个随机数
random_S(random number)
,服务端有存留,稍后用于生成"对话密钥 (session key)"
- 服务端数字证书(证明自己的身份,传递公钥)
- 如果需要验证客户端,发出请求,要求客户端提供证书
客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息:
- 如果服务端有请求证书,发送自己的数字证书
- 再产生一个随机数
pre-master key(random number)
,并且用服务端数字证书中的公钥加密,防止被窃听 - 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
- 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的 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)
。然后,向客户端最后发送下面信息。
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
- 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的 hash 值,用来供客户端校验
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用 对话密钥 (session key)
加密内容。