主要理解下面两点: 1.http和https的区别;2.https具体解决了那些问题
HTTP都有哪些问题
HTTP最大的问题就是数据没有加密和通信双方不能互相验证身份,对应以下场景👇
- 信息泄露。HTTP是可以被拦截的,假如你的上网方式被人家控制了(比如连接匿名WiFi),那你的所有信息都有可能被拦截到
- 网站劫持。很常见的就是被运营商的广告劫持了,当我们上一个网站的时候莫名其妙地弹出一个广告(这个广告并不是这个网站的),这就是因为我们访问的页面被运营商劫持,加入了他自己的东西
HTTPS如何解决问题
先从加密说起:HTTP没有加密信息,中间人拦截之后就可以知道传输的信息了,比如当你登录的时候把账目和密码通过网络传输,如果手机是接入了被监控的WIFI,那敏感信息就可以被拦截了
1️⃣第一种加密信息尝试:对称加密
客户端和服务器都有一把一样的钥匙,传输的时候先加密,这样子别人拦截到的信息是加密之后的,他没有钥匙无法解密信息。但是不可能钥匙永远都是一把,如果一方保管不善,泄密了就完了。所以最好的做法就是每一次传输都生成一把钥匙。信息传输之前,先让客户端和服务器先碰一下头,交换彼此的钥匙,然后用钥匙加密之后再传输数据。但是钥匙也是直接传输的,被劫持之后也凉了
2️⃣第二种加密信息尝试:非对称加密
服务器有一把自己的钥匙叫做私钥,然后客户端也有一把钥匙叫做公钥,公钥是公开的,所有人都知道。私钥加密的信息公钥都可以解密,公钥加密的信息只有私钥才能解密,这样就保证了只有服务器才能拿到传输的信息
过程如下:
- 客户端向服务器要公钥
- 服务器给出公钥
- 客户端利用公钥加密数据传给服务器
- 服务器利用私钥解密数据,然后把返回的数据用私钥加密
- 客户端拿到加密数据用公钥解密
问题出在第二步,客户端如何确定自己拿到的公钥,真的就是是自己服务器生成的公钥?中间人也可以搞一套,自己生成一个公钥给客户端,然后自己发一个请求去服务器要一个公钥,客户端利用中间人的公钥加密数据传输,中间人用自己的私钥解密之后,再用服务器的公钥加密传给服务器,然后拿到服务器返回的数据,再把这个数据传给客户端,这样一来,所有的信息也还是经过了中间人,也凉了
3️⃣确保拿到的公钥是自己服务器生成的公钥
举例,你去坐高铁的时候如何证明你是你?答案是用公安局身份证。客户端在拿到传送过来的公钥的时候让服务器把自己的身份证出示一下,这个身份证就是服务器CA证书。让自己的服务器去公安局那里拿一个身份证,上面有服务器的一些信息,比如域名,过期时间等,客户端收到服务器发过来的CA证书的时候,我只要核对CA证书的真伪,那我就知道我能不能信赖你
4️⃣那客户端如何校验服务器发过来的CA证书的真伪?
举个例子,在你请假的时候让你的领导在请假条上签一个名,当HR看到假条上签名的时候就知道领导同意你请假了,CA证书的真伪也可以通过计算机的数字化签名来实现。下面也是通过非对称加密来生成签名和解密签名:
- 服务器将自己的域名、IP等信息提交给 CA 审查
- CA 审查无误,使用私钥把服务器信息的摘要加密,生成的密文就是所谓签名
- CA 把服务器的信息、签名、有效期等信息集合到一张证书上,颁发给服务器
- 服务器每次发信息的时候把自己的CA证书也传给客户端
- 客户端收到服务器发送的证书后,使用CA的公钥解密签名,获得服务器信息的摘要,如果和证书上记录的服务器信息的摘要一致,说明服务器信息是经过CA认可的
5️⃣那客户端如何解密CA证书?
来自浏览器,全球的CA证书颁发机构就那几家,公钥都直接预装在浏览器上了
HTTPS的数据传输过程
前期准备工作:
- 客户端(操作系统/浏览器) 自带了CA根证书(解密签名的公钥)
- 服务器自己去机构里领取一张带有数字签名的CA证书
每一次数据传输的过程:
- 客户端要发数据前去服务器那里要公钥+CA证书
- 服务器返回本次传输的公钥和服务器自己的CA证书
- 客户端用自己的CA公钥去解密传过来的CA证书的签名,解密出来的信息和证书上的信息一致,那就说明送过来的公钥是自己服务器上的公钥,可以信赖这个公钥
- 客户端用公钥加密数据传给服务器
- 服务器用私钥去解密信息,然后把返回信息用私钥加密传回去
- 客户端用公钥解密返回的数据,整个传输过程完成