✒️ https

吞佛童子2022年6月20日
  • 计算机网络
  • 应用层
  • https
大约 6 分钟

✒️ https

1. http VS https

httphttps
数据传输明文传输密文传输
连接建立3次握手3次握手 + 4次 SSL/TLS 握手
端口80443
潜在风险 & 对策窃听、篡改、冒充混合加密、摘要算法、数字证书

2. 具体措施

1) 混合加密 - 防窃听

  1. 在连接建立时采用非对称加密
  2. 在数据传输过程中采用对称加密

2) 摘要算法 - 防篡改

  1. 客户端将明文数据通过指定的摘要算法生成摘要
  2. 明文数据 & 摘要 经过公钥加密后传输
  3. 服务端收到信息后,通过私钥解密,得到 明文数据 & 摘要
  4. 服务端通过相同的摘要算法对明文生成摘要
  5. 对比客户端传来的摘要 & 自己生成的摘要,一致则表示数据未被篡改

3) 数字证书 - 防冒充

  1. 需要保证客户端收到的公钥确实是服务端的公钥,而非第三方冒充
  2. CA 是权威的证书颁发机构,全球就几家,该机构通过 RSA 生成一对公私钥
  3. 流程
    • 服务器将自己的公钥注册到 CA
    • 传输数据时,CA 将服务器的 公钥 & 证书认证机构 CA 的信息 & 持有者信息 & 证书有效期 & 其他信息 封装,得到 明文 P
    • 明文 P 通过 Hash 算法生成 H1
    • CA 用私钥对 H1 进行 RSA 加密,得到 S
    • P & S == 数字证书
    • 客户端收到数字证书后,对证书进行解析,用同样的 Hash 算法对 P 进行计算,得到 H2
    • 通常浏览器 & 操作系统中集成了 CA 的公钥信息,用 CA 公钥解密 S,得到 H3
    • 比较 H2 == H3 是否成立,若成立,则说明证书可以信任,可以从 P 中取出服务器的公钥进行后续操作
  4. 证书链
    • 一般向 CA 申请的证书并非 根证书 签发,而是由 中间证书 机构签发的
    • 对于服务端传来的证书,如果浏览器之前没有存储该证书,那么,
      • 客户端会根据服务端证书的签发者,向 CA 请求该中间证书,
      • 若还是没有,继续向 CA 请求中间证书的签发者,直到 根证书
      • 然后通过已有的 根证书的公钥,验证中间证书的正确性,验证通过后,
      • 利用中间证书的公钥,验证服务端证书的正确性,验证通过,则说明可以信任
  5. 借助证书链,将根证书尽可能隔离,尽可能保证了根证书的安全性

3. 连接建立过程

1) TCP 三次握手

2) SSL/TLS 协议

① Client Hello

  • 客户端向服务器端发送以下信息:
    • 客户端随机生成的随机数 [Client Random]
    • 客户端支持的 SSL/TLS 协议版本,例 TLS 1.2
    • 客户端支持的 密码套件,包含 密钥交换算法 & 签名算法 & 对称加密算法 & 摘要算法

img_1.png

② Server Hello

  • 服务端收到请求后,得到 [Client Random],发出响应,主要包含以下信息:
    • 服务端随机生成的随机数 [Server Random]
    • 确认使用的 SSL/TLS 协议版本,若浏览器不支持,则关闭加密通信
    • 确认使用的 密码套件
    • 服务器的 数字证书

img_2.png

③ 客户端回应

  • 客户端收到服务器的回应后,需要经过以下步骤:
    • 通过浏览器 | 操作系统的 CA 公钥,验证服务器数据证书的真实性,认证通过后,
    • 从数据证书中取出 服务器的公钥 & 服务器的随机数 [Server Random]
    • 客户端随机生成随机数 [Random],使用 服务器的公钥 加密,得到 [PreMaster Key]
    • 向服务器发送以下信息:
      • [PreMaster Key]
      • 加密算法改变通知,之后信息通过 [会话密钥] 加密通信
      • 客户端握手结束通知,
      • 将前面握手阶段的消息生成摘要,再用 [会话密钥] 加密,作为客户端第一条加密消息,能被服务器端正确解出则说明双方 [会话密钥] 一致
  • 会话密钥 = [Client Random] + [Server Random] + [Random]

img_3.png

④ 服务端回应

  • 服务端受到客户端回应后,取出 [PreMaster Key],通过 服务端的私钥 解密,得到 [Random]
  • 将 Client Hello 阶段得到的 [Client Random] + 自己的 [Server Random] + [Random] == 会话密钥
  • 向客户端发送以下信息:
    • 加密算法改变通知,之后信息通过 [会话密钥] 加密通信
    • 服务端握手结束通知,
    • 将握手阶段产生的消息生成摘要,再用 [会话密钥] 加密,作为服务器端第一条加密消息,能被客户器端正确解出则说明双方 [会话密钥] 一致

3) 正常数据传输

  • 通过协商好的 [会话密钥] 加密信息,进行传输

4. 缩短 https 握手次数

1) TCP Fast Open

① 是什么

  • TCP Fast Open 是为了绕过 TCP 三次握手发送数据,在 Linux 3.7 内核版本之后,提供了 TCP Fast Open 功能,这个功能可以减少 TCP 连接建立的时延

② 前置条件

  • 客户端和服务端都要同时支持才会生效
  • 作用于非初次连接

③ 首次连接流程

  • 客户端发送 SYN 报文,报文中包含 Fast Open 选项,且 选项中的 cookie == 空
  • 服务端返回 SYN-ACK 报文,报文中包含 Fast Open 选项,且 选项中的 cookie == 服务器生成的 cookie
  • 客户端收到 SYN-ACK 报文后,本地缓存 该 cookie

④ 非首次连接流程

  • 客户端发送 SYN 报文,报文中包含 Fast Open 选项,且 选项中的 cookie == 之前缓存的 cookie,还同时携带应用数据
  • 服务端对 SYN 报文的 cookie 进行校验
    • cookie 有效,则服务器端返回 SYN-ACK 报文,报文包含对应用数据的确认,随后向客户端返回响应数据,从而减少了 一个 RTT 的时间消耗
    • cookie 无效,则服务器端返回 SYN-ACK 报文,报文中没有对应用数据的确认

2) TLS v1.3

  • TLS v1.3 握手过程只需要 1个 RTT 时间
  • 会话恢复时,重连 TLS v1.3 只需要 0 个 RTT 时间
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou