HTTP && HTTPS

注意:本篇文章均基于 HTTP/1.1 的基础上讨论

HTTP/1.1 优点

简单:HTTP 报文的格式就是 Header + Body,消息头是 key-value 的形式,易于理解

灵活易扩展:HTTP 位于应用层,可以在应用层和传输层中间添加其它层来实现不一样的功能。HTTPS 就是在 HTTP 和 TCP 之间加了 SSL/TLS 安全传输层

跨平台性:不仅 PC 端,手机端也可以直接使用 HTTP 协议,具有天然的跨平台性

HTTP/1.1 缺点

无状态:好处在于 HTTP 不需要去记录状态,减轻服务器负担;坏处在于关联请求处理起来非常麻烦,比如一些请求需要依赖于前面请求的状态,为此增加了 Cookie 技术

明文传输:好处在于 HTTP 报文便于阅读;坏处在于安全性极低,可以通过抓包等工具非法获取请求报文中的信息

安全性低:通过明文传输存在窃听的风险;无身份验证存在伪装的风险;无完整性验证存在篡改的风险

HTTP/1.1 性能

HTTP 基于 TCP/IP,使用「请求-响应」的通信模式,性能的关键就在这两个过程中

长连接

在 HTTP/1.0 中是短连接,每一次「请求-响应」都需要三次握手建立连接以及四次挥手断开连接

在 HTTP/1.1 中变成了长连接,也就是客户端和服务端建立连接后,直到客户端主动断开连接或长时间没有数据交互,在连接期间可以有多个「请求-响应」,减少了重复建立连接的开销

下面给出两种通信方式的过程:

4

管道网络传输

虽然长连接避免了重复建立连接,但依旧只能同步的发送请求和返回响应。HTTP/1.1 中的管道网络传输类似于异步的发送请求,不需要等待响应结果的返回就可以继续发送下一条请求,过程如下:

5

这里给出两个概念

可以看出管道网络传输虽然解决了请求的队头阻塞,但依旧存在响应的队头阻塞

注意:实际上 HTTP/1.1 默认并没有开启管道网络传输技术,而且浏览器基本都没有支持该功能!!

HTTP 和 HTTPS 的区别

安全性:HTTP 是明文传输,存在安全风险;HTTPS 是加密传输,在 HTTP 和 TCP 之间增加了 SSL/TLS 安全协议

建立连接:HTTP 三次握手后就可以开始传输报文;HTTPS 在三次握手后还需要进行 SSL/TLS 握手过程,保证传输的安全性

默认端口:HTTP 默认端口 80;HTTPS 默认端口 443

数字证书:HTTP 不需要数字证书;HTTPS 为了保证安全性需要先向 CA 机构申请数字证书,验证服务器的身份

HTTPS 加密实现

在介绍 HTTP 安全性时,提到了三个问题:

HTTPS 通过在 HTTP 和 TCP 之间增加 SSL/TLS 安全协议来解决上述三个问题,结构如下图所示:

6

更具体的,针对上面三个问题有以下解决方案:

混合加密

首先给出两个概念

非对称加密的两种不同加解密方式适用于不同的场景:

HTTPS 使用对称加密和非对称加密结合的方式 (混合加密):

如下图所示;

7

摘要算法➕数字签名

为了保证报文不被篡改,可以通过摘要算法计算出一个哈希值,然后将哈希值和报文一同发送到服务器,服务器再次对报文执行摘要算法,如果两次哈希值不同表示报文被篡改,如下图所示:

8

仅仅通过摘要算法将「内容 + 哈希值」一起发送并不能判断一定没有被篡改,如果内容和哈希值一起被篡改,那么最后比较的时候也是相同滴!!

所以我们可以使用非对称加密,用私钥加密哈希值,然后接收方通过公钥解密哈希值,最后判断内容是否被篡改,如下图所示:

9

数字证书

为了防止其它人冒充服务器,需要对服务器的身份进行验证,每次通信前服务器都会将自己的公钥发送给客户端,那么如何判断该公钥就一定是请求服务器的公钥呢?

这里需要引入一个 CA 机构,它负责管理所有服务器的公钥,每个服务器都会把自己的公钥注册到 CA 机构中并生成数字证书,可认为 CA 机构中的公钥一定是合法滴

CA 机构会使用自己的私钥对服务器的公钥进行加密,服务器通信前会将数字证书发送给客户端,客户端获得数字证书后使用 CA 的公钥解密获得服务器公钥,如下图所示:

10

HTTPS 建立连接过程

SSL/TLS 协议的基本流程:

前两步是 SSL/TLS 建立连接的过程,也被称为 TLS 握手阶段,主要涉及四次通信,使用不同的密钥交换算法,TLS 握手流程也会不一样,常用的密钥交换算法有:RSA 算法和 ECDHE 算法

基于 RSA 算法的 TLS 握手过程比较便于理解,所以先介绍它,流程如下图所示:

11

TLS 协议建立连接详细流程:

至此,TLS 四次握手过程结束,后续的通信使用握手过程中生成的会话密钥加密报文

问题:HTTPS 一定可靠吗?

模拟一种场景:客户端和中间服务器通信,中间服务器和目标服务器通信,中间服务器充当一个中间人的作用,从而可以窃取客户端的报文

客户端要和中间服务器通信,中间服务器必须向客户端发送自己的数字证书,此时客户端可以感知到中间服务器,浏览器会提示证书存在问题,用户可以手动选择是否信任该网站

所以从严格意义上来说,HTTPS 一定可靠,导致可能出现信息泄漏的风险是人为选择信任了中间服务器