一句到尾,HTTPS的存在就是为了传输一次安全的对称秘钥。通信双方使用这个安全的对称秘钥加密实际数据。
HTTPS解决的是HTTP的什么缺陷?
HTTP的传输内容是明文,容易被窃听,不安全。
在现有的网络结构中,传输消息,需要经过很多中转节点,这是IP协议负责的事情,也就是说需要经过链路上的各个路由器,路由器一步一步转发,最终到达目标终点。这个过程中,很明显只要别有用心的人,把其中的内容窃听或者篡改,那后果就很可怕了。
解决思路:
1.如果是明文传输,那是不是先给数据加密,然后再进行传输不就OK了?
加密可以分为,对称加密,非对称加密(性能消耗大)。
如果数据使用对称加密,那么就需要双方提前商定好,对称秘钥。服务器端通过此对称秘钥加密数据,客户端使用对称秘钥解密数据。
但是客户端并不是固定的,所以要么只使用一种对称秘钥,所有客户端都一样。要么就先传输对称秘钥,然后再进行数据传输。
第一种办法肯定就GG了,安全性很低,只有一种对称秘钥,伪造的客户端,是有可能不断通过重试,得到公钥。
那么只有第二种办法,需要安全传输一次对称秘钥。这里还有一个问题,对称秘钥分为私钥与公钥。简单来说,就是公钥是服务器下发的,用此公钥加密的内容,只有私钥可以解密。所以问题就来了,公钥如果被劫持了,怎么破?中间人会发一个假公钥到客户端,客户端用这个假公钥加密的数据,可以别中间人的私钥解密,篡改数据后,然后再使用真公钥加密假数据,与服务端通信。那也就是说,客户端需要有办法验证拿到的是不是来自服务器的公钥。
这就是HTTPS做的事情。也就是传说中的数字证书。数字证书 = 数字签名 + 信息
数字签名,首先简单说一下所谓的数字签名。这跟我们平常生活中的签名是一样的,具有不可伪造和不可抵赖,两个特性。我们平时的手写签名,是具有法律效应的,因为每一个人的笔迹都是独一无二的,即使模仿,也可以通过专家鉴定分别出来。而不可抵赖,是因为每个人的笔迹都有固定特征,这些特征是很难摆脱的。
那数字签名是怎么做到的呢?
它用公钥加密然后私钥解密,同时可以用私钥加密然后公钥解密
这样,如果你生成了一对RSA密钥,你把公钥公布出去,并告诉全世界人这个公钥是你的。之后你只要在发送的消息,比如“123456”这个就是上面说的信息,后面加上用私钥加密过的密文,其他人拿公钥解密,看解密得到的内容是不是“123456”就可以知道这个“123456”是不是你发的。 其他人因为没有对应的私钥,所以没法生成公钥可以解密的密文,所以是不可伪造的。 又因为公钥对应的私钥只有一个,所以只要能成功解密,那么发消息的一定是你,不会是其他人,所以是不可抵赖的。
所以当客户端确定收到的是来自服务器的公钥,就可以生成一个随机对称秘钥,用此公钥进行加密。然后将此随机对称秘钥发送给服务端,之后便通过这个随机生成的对称秘钥进行加密数据通信。
看一张流程图:
最后以上做的事情,就是整个HTTPS具体做的事情,也就是TLS/SSL做的事情。
参考:
https://blog.csdn.net/qmickecs/article/details/73696954?utm_source=copy
https://blog.liuxuan.site/2018/05/21/learn_https_through_photos/