# HTTPS 协议总结

HTTPS 是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。

  • HTTPS 协议定义
  • HTTPS 流程分析
  • TLS 握手优化

# HTTPS 协议定义

HTTPS 全称为超文本传输安全协议(HyperText Transfer Protocol Secure;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。

可以看出,HTTPS 只是在 HTTP 的基础上,增加了 SSL/TSL 安全层,主要为了实现以下目的:

  • 所有信息都是加密传播,第三方无法窃听。
  • 具有校验机制,一旦被篡改,通信双方会立刻发现。
  • 配备身份证书,防止身份被冒充。

# HTTPS 流程分析

下图是一次 HTTPS 请求的流程图,我们一起来分析一下。

https流程图

  • 1、客户端发起请求,同时将客户端支持的TLS 协议版本号加密规则一个随机数(Client random),发送给服务器。
  • 2、服务器上有安装好的认证证书(将服务器的私钥,通过权威机构 CA 认证后,生成的证书公钥和私钥)。
  • 3、服务端确认双方使用的加密方法,然后使用 hash 算法签名证书,然后将数字证书、一个服务器端生成的随机数(Server random),发送给客户端。
  • 4、客户端验证证书。
    • 使用 hash 检查证书是否被篡改。
    • 验证失败,拒绝请求。
    • 验证成功,生成新随机数(Premaster secret)
  • 5、使用证书公钥将随机值加密后传给服务端。
  • 6、服务端用私钥解密消息内容,获得随机数(Premaster secret)
  • 7、服务端根据约定的加密方法,使用前面的三个随机数(Client random,Server random,Premaster secret)生成对话密钥(session key),并使用**对话密钥(session key)**加密传输内容,发送给客户端。
  • 8、客户端使用同样的算法生成对话密钥(session key),并使用**对话密钥(session key)**对获取到的内容进行解密。
  • 9、秘钥协商结束,客户端和服务器端通过对话密钥(session key) 作为对称加密 key,相互传输数据。

可以看到,HTTPS 在请求时,主要分为两个部分:

  • 秘钥协商,使用非对称加密,生成秘钥。
  • 对称加密,使用秘钥对每次请求进行加密。

为什么需要 3 个随机数,而不是只用 Premaster secret 生成会话密钥?

因为每个主机并不是都能产生完全的随机数的。有很多产生的只是弱随机数而已,比如范围小,可能被猜测。如果该随机数被破解,那么之前一系列握手都是没什么用的。因此用三个随机数一起生成密钥能使得伪随机数更接近随机。

# 证书合法性验证

服务器端发送公钥的时候,中间人截取了的公钥,并把自己的公钥发给了客户端,客户端发的消息就用中间人的公钥加了密,中间人不就可以解密看到消息了吗?

是的,这个时候就需要发挥证书的用处了,想要部署 HTTPS 服务,必须在 CA 认证机构中进行认证获得认证证书。客户端可以根据证书判断出具体请求到的服务器是否是中间人。

问题又来了,如果中间人并不直接替换证书,而是修改了其中的一部分内容,应该怎么应对呢?

我们可以使用 hash 算法,对证书进行签名,在客户端采用同样的 hash 算法进行验证,一旦发现不一致,就取消该请求。具体操作如下:

服务器端生成数字证书:

https流程图

  • 将服务器公钥进行 Hash 加密,生成信息摘要。
  • 将信息摘要通过 CA(认证中心)私钥加密,生成数字签名。
  • 将服务器公钥,数字签名组合成数字证书。
  • 将数字证书发给客户端。

客户端验证数字证书:

https流程图

  • 客户端首先从数字证书中获取到服务器公钥,数字签名。
  • 将服务器公钥进行 Hash 加密,生成信息摘要。
  • 将数字签名,通过 CA 公钥进行解密,生成信息摘要。
  • 比对两次生成的信息摘要是否一致,若一致,则证书验证成功。

在这期间如果有中间人对证书进行修改,最后生成的信息摘要就一定不一致,客户端就知道请求被攻击了。

# TLS 握手优化

  • 精简证书大小
  • 会话复用

# False Start

False Start 有抢跑的意思,意味着不按规则行事。TLS False Start 是指客户端在发送 Change Cipher Spec Finished 同时发送应用数据(如 HTTP 请求),服务端在 TLS 握手完成时直接返回应用数据(如 HTTP 响应)。这样,应用数据的发送实际上并未等到握手全部完成,故谓之抢跑。

False Start

可以看到,启用 False Start 之后,TLS 阶段只需要一次 RTT 就可以开始传输应用数据。False Start 相当于客户端提前发送加密后的应用数据,不需要修改 TLS 协议,目前大部分浏览器默认都会启用。

# 精简证书大小

如果需要进一步减小证书大小,可以选择 ECC(Elliptic Curve Cryptography,椭圆曲线密码学)证书。256 位的 ECC Key 等同于 3072 位的 RSA Key,在确保安全性的同时,体积大幅减小。下面是一个对比:

对称加密 Key 长度 RSA Key 长度 ECC Key 长度
80 1024 160
112 2048 224
128 3072 256
192 7680 384
256 15360 521

# 会话复用

如果建立 TSL 连接之后,如果出于某种原因,对话中断,就需要重新建立连接。这时有两种方法可以快速恢复原来的 session:一种叫做 session ID,另一种叫做 session ticket。

# Session Identifier

Session Identifier(会话标识符),是 TLS 握手中生成的 Session ID。服务端可以将 Session ID 协商后的信息存起来,浏览器也可以保存 Session ID,并在后续的 ClientHello 握手中带上它,如果服务端能找到与之匹配的信息,就可以完成一次快速握手。

# Session Ticket

Session Identifier 机制有一些弊端,例如:

  • 负载均衡中,多机之间往往没有同步 Session 信息,如果客户端两次请求没有落在同一台机器上就无法找到匹配的信息。
  • 服务端存储 Session ID 对应的信息不好控制失效时间,太短起不到作用,太长又占用服务端大量资源。

而 Session Ticket(会话记录单)可以解决这些问题,Session Ticket 是用只有服务端知道的安全密钥加密过的会话信息,最终保存在浏览器端。浏览器如果在 ClientHello 时带上了 Session Ticket,只要服务器能成功解密就可以完成快速握手。

# 相关链接

Last Updated: 7/19/2019, 11:39:19 PM