前端高频面试HTTPS

200 阅读8分钟

1. 从HTTP说起

1.1什么是HTTP协议

  • HTTP协议是超文本传输协议
  • 是应用层的协议,基于TCP/IP
  • 通过请求响应的方式来与服务器通信
  • 明文传输数据,不做任何加密,容易被中间人篡改

2. HTTP和HTTPS的对比

​ 说起HTTP请求,我们几乎每天都在发出这样的请求,例如我们在浏览器中输入www.baidu.com时,就是向百度的服务器发出一个http请求,而百度的服务器同时会给我们返回该请求的一个回应。再例如,我们在一个登录的场景下,输入用户名="123",密码="666666",然后按下登录按钮,此时http请求中将携带着用户名和密码两个信息提交到服务器,然后服务器从http请求的报文中提取到用户名和密码等信息。

很明显,http请求存在着一个很严重的问题,http协议传输的是明文,如果中间有个黑客拦截到该请求,就拦截到了我们的数据,就能将我们的用户名和密码看得一清二楚,这样隐私的数据就非常容易泄露出去。

从上图可以看到,HTTP和HTTPS协议底层都是基于TCP的协议,只是HTTPS协议中间多了一层SSL或者TLS,因此,很简单,HTTPS就是HTTP协议加上SSL/TLS。TLS是SSL的升级版,它们的作用都是进行加密的连接。

2.1. 对称加密

特点:靠一个密钥来加密数据,使用相同的一个密钥来解密数据。首先用户需要把自己的一把钥匙给送给服务器,用户用这把钥匙加密数据,然后服务器待会拿这把相同的钥匙去解密用户接下来发送的数据。

那么,这样的加密算法有什么不妥呢?首先,如果用户拥有相同的密钥的话,我的密钥能解你的数据,你的密钥能解密我的数据,这样,别有用心的用户就能截取和破解你的数据了,所以,个用户都必须拥有一把只属于自己的密钥,那每个用户的密钥都要先发给服务器,那有5000万个用户服务器就有5000万把密钥,这明显给服务器增加了太多太多的负荷,这是显然不符合我们的需求的;其次,如果在客户端第一次发送密钥给服务器的时候,此次发送是明文发送的,黑客此刻在中间截取到了我们的密钥,那接下来的数据黑客也能破解掉,这明显也是不符合我们的需求。但是,该加密方式计算量小,加密和解密的速度比较快,适合加密比较大的数据。好了,讲完对称加密,我们知道对称加密存在着一些缺点,由此产生了第二种的加密方式,就是非对称加密。

2.2. 非对称加密

特点:有一个公钥和一个私钥,公钥加密只能私钥解密,私钥加密只能公钥解密。因为解密和加密使用不同的钥匙,所以称为非对称加密。公钥和私钥都放在服务器上,公钥是可以随便传输的,私钥是绝对不会暴露的,数据传输是安全的。

首先服务器端把公钥传给客户端,客户端拿到公钥后对数据进行加密,然后客户端发送使用公钥加密过的数据到服务器,服务器收到加密后的数据后使用私钥对数据进行解密。

此刻,黑客即使拿到公钥和公钥加密后的数据,也没法解密,因为公钥加密的数据公钥是解不了的,只有私钥能解。

该加密方式数据传输虽然安全,但是计算量大,加密和解密的速度比较慢

那么,有没有一种方法是加密解密速度快,而且又是数据传输安全的呢?根据对称加密的优点和非对称加密的优点,由此诞生了HTTPS的加密方式,接下来我们看一下HTTPS加密、解密及验证的过程。

2.3 HTTPS加密、解密及验证过程

假如服务器端存有一个公钥777和一个私钥888

首先,浏览器发出一个https请求,如www.baidu.com,服务器端响应请求,返回一个SSL数字证书给客户端,SSL数字证书包括了公钥和服务器的身份标识信息,客户端收到SSL数字证书之后,验证该数字证书是否有效,如无效,则浏览器会发出不安全警告,如有效,就会先生成一个随机码如6666,然后使用公钥777对这个随机码进行加密,然后传输该加密后的随机码到服务器,服务器使用私钥888进行解密,得到客户端的随机码为6666,以上该过程就是我们说的非对称加密。此时,客户端和服务器都同时拥有了该随机码6666,然后,把这个随机码6666用作对称加密的密钥,用密钥6666对userName和passWord的信息进行加密,发送到服务器端,服务器端同样使用相同的密钥6666对数据进行解密,最后得到userName和passWord的信息。以上为整个HTTPS加密、解密及验证的过程。

服务器上保存有公钥和私钥,当浏览器发送一个请求到服务器

服务器响应一个SSL数字证书给浏览器,包含公钥和服务器的身份信息

客户端收到浏览器证书,会判断数字证书是否有效,若无效则发出不安全警告

若有效,则随机生成一个验证码,通过公钥加密发送给服务器,服务器收到后用私钥进行解密,这样客户端和服务器都有了该随机码,该随机码就作为对称加密的密钥

客户端用这个随机码对数据进行加密后发送到服务器,服务器用这个随机码进行解密,就会获取到了数据

2.4 HTTP与HTTPS区别

  • HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
  • 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
  • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
  • http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
  • HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

CA权威的证书颁发机构

制作证书

  • 服务端将自己的公钥 key1 发送给 证书颁发机构,申请证书
  • 证书颁发机构有一套自己的公钥和私钥
  • CA通过自己的私钥来加密key1,并且通过服务端网址信息生成一个证书签名
  • 证书签名同样使用CA的私钥进行加密
  • 制作完成后,机构将证书发给服务端

校验证书真伪

  • 当浏览器向服务器发起请求的时候,服务器返回一个证书
  • 由于浏览器和系统都已经维护了所有的权威机构的公钥
  • 浏览器只需要知道是那个权威机构的证书,使用对应的机构公钥,解密出证书签名
  • 浏览器同样的规则生成,生成自己的证书签名
  • 如果两个签名是一致的,则证书是有效的
  • 验证签名成功之后,B就可以利用该机构的公钥来解密出服务器的公钥key1
  • 接下去的就是和之前的流程

中间人是否会拦截发送假证书到浏览器

  • 因为证书的签名是由服务器端网址信息生成,并且通过第三方机构的私钥加密,中间人无法篡改
  • 所以最关键的问题是证书证书签名的真伪