HTTPS系列干货(一):HTTPS 原理详解 - 知乎 (zhihu.com)
HTTP 是什么
HTTP 是超文本传输协议
HTTP 与 HTTPS 有哪些区别?
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
HTTPS 是如何保证通信是安全的?
- 混合加密的方式实现信息的机密性,解决了窃听的风险。
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
- 将服务器公钥放入到数字证书中,解决了冒充的风险。
HTTPS 是如何建立连接的?TLS 握手概述?
SSL/TLS 协议基本流程:
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
前两步也就是 TLS 握手阶段。TLS 的「握手阶段」涉及四次通信,使用不同的密钥交换算法,TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA 算法 (opens new window)和 ECDHE 算法 (opens new window)。
基于 RSA 算法的 TLS 握手过程:
ClientHello:
由客户端向服务器发起加密通信请求
客户端主要向服务器发送:
- 协议版本
- 用于 「会话秘钥」条件之一的随机数(
Client Random
) - 密码套件列表
SeverHello:
服务器收到客户端请求后,向客户端发出响应
回应的内容有:
- 确认 TLS 协议版本
- 「会话秘钥」条件之一的随机数(
Server Random
) - 确认的密码套件列表
- 服务器的CA数字证书
客户端回应:
客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。
如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,并发送如下信息:
- 一个随机数(
pre-master key
) - 加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
- 客户端握手结束通知,表示客户端的握手阶段已经结束。 同时把之前所有内容的发生的数据做个摘要,用来供服务端校验。服务器和客户端有了三个随机数(Client Random、Server Random、pre-master key),接着就用双方协商的加密算法,各自生成本次通信的「会话秘钥」。
服务器的最后回应:
服务器收到客户端的第三个随机数(pre-master key
)之后,通过协商的加密算法,计算出本次通信的 「会话秘钥」。
然后,向客户端发送最后的信息:
- 加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
- 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。
整个 TLS 的握手阶段全部结束
户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用 「会话秘钥」 加密内容。
客户端校验数字证书的流程是怎样的?
CA 签发证书的过程,如上图左边部分:
- 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
- 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
- 最后将 Certificate Signature 添加在文件证书上,形成数字证书;
客户端校验服务端的数字证书的过程,如上图右边部分:
- 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
- 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
- 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。
证书信任链的问题
向 CA 申请的证书一般不是根证书签发的,而是由中间证书签发的。这是为了确保根证书的绝对安全性,将根证书隔离地越严格越好,不然根证书如果失守了,那么整个信任链都会有问题。
HTTPS 的应用数据是如何保证完整性的?
TLS 在实现上分为握手协议和记录协议两层:
- TLS 握手协议就是我们前面说的 TLS 四次握手的过程,负责协商加密算法和生成对称密钥,后续用此密钥来保护应用程序数据(即 HTTP 数据);
- TLS 记录协议负责保护应用程序数据并验证其完整性和来源,所以对 HTTP 数据加密是使用记录协议;
TLS 记录协议主要负责消息(HTTP 数据)的压缩,加密及数据的认证
HTTP 常见到版本有 HTTP/1.1,HTTP/2.0,HTTP/3.0,不同版本的 HTTP 特性是不一样的。
HTTP/1.1、HTTP/2、HTTP/3 演变
HTTP/1.1 的优点有哪些?
1.简单: HTTP 基本的报文格式就是 header + body
,头部信息也是 key-value
简单文本的形式。
2.灵活和易于扩展: HTTP 协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充。
同时 HTTP 由于是工作在应用层( OSI
第七层),则它下层可以随意变化,
- 比如:HTTPS 就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层;
- HTTP/1.1 和 HTTP/2.0 传输协议使用的是 TCP 协议,而到了 HTTP/3.0 传输协议改用了 UDP 协议。
HTTP/1.1 的缺点有哪些?
无状态:
无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。
无状态的坏处,既然服务器没有记忆能力,它在完成有关联性的操作时会非常麻烦。
明文传输:不安全
HTTP/1.1 相比 HTTP/1.0 提高了什么性能?
- 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
但 HTTP/1.1 还是有性能瓶颈:
- 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩
Body
的部分; - 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
- 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
- 没有请求优先级控制;
- 请求只能从客户端开始,服务器只能被动响应。
HTTP/2 做了什么优化?
1.头部压缩
如果同时发出多个请求,他们的头部是一样的或是相似的,那么,协议会帮你消除重复的部分。
2.二进制格式
全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame),这增加了数据传输的效率。
3.并发传输
充分利用了 TCP连接, 实现并行交错地发送请求和响应。
针对不同的 HTTP 请求用唯一的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应。
4.服务器主动推送资源
HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务端不再是被动地响应,可以主动向客户端发送消息。
HTTP/2 有什么缺陷?
todo
HTTP/3
- 基于QUIC协议:
- HTTP/3 是基于 QUIC(Quick UDP Internet Connections)协议的。QUIC 是一个基于 UDP 的协议,旨在提供更低的连接建立延迟和更好的性能,特别是在不稳定的网络环境中。
- 多路复用:
- HTTP/3 支持多路复用,这意味着它允许在单个连接上同时传输多个请求和响应,而无需按顺序等待。这有助于减少网络延迟,提高性能。
- 头部压缩:
- 类似于 HTTP/2,HTTP/3 也支持头部压缩,以减小传输的数据量。这有助于减少网络带宽的使用。
- 0-RTT支持:
- HTTP/3 支持 0-RTT(Zero Round Trip Time)连接,允许客户端在不进行完整握手的情况下发送数据。这有助于降低连接建立的延迟。
- 更好的流量控制:
- HTTP/3 提供了更先进的流量控制机制,以更有效地管理数据流的传输,避免过度拥塞。
- 更好的安全性:
- HTTP/3 的底层协议 QUIC 具有内置的加密,因此提供更好的安全性。这有助于防止一些传统的网络攻击,如中间人攻击。
- 适应性:
- HTTP/3 的设计考虑了现代网络环境的特点,例如移动网络和不稳定的连接,以提供更好的适应性。
- 部署挑战:
- 尽管 HTTP/3 带来了许多优势,但由于其基于 QUIC,需要底层支持 QUIC 的网络基础设施。这也导致了在全球范围内广泛部署 HTTP/3 的一些挑战。
总体而言,HTTP/3 通过引入 QUIC 协议,支持多路复用、头部压缩、0-RTT连接等特性,旨在提供更快、更安全的 Web 数据传输体验。