luxuze.github.io

github pages

View on GitHub

HTTP & HTTPS

HTTP (Hypertext Transfer Protocol)

HTTPS (HyperText Transfer Protocol Secure)

https 通信流程

  1. 用户在浏览器发起 HTTPS 请求(如 https://www.google.com/),默认使用服务端的 443 端口进行连接;
  2. HTTPS 需要使用一套 CA 数字证书,证书内会附带一个公钥 Pub,而与之对应的私钥 Private 保留在服务端不公开;
  3. 服务端收到请求,返回配置好的包含公钥 Pub 的证书给客户端;
  4. 客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示 HTTPS 警告信息,如果通过则继续;
  5. 客户端生成一个用于对称加密的随机 Key,并用证书内的公钥 Pub 进行加密,发送给服务端;
  6. 服务端收到随机 Key 的密文,使用与公钥 Pub 配对的私钥 Private 进行解密,得到客户端真正想发送的随机 Key;
  7. 服务端使用客户端发送过来的随机 Key 对要传输的 HTTP 数据进行对称加密,将密文返回客户端;
  8. 客户端使用随机 Key 对称解密密文,得到 HTTP 数据明文;
  9. 后续 HTTPS 请求使用之前交换好的随机 Key 进行对称加解密;

https 中间人攻击(Man-in-the-middle attack, MITM)

中间人攻击

  1. 服务端有非对称加密的公钥 A1,私钥 A2;
  2. 客户端发起请求,服务端将公钥 A1 返回给客户端;
  3. 客户端随机生成一个对称加密的密钥 K,用公钥 A1 加密后发送给服务端;
  4. 服务端收到密文后用自己的私钥 A2 解密,得到对称密钥 K,此时完成了安全的对称密钥交换,解决了对称加密时密钥传输被人窃取的问题;
  5. 之后双方通信都使用密钥 K 进行对称加解密;

CA 颁发

服务端在使用 HTTPS 前,去经过认证的 CA 机构申请颁发一份数字证书,数字证书里包含有证书持有者、证书有效期、公钥等信息,服务端将证书发送给客户端,客户端校验证书身份和要访问的网站身份确实一致后再进行后续的加密操作。 但是,如果中间人也聪明一点,只改动了证书中的公钥部分,客户端依然不能确认证书是否被篡改,这时我们就需要一些防伪技术了。 私钥除了解密外的真正用途其实还有一个,就是数字签名,其实就是一种防伪技术,只要有人篡改了证书,那么数字签名必然校验失败。具体过程如下:

  1. CA 机构拥有自己的一对公钥和私钥
  2. CA 机构在颁发证书时对证书明文信息进行哈希
  3. 将哈希值用私钥进行加签,得到数字签名
  4. 明文数据和数字签名组成证书,传递给客户端。
  1. 用 CA 机构的公钥进行解签,得到 Sig2(由于 CA 机构是一种公信身份,因此在系统或浏览器中会内置 CA 机构的证书和公钥信息)
  2. 用证书里声明的哈希算法对明文 Text 部分进行哈希得到 H
  3. 当自己计算得到的哈希值 T 与解签后的 Sig2 相等,表示证书可信,没有被篡改