Bootstrap

【JavaSE】【网络协议】HTTPS


一、HTTPS简介

HTTPS 也是⼀个应⽤层协议. 是在 HTTP 协议的基础上引⼊了⼀个加密层.
HTTP 协议内容都是按照⽂本的⽅式明⽂传输的. 这就导致在传输过程中出现⼀些被篡改的情况.
可以搜一下<运营商劫持事件>

二、加密与解密

加密:就是把 明⽂ (要传输的信息)进⾏⼀系列变换, ⽣成 密⽂ .
解密:就是把 密⽂ 再进⾏⼀系列变换, 还原成 明⽂ .

秘钥:在这个加密和解密的过程中, 往往需要⼀个或者多个中间的数据, 辅助进⾏这个过程, 这样的数据称为密钥。

对称加密:对称加密其实就是通过同⼀个 “密钥” , 把明⽂加密成密⽂, 并且也能把密⽂解密成明⽂.

非对称秘钥:加密和解密使用不同的秘钥,两个秘钥之间有很隐秘的联系。然后公开其中一个秘钥,被公开的秘钥就是公钥,另一个就是私钥

三、HTTPS的⼯作过程

3.1 对称加密

对称加密简单图:

引⼊对称加密之后, 即使数据被截获, 由于⿊客不知道密钥是啥, 因此就⽆法进⾏解密, 也就不知道请求的真实内容是啥了.

但是一台服务器是需要对多台客户端提供服务, 这么多客⼾端,每个⼈⽤的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, ⿊客就也能拿到了). 因此服务器就需要维护每个客⼾端和每个密钥之间的关联关系, 这也是个很⿇烦的事情.

在客⼾端和服务器建⽴连接的时候, 双⽅协商确定这次的密钥是啥,就可以避免上述问题。

但是,这将秘钥公开,黑客轻易拿到,不就相当于明文传输吗。

3.2 非对称加密

非对称加密使用:

  • 通过公钥对明⽂加密, 变成密⽂
  • 通过私钥对密⽂解密, 变成明⽂

也可以反着⽤

  • 通过私钥对明⽂加密, 变成密⽂
  • 通过公钥对密⽂解密, 变成明⽂

过程简述:

  • 客⼾端在本地⽣成对称密钥, 通过公钥加密, 发送给服务器.
  • 由于中间的⽹络设备没有私钥, 即使截获了数据, 也⽆法还原出内部的原⽂, 也就⽆法获取到对称密钥
  • 服务器通过私钥解密, 还原出客⼾端发送的对称密钥. 并且使⽤这个对称密钥加密给客⼾端返回的响应数据.
  • 后续客⼾端和服务器的通信都只⽤对称加密即可. 由于该密钥只有客⼾端和服务器两个主机知道,其他主机/设备不知道密钥即使截获数据也没有意义.

3.3 中间人攻击

  1. 服务器具有⾮对称加密算法的公钥S,私钥S’
  2. 中间⼈具有⾮对称加密算法的公钥M,私钥M’
  3. 客⼾端向服务器发起请求,服务器明⽂传送公钥S给客⼾端
  4. 中间⼈劫持数据报⽂,提取公钥S并保存好,然后将被劫持报⽂中的公钥S替换成为⾃⼰的公钥M,
    并将伪造报⽂发给客⼾端
  5. 客⼾端收到报⽂,提取公钥M(⾃⼰当然不知道公钥被更换过了),⾃⼰形成对称秘钥X,⽤公钥M加
    密X,形成报⽂发送给服务器
  6. 中间⼈劫持后,直接⽤⾃⼰的私钥M’进⾏解密,得到通信秘钥X,再⽤曾经保存的服务端公钥S加
    密后,将报⽂推送给服务器
  7. 服务器拿到报⽂,⽤⾃⼰的私钥S’解密,得到通信秘钥X
  8. 双⽅开始采⽤X进⾏对称加密,进⾏通信。但是⼀切都在中间⼈的掌握中,劫持数据,进⾏窃听甚
    ⾄修改,都是可以的

3.4 引⼊证书解决

服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威性

证书

证书中包含:证书发布机构,证书有效期,公钥,证书所有者,数据签名等信息

3.4.1 数据签名

签名的形成是基于⾮对称加密算法的,

数据签名本质是一个校验和:

将证书中包含的内容,通过CA机构的算法得到一个值(就像hash函数一样),这个值是唯一的。
每个服务器在建成的时候,都会申请证书,而CA机构也会验证服务器提供的内容是不是正确的,是就会给一个证书。

3.4.2 引入证书后的工作过程:

  1. 客户端收到证书后,根据操作系统中内置的解析证书的方式,将数据签名解析,拿到服务器的公钥,ip等信息
  2. 客户端验证ip是否正确(URL中包含的ip),正确就发送请求,包含公钥加密的对称密钥,
  3. 服务器解析得到对称密钥,使用对称密钥解析得到请求报文。
  4. 服务器使用对称密钥加密响应,返回响应。客户端拿到响应,通过对称密钥解析得到请求。

这个过程中,密钥都是没有暴露出来的。

中间⼈有没有可能篡改该证书?

  • 中间⼈篡改了证书的明⽂
  • 由于他没有CA机构的私钥,所以⽆法hash之后⽤私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
  • 如果强⾏篡改,客⼾端收到该证书后会发现明⽂和签名解密后的值不⼀致,则说明证书已被篡改,证书不可信,从⽽终⽌向服务器传输信息,防⽌信息泄露给中间⼈

中间⼈整个掉包证书?

  • 因为中间⼈没有CA私钥,所以⽆法制作假的证书(为什么?)
  • 所以中间⼈只能向CA申请真证书,然后⽤⾃⼰申请的证书进⾏掉包
  • 这个确实能做到证书的整体掉包,但是别忘记,证书明⽂中包含了域名等服务端认证信息,如果整体掉包,客⼾端依旧能够识别出来。
  • 永远记住:中间⼈没有CA私钥,所以对任何证书都⽆法进⾏合法修改,包括⾃⼰的
;