后端开发日记 - HTTP 和 HTTPS 协议

说明:本文章非原创,转载自 HTTP 和 HTTPS 协议,看一篇就够了_不一样的博客 - CSDN 博客

HTTP 和 HTTPS 发展历史

什么是 HTTP

超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于 TCP/IP 协议传输数据,互联网上应用最为广泛的一种网络协议, 所有的 WWW 文件都必须遵守这个标准。设计 HTTP 的初衷是为了提供一种发布和接收 HTML 页面的方法。

HTTP 发展历史

版本 产生时间 内容 发展现状
HTTP/0.9 1991 年 不涉及数据包传输,规定客户端和服务器之间通信格式,只能 GET 请求 没有作为正式的标准
HTTP/1.0 1996 年 传输内容格式不限制,增加 PUT、PATCH、HEAD、 OPTIONS、DELETE 命令 正式作为标准
HTTP/1.1 1997 年 持久连接 (长连接)、节约带宽、HOST 域、管道机制、分块传输编码 2015 年前使用最广泛
HTTP/2 2015 年 多路复用、服务器推送、头信息压缩、二进制协议等 逐渐覆盖市场

多路复用:通过单一的 HTTP/2 连接请求发起多重的请求 - 响应消息,多个请求 stream 共享一个 TCP 连接,实现多留并行而不是依赖建立多个 TCP 连接。

HTTP 报文格式

HTTP 报文格式

什么是 HTTPS

《图解 HTTP》这本书中曾提过 HTTPS 是身披 SSL 外壳的 HTTP。HTTPS 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用 SSL/TLS 建立全信道,加密数据包。HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。 PS:TLS 是传输层加密协议,前身是 SSL 协议,由网景公司 1995 年发布,有时候两者不区分。

参考链接

  1. https://kamranahmed.info/blog/2016/08/13/http-in-depth/
  2. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
  3. https://tools.ietf.org/html/rfc1945
  4. https://http2.github.io/http2-spec/
  5. https://www.zhihu.com/question/34074946

HTTP VS HTTPS

HTTP 特点

  1. 无状态:协议对客户端没有状态存储,对事物处理没有 “记忆” 能力,比如访问一个网站需要反复进行登录操作
  2. 无连接:HTTP/1.1 之前,由于无状态特点,每次请求需要通过 TCP 三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
  3. 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
  4. 简单快速、灵活
  5. 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

HTTPS 特点

基于 HTTP 协议,通过 SSL 或 TLS 提供加密处理数据、验证对方身份以及数据完整性保护,通过抓包可以看到数据不是明文传输,而且 HTTPS 有如下特点:

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

通过 HTTPS 可以实现以下目的:

  • 收方能够证实发送方的真实身份
  • 发送方事后不能否认所发送过的报文
  • 收方或非法者不能伪造、篡改报文

HTTPS 实现原理

SSL 建立连接过程

SSL 建立连接过程
  1. Client 向 Server 发送请求 https://baidu.com,连接到 Server 的 443 端口,发送的信息主要是 Random1 和客户端支持的加密算法。
  2. Server 接收到信息之后给予 Client 响应握手信息,包括 Random2 和匹配好的协商加密算法,这个加密算法一定是 Client 发送给 Server 加密算法的子集。
  3. 随即 Server 给 Client 发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构 (CA) 的签名,服务端的域名信息等内容。
  4. 客户端解析证书,这部分工作是由客户端的 TLS 来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值(预主秘钥)。
  5. 客户端认证证书通过之后,接下来是通过 Random1、Random2 和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥。
  6. 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到 Random1、Random2 和预主秘钥。
  7. 服务端解密得到 Random1、Random2 和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。
  8. 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。
  9. 同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明 SSL 层连接建立完成了。

验证证书安全性过程

当客户端收到这个证书之后,使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名,数字签名经过 CA 公钥解密得到证书信息摘要。

然后证书签名的方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。因为中间人虽然有权威机构的公钥,能够解析证书内容并篡改,但是篡改完成之后中间人需要将证书重新加密,但是中间人没有权威机构的私钥,无法加密,强行加密只会导致客户端无法解密,如果中间人强行乱修改证书,就会导致证书内容和证书签名不匹配。

运用和总结

安全性

  1. HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用
  2. SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行

中间人攻击(MITM 攻击)是指,黑客拦截并篡改网络中的通信数据。又分为被动 MITM 和主动 MITM,被动 MITM 只窃取通信数据而不修改,而主动 MITM 不但能窃取数据,还会篡改通信数据。最常见的中间人攻击常常发生在公共 wifi 或者公共路由上。

成本

  1. SSL 证书需要购买申请,功能越强大的证书费用越高
  2. SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗(SSL 有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP 就不支持这个扩展,考虑到 XP 的装机量,这个特性几乎没用)。
  3. 根据 ACM CoNEXT 数据显示,使用 HTTPS 协议会使页面的加载时间延长近 50%,增加 10% 到 20% 的耗电。
  4. HTTPS 连接缓存不如 HTTP 高效,流量成本高。
  5. HTTPS 连接服务器端资源占用高很多,支持访客多的网站需要投入更大的成本。
  6. HTTPS 协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。比较好的方式是采用分而治之,类似 12306 网站的主页使用 HTTP 协议,有关于用户信息等方面使用 HTTPS。