HTTP-SSL机制概述

这是我阅读《HTTP权威指南》的总结和思考中,一系列文章的一篇,目录在这里

需求

HTTP协议是透明的,对于现代Web服务,比如支付等业务,需要一种安全机制来避免:

  1. 窃听风险:通讯内容被第三方窃听
  2. 篡改风险:第三方篡改通信内容
  3. 冒充风险:第三方冒充身份参与通信

因此需要一种算法来保证:

  1. 加密:防止第三方窃听
  2. 完整性:防止内容被篡改
  3. 服务器/客户端认证:防止身份伪造
  4. 效率高, 普适性强

概述

网景公司最早引入了SSL(Secure Socket Layer)来保证安全性,之后标准化组织接收基于其上推出了TLS(Transport Layer Security)

1
2
3
4
5
6
7
------------ ------------
| HTTP | | HTTP |
------------ ------------
| TCP | | SSL |
------------ ------------
| IP | | TCP |
------------ ------------

通过加入一层SSL加密处理消息以后以二进制密文发送给客户端,SSL对于上层像一个黑盒子一样,具体过程在后面探讨

基础算法

对称非公开加密

对称加密算法指的是加密和解密使用相同密钥的算法。过程示意图:

1
明文P ---(加密算法F(密钥k))----> 密文C -----(F(k))----> 明文P

常见的算法有DES和继任者AES等

其主要优点是运算速度快,加密和解密过程不需要很长的时间,当要传输较大文件时比较方便

缺点在于

  1. 每个点对点传输都需要1个密钥,服务器和客户端需要保存大量的密钥
  2. 需要首先传输密钥给对方,可能会泄露密钥

非对称公开加密

非对称加密与对称加密特点相反,密钥分为公钥和私钥,公钥公开在某处,发送方都可以获取该密钥对信息加密,私钥只有接收方保管,可以将密文解密

1
明文P <-----(公钥ex)-----> 密文C <-----(私钥d)-----> 明文P

上图展示了RSA算法的过程,RSA算法是最常见的非对称公开加密算法,其加解密是双向的,即私钥加密可以用公钥解密,公钥加密可以用私钥解密,在数字签名时会用到该特性

非对称加密解决了对称加密的2个缺点,但是其加密解密速度太慢,因此不适合大文件的加密传输

数字证书和数字签名

在上面两种加密算法的基础上,我们实现了防止窃听,但是还需要一个方法来防止篡改,并且证明发送方身份

数字证书是由权威机构颁发给服务器方,通常包含名称,过期时间,发布者等信息,服务器通过提供证书证明自己身份,就像人出示身份证一样

为了证明证书的可靠性,需要用到数字签名技术。证书颁发方将证书中的版本号,序列号,签名算法描述,颁发机构,对象名称,对象公钥等通过颁发者的私钥加密后生成数字签名

当客户端(浏览器)接收到服务器发来的证书后,根据颁发方的公钥(通常已预装在浏览器,对于非权威证书颁发者会出现警告),解密签名与证书对照,确认证书没有变化。

TLS过程

因为RSA效率较低,因此TLS通过握手验证服务器身份并用RSA传递一个对称密钥,之后的主体报文使用该密钥传递,会话结束后销毁

SSL握手通过4次完成

ClientHello

客户端向浏览器提供

  1. 支持的协议版本, TLS1.0-1.3/SSL
  2. 一个用于生成对称加密的随机数
  3. 支持的加密方法
  4. 压缩算法

ServerHello

服务器回复

  1. 确认使用的协议版本
  2. 第二个用于生成对称加密的随机数
  3. 确认使用的加密方法,比如RSA公钥加密
  4. 服务器证书

客户端响应

客户端回复

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

服务器响应

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

之后所有内容就交由SSL层使用对称密钥加密后传递