前端:关于HTTP、HTTPS与HTTP2 - Go语言中文社区

前端:关于HTTP、HTTPS与HTTP2


引言

在前端面试之中经常会提到HTTP,HTTPS,HTTP2这些协议层的问题,这边稍微做个总结,也以此来加深印象。下面先抛出遇到的一些题目,本文的内容也从这些问题展开。

  • 介绍 HTTPS 握手过程
  • HTTPS 握手过程中,客户端如何验证证书的合法性 ?
  • 介绍下 HTTPS 中间人攻击
  • 简单讲解一下 http2 的多路复用

基本概念

1. HTTP: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。但HTTP无状态,不加密,传输的数据都是未加密的,可能被窃听;不验证通信方的身份, 因此有可能遭遇伪装。

2. HTTPS: 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS可认证用户和服务器,确保数据发送到正确的客户机和服务器;可防止数据在传输过程中不被窃取、改变,确保数据的完整性。但HTTPS协议需要ca证书,SSL证书,费用较高;握手阶段比较费时(比HTTP慢),缓存不如HTTP高效,会增加数据开销。

3. HTTP2: HTTP2.0大幅度的提高了web性能,在HTTP1.1完全语意兼容的基础上,进一步减少了网络的延迟。实现了低延迟高吞吐量。HTTP2有二进制分帧,首部压缩,流量控制,多路复用,请求优先级,服务器推送等新特性。

下面讲讲之前的题目

1. 介绍 HTTPS 握手过程

在这里插入图片描述

(1)客户端发出请求(ClientHello): 客户端向服务端发起加密通信的请求
(2)服务器回应(SeverHello): 服务器收到客户端请求后,确认加密通信协议版本是否一致,如果版本一致则返回服务器证书,否则关闭加密通信
(3)客户端回应:客户端收到服务器回应后,客户端首先验证证书是否有效。如果证书失效,则会给访问者一个警示,由其决定是否继续连接。如果证书没失效,则使用证书中的公钥加密一个随机数(pre-master key)返回给服务器,同时返回客户端握手结束通知。
(4)服务器的最后回应:服务器收到客户端发来的pre-master key后,计算生成本次会话的“会话密钥”,向客户端发送服务器握手结束通知。 至此, 整个握手阶段结束。接下来,客户端与服务器进入加密通信(对称加密)。握手阶段为非对称加密传输。

下边为更简洁版本解释的握手过程,两者并无差别:

  1. 浏览器 发送随机数 random1 + 支持的加密算法列表 到服务器
  2. 服务器 发送随机数 random2 + 选择的加密算法 + 数字证书(公钥在证书里) + 确认信息 浏览器 验证证书有效性
  3. 浏览器 生成一个随机数 pre-master,采用非对称加密通过服务器的公钥加密发送给服务器,同时根据加密算法将 random1 + random2 +pre-master 生成 master-secret 用于后续数据传输
  4. 服务器 用私钥解密得到 pre-master,根据算法将random1 + random2 + pre-master 生成 master-secret用于数据传输
  5. 对称加密,浏览器和服务器之间使用 master-secret 加密的数据进行通信
2. HTTPS 握手过程中,客户端如何验证证书的合法性 ?
  1. 校验证书的颁发机构是否受客户端信任。
  2. 通过 CRL 或 OCSP 的方式校验证书是否被吊销。
  3. 对比系统时间,校验证书是否在有效期内
  4. 通过校验对方是否存在证书的私钥,判断证书的网站域名是否与证书颁发的域名一致。

首先讲讲证书,证书是权威的证书颁发机构CA颁发。
制作证书: 作为服务端的A,首先把自己的公钥key1发给证书颁发机构,向证书颁发机构进行申请证书;证书颁发机构有一套自己的公私钥,CA通过自己的私钥来加密key1,并且通过服务端网址等信息生成一个证书签名,证书签名同样使用机构的私钥进行加密;制作完成后,机构将证书发给A。
校验证书真伪: 当B向服务端A发起请求通信的时候,A不再直接返回自己的公钥,而是返回一个证书;说明:各大浏览器和操作系统已经维护了所有的权威证书机构的名称和公钥。B只需要知道是哪个权威机构发的证书,使用对应的机构公钥,就可以解密出证书签名;接下来,B使用同样的规则,生成自己的证书签名,如果两个签名是一致的,说明证书是有效的;
签名验证成功后,B就可以再次利用机构的公钥,解密出A的公钥key1;接下来的操作,就是和之前一样的流程了。

3. 介绍下 HTTPS 中间人攻击

在这里插入图片描述
中间人攻击如上图表示的过程,攻击者冒充服务端到客户端的中间者,伪造请求给服务器同时伪造回应给客户端。具体如下:

  1. 服务器向客户端发送公钥。
  2. 攻击者截获公钥,保留在自己手上。
  3. 然后攻击者自己生成一个【伪造的】公钥,发给客户端。
  4. 客户端收到伪造的公钥后,生成加密hash值发给服务器。
  5. 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
  6. 同时生成假的加密hash值,发给服务器。
  7. 服务器用私钥解密获得假秘钥。 服务器用加秘钥加密传输信息

防范方法: 服务端在发送浏览器的公钥中加入CA证书,浏览器可以验证CA证书的有效性

4. 简单讲解一下 http2 的多路复用

HTTP2采用二进制格式传输,取代了HTTP1.x的文本格式,二进制格式解析更高效。
多路复用代替了HTTP1.x的序列和阻塞机制,所有的相同域名请求都通过同一个TCP连接并发完成。在HTTP1.x中,并发多个请求需要多个TCP连接,浏览器为了控制资源会有6-8个TCP连接都限制。HTTP2中同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗。而且单个连接上可以并行交错的请求和响应,之间互不干扰。 HTTP2的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。简单来说, 就是在同一个TCP连接,同一时刻可以传输多个HTTP请求。之前是同一个连接只能用一次, 如果开启了keep-alive,虽然可以用多次,但是同一时刻只能有一个HTTP请求

附录

这边只是通过一些题目讲解了HTTP协议层,如果想跟深入地学习可以参考以下博客,这几篇博客差不多涵盖了所有内容了:
HTTP----HTTP2.0新特性
Https协议详解
HTTPs入门, 图解SSL从回车到握手

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_42672627/article/details/104296324
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-11 20:17:44
  • 阅读 ( 823 )
  • 分类:前端

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢