HTTP和HTTPS

HTTP

图解HTTP:https://blog.csdn.net/zephyr999/article/details/80055420
HTTP1.0、HTTP1.1和HTTP2.0的区别:https://www.jianshu.com/p/be29d679cbff

1.1 HTTP的发送与传输流程

HTTP的发送与传输流程

1.2 各种协议与HTTP协议的关系

各种协议与HTTP协议的关系
1.3 端口号
  • HTTP协议请求的是80端口,HTTPS请求的是443端口
1.4 HTTP是不保存状态的协议
  • 一般只有使用POST方法的请求,有请求体,而GET方法是没有请求体的。
  • HTTP是不保存状态的协议,HTTP 协议自身不具备保存之前发送过的请求或响应的功能。


2. HTTP报文格式

HTTP报文又分为请求报文和响应报文,两者的格式稍有区别。

2.1 请求报文

  • 请求行:方法、URI、协议版本
  • 首部字段:一些键值对
  • 空行
  • 请求体:一般POST方法的参数放在这里,GET方法一般没有请求体
请求报文格式

2.2 响应报文

  • 状态行:协议版本、状态码、原因短句
  • 首部字段:响应的时间、类型等字段
  • 空行
  • 请求体:响应的内容一般放这里
响应报文

HTTPS

1. 你需要提前知道的概念

1.1 对称加密和非对称加密
1.2 公钥和私钥的作用
1.3 数字证书

CA 证书其实就是数字证书,是由 CA 机构颁发的。至于 CA 机构的权威性,那么是毋庸置疑的,所有人都是信任它的。CA 证书内一般会包含以下内容:

  • 证书的颁发机构、版本
  • 证书的使用者
  • 证书的公钥
  • 证书的有效时间
  • 证书的数字签名 Hash 值和签名 Hash 算法

CA 证书中的 Hash 值,其实是用证书的私钥进行加密后的值(证书的私钥不在 CA 证书中)。然后客户端得到证书后,利用证书中的公钥去解密该 Hash 值,得到 Hash-a ;然后再利用证书内的签名 Hash 算法去生成一个 Hash-b 。最后比较 Hash-a 和 Hash-b 这两个的值。如果相等,那么证明了该证书是对的,服务端是可以被信任的;如果不相等,那么就说明该证书是错误的,可能被篡改了,浏览器会给出相关提示,无法建立起 HTTPS 连接。除此之外,还会校验 CA 证书的有效时间和域名匹配等。

2. HTTPS请求的流程如下

HTTPS的流程

2.1 对图上的每一步进行解释

  1. 客户端向服务器发起HTTPS请求
  2. 服务器生成一对公钥和私钥,公钥用来给客户端加密,而自己则用私钥解密。公钥需要放在证书中一起返回给客户端,而私钥是绝对保密的,不会告诉任何人。
  3. 服务器返回一个数字证书CA(CA中包括了一个公钥和证书的其他信息)
  4. 首先,客户端要对数字证书进行验证(具体如何验证后面再讲)。如果验证没通过,则发出警告:这个https请求有危险!如果通过了,客户端会生成一个随机字符串,后面称这个随机字符串为random key(注意:这个random key是用来进行接下来的对称加密操作的!和公钥、私钥的作用不同!),并通过客户端数字证书中的公钥进行一次加密。
  5. 将刚才加密过的random key再次传给服务器。(因为是被公钥加密过的,所以只有拥有私钥的人才能解密!所以这里即使被人拦截到了,别人也不知道用的什么random key!)
  6. 接下来是服务器解密random key的过程,服务器先用私钥解析出服务器传的random key,获得random key后,再把服务器请求的资源(可能是HTML界面,或者请求的数据)用这个random key进行加密。注意:这次加密是对称加密,由于服务器和客户端都知道这个random key,所以他们可以用这个random key进行密文通信!
  7. 服务器将加密好的资源返回给客户端
  8. 客户端进行对称解密,获得资源

3. 为什么要对称和非对称两套加密方法?

  • 一句话总结:为了安全和效率的综合考量。
  • 如果客户端直接使用公钥进行加密,服务端用私钥解密,也能实现通信,而且不怕信息被拦截,但是非对称加密需要大量计算,会占用很多硬件资源,所以效率太低。
  • 所以为了提升效率,非对称加密,只用来传输接下来对称加密所需要的秘钥,再用秘钥进行对称加密,既保证了安全,有提高了效率

4. HTTPS真的安全吗?

既然Https那么安全,那为什么用抓包工具还是可以看到里面的数据。这里需要对抓包过程的原理做一个简单的介绍,抓包,其实就是中间人攻击,在网络请求过程中,抓包工具充当着客户端/服务端的角色,当客户端请求数据时,抓包工具将请求进行拦截,然后构造数据(冒充客户端)向服务端发起请求,此时服务端会返回自己的公钥证书,然后抓包工具将服务端的公钥证书替换成自己的公钥证书,随后将数据返回可客户端(此时充当服务端的角色)。客户端拿到公钥证书后,使用公钥证书中的公钥对Pre-master secret进行加密,并发送给服务端,发送过程中又被抓包工具拦截,由于客户端使用的公钥其实就是抓包工具生成的证书公钥,所以抓包工具只需要使用自己的私钥进行解密即可拿到真实的Pre-master secret(因为抓包工具在之前的过程中已经拿到了双方的随机码,所以到这一步抓包工具相当于已经拿到了后续通信使用的密钥),随后抓包工具使用从服务端接收到的公钥证书中的公钥对Pre-master secret进行加密,然后发送给服务端。随后的通信过程虽然进行了加密,但抓包工具已经生成了密钥(master secret),所以可以查看Https的通信内容。一图以蔽之:

Charles抓包

从抓包的原理可以看出,对Https进行抓包,需要PC端和手机端同时安装证书。
既然这么容易被抓包,那Https会不会显得很鸡肋?其实并不会,能抓包,那是因为你信任抓包工具,手机上安装了与之对应的证书,你要不安装证书,你抓一个试试。而且安全这个课题,是在攻防中求发展,没有最安全,只有更安全,所以将攻击的成本提高了,就间接达到了安全的目标。

4.1 如何对Https进行抓包

这里以Charles4.0为例,对Https进行抓包:

  1. 依次点击菜单Help -> SSL Proxying -> Install Charles Root Certificate安装PC证书;
  2. 依次点击菜单Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Romote Browser, 此时会弹出一个框,提示让你去 chls.pro/ssl 去下载证书,下载完成后进行安装即可
  3. 依次点击菜单Proxy -> SSL Proxying Settings, 选中页面中的Enable SSL Proxying, 然后点击下面的add, 在弹出的框中的Host编辑框中填写. (表示可对所有Https请求进行抓包),端口填写443,点击OK;
  4. 手机设置代理(你的电脑的IP地址,端口默认为8888)即可进行抓包;

链接:https://juejin.im/post/6844903602494898183
作者:Liberuman
来源:掘金

HTTP1.0和HTTP2.0的区别

总的来说区别就是:

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
  • 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。

1. 多路复用和二进制帧

多路复用允许单一的 HTTP/2 连接同时发起多重的请求-响应消息。如下图:


多路复用

从这张图可以看出,请求index.html页面的时候,浏览器会去请求style.css和scripts.js的文件。左边的图是顺序加载两个个文件的,右边则是并行加载两个文件。

3. 主动push

服务器推送

你可能感兴趣的:(HTTP和HTTPS)