HTTPS终于明白了!

233 阅读6分钟

HTTPS解决了什么事情?

由于HTTP是明文传输的,存在以下几个缺陷:

  1. 请求易被窃听。所有请求经过的地方(wifi、路由器、运营商、抓包工具等)都可以对请求进行截获并监听。
  2. 客户端、服务端容易被假冒,无法认证对方的身份。
  3. 请求数据容易被篡改。同1

HTTPS(HyperText Transfer Protocol Secure)超文本传输安全协议的出现成功的解决了HTTP带来的安全问题,其中的S表示的是安全,它的实现其实就是在HTTP的基础上增加了SSL(安全套接层)/TSL(传输层安全协议)加密。

HTTPS加密的演变过程

之前看了一篇用信鸽传信来解释HTTPS传输的过程,简单易懂,让我瞬间明白了公钥、私钥等晦涩难懂的名词。

初步传信

爱丽丝通过信鸽给杰克传信,坏蛋鲍勃劫持了他们的信鸽,将信件信息进行了篡改,但是杰克完全不知道。

这就是HTTP协议存在的明显的安全缺陷。

商量好的密钥

爱丽丝和杰克意识到了这个情况,决定用一组密码来加密他们的信息,比如将信息中的每一个字母按照顺序前移三位,比如,D→A,E→B,F→C。如此一来,原文为 “secret message” 的信息就变成了 “pbzobq jbppxdb” 。

这样就算被鲍勃截取了信息,也无法解密这段信息,获取到最初的信息。

杰克在接收到信息之后,按照一样的解码规则将信息解码,得到真实的信息。

这就是对称密钥加密。即加密和解密用的是同一套密钥。

密钥如何传输?

上面的方法是比较方便,但是爱丽丝和杰克在不见面的情况下如何告知对方对称加密的密钥呢?

如果还是在信中传递密钥,就会被鲍勃截获,功亏一篑。

信鸽传输盒子

爱丽丝和杰克想到了另一个更好的方法:

当爱丽丝想给杰克传信时,杰克发送一只没有锁上的箱子,这个箱子的钥匙只有杰克自己有

爱丽丝收到箱子后,将信件存放在箱子里,锁上之后发送出去

杰克收到箱子之后,用唯一的钥匙打开箱子,获取信息

用这种方法,即使鲍勃半路截获了空箱子或者锁住的箱子,也获取不到任何信息。

这种箱子和钥匙的加密方式,就叫做非对称加密。箱子和钥匙我们称为公钥私钥,相互匹配,只有对方能解开。

但是还是会有问题,如果鲍勃半路截获了空箱子,换成了自己才拥有钥匙的另一个空箱子,爱丽丝对此一无所知,将信件放在鲍勃的箱子里传输,鲍勃打开箱子就可以知道爱丽丝的信件内容了。(🤷‍♀️)

每个人都可以有自己的箱子和钥匙,就相当于都拥有自己的公钥和私钥。鲍勃把自己的公钥发给爱丽丝,爱丽丝并不能识别出来。

确认对方的身份

出现上述问题的原因其实就是,爱丽丝和杰克互相不能确认对方的身份。

于是他们找到了村里一个值得信赖的人--泰德--来给箱子进行签名,泰德会给任何人签名,并且大家都很信任他,只会给值得信任的人签名。通过这个签名爱丽丝可以确认这个箱子是来自于杰克没错。

现在爱丽丝和杰克就可以进行可靠的传输了。

鲍勃无法搞到一个签了杰克名字的箱子。

泰德--其实就是认证机构(CA机构)。

最后的方案

爱丽丝和杰克意识到鸽子携带箱子要比携带信件慢很多,所以他们最后决定只用箱子(也就是非对称加密)传输对称加密算法的密钥。

正常的信件传输还是用对称加密。

这样就兼具了对称加密的高效性和非对称加密的可靠性。

以上其实就是HTTPS传输信息的整个过程。

HTTPS工作流程

image.png

按照HTTPS的术语详细记录一下整个过程。

证书校验过程

服务端使用HTTPS前,会去CA机构申请一份数字证书,证书中包含证书持有者、证书有效期和公钥等信息,服务端会将证书除了私钥之外的东西发给客户端。

客户端收到证书之后,将证书的所有者信息与自己要访问的网站信息对比,确认一致后再进行后续的通信。

注意:此时中间人截取到证书后只修改了证书的公钥,此刻的公钥只有中间人才拥有私钥。客户端并未发觉。

如何确认证书没有被篡改?

---利用证书的私钥给证书加一个数字签名。

服务端发证书给客户端之前,用私钥给证书正文内容加密(加数字签名)

服务端将证书加密后的内容、原证书内容都发给客户端

客户端接收到之后,用证书的公钥解密签名部分

解密之后得到的内容如果与证书正文部分一致,就说明证书没有被篡改

由于CA机构是一种公共信任身份,在系统或者浏览器中会内置证书的公钥和哈希算法信息等。

确认证书没有被篡改,以及确认证书的拥有者和自己要访问的网址一致,就可以证明你就是我要找的那个真的服务端啦!(🤦‍♀️)

非对称加密部分

验证服务端身份之后,就开始了传输密钥的过程(对称加密的密钥)。

客户端用证书中的公钥对密钥进行加密,传递给服务端。

服务端用私钥进行解密,得到密钥。

到此为止,客户端和服务端得到了后续请求要使用的对称加密的密钥。

对称加密部分

客户端使用对称加密的密钥对所发的信息进行加密,服务端使用对应的密钥进行解码。

进行正常的安全通信...

对于HTTPS证书来说,公钥用来加密,私钥用来解密,也可以用来加数字签名,客户端验证证书没有被篡改之后,再核实证书上的拥有者,就可以验证服务器的身份啦,太牛逼了!

总结

对于HTTPS来说,HTTP传输数据的部分没有改变,只是在信息传输之前,增加了一个确认对方身份的过程,以及给后续的请求内容加密。

参考文献:

juejin.cn/post/684490… juejin.cn/post/684490… juejin.cn/post/684490…