Skip to content

HTTPS

什么是HTTPS

HTTPS = HTTP + SSL

HTTP是应用层的协议,HTTP是直接和TCP通信的,当我们更换为HTTPS的时候,它就演变成了,先和SSL通信、然后再由SSLTCP通信了

为什么用 HTTPS

  • 和服务器通信时,直接采用明文传输,那么明文内容有可能被挟持监听和篡改
  • 和服务器通信时,无法验证身份

HTTPS如何实现加密(SSL过程)

了解两种加密方式

  • 对称加密:同一把密钥既可以加密,也可以解密
  • 非对称加密:公钥加密私钥解密,反之亦然

使用哪种加密方式?

  • 单独使用对称加密: 服务器发送给浏览器的密钥依然容易被劫持:既可以加密数据也可以解密数

  • 单独使用非对称加密: 服务器发送给浏览器的密钥依然容易被劫持:可以解密服务器返回的数据

  • 使用两对非对称加密: 浏览器和服务器都要保存密钥,加密次数过多,非常耗时

  • 使用非对称加密 + 对称加密 (HTTPS的实现) 服务器保存一对非对称密钥:公钥A+,私钥A-

    1. 客户端请求,服务器返回 A+
    2. 客户端利用A+对浏览器生成的对称密钥B加密,发送给服务器
    3. 服务端利用A-对发送过来的数据解密,获得B
    4. 之后的通信使用对称密钥B

还有什么问题?

中间人劫持:

中间人保存一对非对称密钥:公钥C+,私钥C-

  1. 中间人劫持服务器返回的公钥A+
  2. 中间人发送自己的公钥C+给浏览器
  3. 浏览器使用C+加密对称密钥B,发送给服务器
  4. 中间人劫持浏览器,使用C-解密浏览器的数据获得B,再使用A+B加密,发送给服务端
  5. 服务器收到中间人发送的数据,使用A-解密获得B

接下来服务器和浏览器的通信都会被中间人劫持到,因为它得到了对称密钥B。

解决中间人劫持:数字证书

被劫持的原因在于浏览器不能识别密钥是否是服务器的。向CA机构申请数字证书给服务器颁发身份证

数字签名

CA机构有一套非对称加密的 公钥A+ 和 私钥A-

  1. 网站向CA机构申请颁发数字证书;
  2. CA机构通过审核之后,会生成一份证书数据(此时为明文,内容包括:书持有者信息、网站公钥、和有效期等);
  3. 利用散列函数对证书的明文数据进行Hash处理,生成一份数据摘要
  4. 接着利用私钥A-对这份数据摘要进行加密,得到数字签名
  5. 将证书明文数据 + 数字签名 合并到一起,组成完整的数字证书;
  6. 将这份数字证书颁发给对应的网站。
如何实现不被中间人攻击

关键:我们的浏览器已经预存了CA机构的公钥,中间人劫持不到。

  1. 服务器返回数字证书(包括明文数据和数字签名)
  2. 客户端接收到数字证书,对比两份摘要是否相同:
    • 第一份摘要:使用数字证书携带的hash算法对明文数据hash获得摘要
    • 第二份摘要:使用自带的公钥对数字签名解密获得摘要
  3. 无论中间人怎么修改都会导致两份摘要不一样

HTTPS完整的工作流程

前提:

  • CA机构有一套非对称加密的公钥A+ 和私钥A-,浏览器预存公钥A+
  • 服务器也有一套非对称加密的公钥B+ 和私钥B-
  1. 浏览器向服务器发起请求;

  2. 目标服务器收到请求,将数字证书返回给浏览器(包括公钥B+数字签名);

  3. 浏览器收到证书之后,使用公钥A+解密数字签名得到数据摘要T,使用证书携带的HASH算法对数字证书上的明文数据计算得到数据摘要S,若 T = S,则证书有效

  4. 使用服务器发送过来的公钥B+对随机生成的对称密钥B加密,发送给服务端

  5. 服务端使用私钥B-对客户端发送的数据解密得到B,此时双方拥有了对称密钥B,此后的通信使用B加密解密