Skip to content

HTTPS

HTTP + TLS

HTTP 缺点

HTTP 是不加密的明文传输,带来了三大风险:

  • 窃听 (eavesdropping):第三方可以获知通信内容。
  • 篡改 (tampering):第三方可以修改通信内容。
  • 冒充 (pretending):第三方可以冒充他人身份参与通信。

TLS

HTTPS 的通信安全建立在 SSL/TLS 协议上,目的是为了:

  • 防窃听:所有信息加密传输,第三方无法窃听。
  • 防篡改:具有校验机制,一旦被篡改,通信双方可以立即发现。
  • 防冒充:使用身份证书,防止身份被冒充。

SSL/TLS 的版本:

  • 1994 年,NetScape 设计了 SSL 1.0,但是未发布。
  • 1995 年,NetScape 发布了 SSL 2.0,但是很快发现有严重漏洞。
  • 1996 年,NetScape 发布了 SSL 3.0,得到广泛应用。
  • 1999 年,ISOC (Internet Society) 接替 NetScape 发布了 SSL 的升级版 TLS 1.0。
  • 2006 年,发布了 TLS 1.1。
  • 2008 年,发布了 TLS 1.2。
  • 2011 年,发布了 TLS 1.2 修订版。
  • 2018 年,IETF 发布了 TLS 1.3。

目前的主流版本是 TLS 1.2/1.3。

TLS 1.0 通常称为 SSL 3.1,TLS 1.1 称为 SSL 3.2,TLS 1.2 称为 SSL 3.3。

加密过程

SSL/TLS 使用公钥加密+对称加密,在握手阶段获取服务端的公钥,并协商生成一个 session key,公钥用于加密 pre-master key 的传输,后续的数据传输使用 HTTP 协议和 session key 的对称加密。

图片

SSL/TLS 的具体步骤如下:

  1. 客户端发起请求

客户端发出加密通信的请求 (ClientHello),包括以下内容:

  • 支持的协议版本,比如 TLS 1.0
  • 支持的加密算法,比如 RSA
  • 支持的压缩算法
  • 客户端生成的随机数,后续用于生成 session key

ClientHello 中不包含域名,如果服务器上部署了多个网站和证书,服务端会不知道该发回哪个网站的证书。2006 年,TLS 协议加入了 Server Name Indication (SNI),允许客户端提供请求的域名。

  1. 服务端响应请求

服务端收到 ClientHello 后,发送响应 ServerHello,包括以下内容:

  • 确认使用的协议版本,如果此处的版本与 ClientHello 不同,则服务端关闭通信
  • 确认使用的加密算法
  • 服务端生成的随机数,后续用于生成 session key
  • 服务端证书 (包含公钥)

部分服务器会要求客户端提供客户端证书。

  1. 客户端最后回应

客户端首先验证服务端证书,确保:

  • 证书由权威机构颁布
  • 证书域名与请求域名一致
  • 证书未过期

如果证书有问题会向用户发出警告,否则取出证书中的公钥,发出以下回应:

  • 第三个随机数 (ClientKeyExchange),也称为 pre-master key,用公钥加密
  • 编码改变通知 (ChangeCipherSpec),表示后续信息将用双方协商的 session key 加密传输
  • 客户端握手结束通知 (Finished),包含前面所有内容的 hash 值,供服务端校验

客户端使用三个随机数和事前商定的加密算法计算得到 session key

  1. 服务端最后回应

服务端收到 pre-master key 后,发出以下回应:

  • 编码改变通知 (ChangeCipherSpec),表示后续信息将用双方协商的 session key 加密传输
  • 服务端握手结束通知 (Finished),包含前面所有内容的 hash 值,供客户端校验

服务端使用与客户端相同的三个随机数和加密算法得到相同的 session key