# 什么是 HTTPS
HTTPS(全称:Hyper Text Transfer Protocol Secure)是 HTTP(Hyper Text Transfer Protocol)的安全版本。它在 HTTP 的基础上通过 SSL/TLS 协议提供了数据加密、数据完整性和认证。
# HTTP 和 HTTPS 的区别
1. 加密
HTTP:数据以明⽂形式传输,没有加密,容易被窃听和篡改。
HTTPS:所有数据传输都经过加密,保护数据不被窃听和篡改。
2. 端⼝
HTTP:默认使⽤端⼝ 80。
HTTPS:默认使⽤端⼝ 443。
3. URL 前缀
HTTP:URL 以 http:// 开头。
HTTPS:URL 以 https:// 开头。
4. 安全证书
HTTP:不需要安全证书。
HTTPS:需要 SSL/TLS 证书来建⽴安全连接。
# 为什么 HTTPS ⽐ HTTP 安全
1. 加密通信
HTTPS 使⽤ SSL/TLS 协议对数据进⾏加密,即使数据被截获,也⽆法轻易解读其内容。
2. 数据完整性
HTTPS 可以验证数据在传输过程中是否被篡改,确保数据的完整性。
3. 认证
HTTPS 提供了⼀种⽅式来验证⽹站的身份,减少了遭受 “中间⼈攻击” 的⻛险。⽤户可以通过查看证书来确认⽹站的真实性。
# 如何配置 HTTPS
1. 获取 SSL/TLS 证书
可以从证书颁发机构(CA)购买,或者通过 Let's Encrypt 等服务免费获得。
2. 安装和配置证书
在服务器上安装 SSL/TLS 证书,并配置你的 Web 服务器(如 Apache、Nginx)使⽤这个证书。
3. 配置服务器
修改 Web 服务器的配置,以启⽤ SSL/TLS 加密。
确保服务器配置了正确的端⼝(通常是 443)。
4. 重定向 HTTP 到 HTTPS
配置 Web 服务器,将所有 HTTP 流量重定向到 HTTPS,确保所有请求都经过加密。
5. 测试配置
使⽤在线⼯具检查你的 HTTPS 配置,确保它安全且有效。
6. 保持更新
定期更新你的 SSL/TLS 证书,以及服务器上的加密和安全配置。
# HTTPS 获取加密秘钥的过程
HTTPS 获取加密密钥的过程是通过 TLS(传输层安全性)或 SSL(安全套接层)协议实现的。这个过程涉及到客户端和服务器之间的⼏个步骤,主要⽬的是安全地协商出⼀个共享的秘密密钥,⽤于后续通信的加密。
# 1. 客户端问候(Client Hello)
客户端发起:客户端发送⼀个 “Client Hello” 消息给服务器,包括客户端⽀持的 TLS 版本、⽀持的加密套件列表、⼀个随机数(Client Random),以及其他必要的 TLS 参数。
# 2. 服务器响应(Server Hello)
服务器选择参数:服务器回复 “Server Hello” 消息,选择了客户端提出的参数中的⼀套进⾏使⽤,包括 TLS 版本和加密套件。同时,服务器也⽣成⼀个随机数(Server Random)。
证书和密钥交换:服务器发送其数字证书给客户端。对于某些密钥交换算法(如 RSA),证书中包含了服务器的公钥。
# 3. 服务器密钥交换
⽣成预备主密钥:对于使⽤ RSA 的情况,客户端⽣成⼀个预备主密钥(Pre-Master Secret),并使⽤服务器的公钥加密后发送给服务器。对于使⽤ Diffie-Hellman 等密钥交换⽅法的情况,双⽅协商出预备主密钥。
# 4. ⽣成会话密钥
客户端和服务器⽣成会话密钥:客户端和服务器使⽤之前交换的信息(包括 Client Random、Server Random 和 Pre-Master Secret)⽣成会话密钥(Session Key)。这个过程在客户端和服务器各⾃独⽴完成。
# 5. 完成握⼿
客户端完成消息:客户端发送⼀个 “Finished” 消息,该消息是⽤会话密钥加密的,包括之前握⼿消息的校验码。
服务器完成消息:服务器发送⼀个加密的 “Finished” 消息,客户端验证此消息,确保握⼿过程的完整性和安全性。
# 6. 加密通信
使⽤会话密钥加密:握⼿完成后,客户端和服务器使⽤会话密钥对通信进⾏加密。
这个过程确保了客户端和服务器之间的密钥交换既安全⼜⾼效。即使攻击者可以截获这些消息,由于他们⽆法访问到预备主密钥和会话密钥,因此⽆法解密通信内容。
# SSL/TLS 协议
传输层安全性协议(Transport Layer Security,TLS),及其前身安全套接层(Secure Sockets Layer,SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
HTTPS 协议的安全性由 SSL 协议实现,当前使用的 TLS 协议 1.2 版本包含了四个核心子协议:握手协议、密钥配置切换协议、应用数据协议及报警协议。
在七层结构中,SSL/TLS 协议位于会话层,而在四层结构中,SSL/TLS 协议位于应用层和传输层之间,是跨层的。
TLS 适用于对称密钥,对称密钥可以通过安全密钥交换算法共享。如果请求被截获,密钥交换可能会被欺骗,TLS 使用数字签名进行身份验证,证书颁发机构和信任链。
HTTPS 协议、SSL 协议、TLS 协议、握手协议的关系
HTTPS 是基于 SSL 的 HTTP 协议。HTTPS 协议的安全是由 SSL 协议实现的。
SSL 协议是一种记录协议,扩展性良好,可以很方便的添加子协议。
握手协议是 SSL 协议的一个子协议。
TLS 协议是 SSL 协议的后续版本,当前涉及的 SSL 协议默认是 TLS 协议 1.2 版本。
# HTTPS 协议分析
TLS 握手的步骤:
ClientHello:客户端发送所支持的 SSL/TLS 最高协议版本号和所支持的加密算法集合及压缩方法集合等信息给服务器端。
ServerHello:服务器端收到客户端信息后,选定双方都能够支持的 SSL/TLS 协议版本和加密方法及压缩方法,返回给客户端。
SendCertificate(可选):服务器端发送服务端证书给客户端。
RequestCertificate(可选):如果选择双向验证,服务器端向客户端请求客户端证书。
ServerHelloDone:服务器端通知客户端初始协商结束。
ResponseCertificate(可选):如果选择双向验证,客户端向服务器端发送客户端证书。
ClientKeyExchange:客户端使用服务器端的公钥,对客户端公钥和密钥种子进行加密,再发送给服务器端。
CertificateVerify(可选):如果选择双向验证,客户端用本地私钥生成数字签名,并发送给服务器端,让其通过收到的客户端公钥进行身份验证。
CreateSecretKey:通讯双方基于密钥种子等信息生成通讯密钥。
ChangeCipherSpec:客户端通知服务器端已将通讯方式切换到加密模式。
Finished:客户端做好加密通讯的准备。
ChangeCipherSpec:服务器端通知客户端已将通讯方式切换到加密模式。
Finished:服务器做好加密通讯的准备。
Encrypted/DecryptedData:双方使用客户端密钥,通过对称加密算法对通讯内容进行加密。
ClosedConnection:通讯结束后,任何一方发出断开 SSL 连接的消息。
两个需要留意的问题
必须先建立 TCP 连接,服务器才能传证书,在建立 TCP 连接之前,服务器得知道 IP 地址,那么就得先进行 DNS 解析。因此,证书是在 DNS 解析和 TCP 连接建立完成之后获得的。
TCP 3 次握手先于 HTTPS 握手。
# HTTP2 协议分析
HTTP/2.0 没有改动 HTTP 的应用语义。HTTP 方法、状态代码、URI 和标 头字段等核心概念一如往常。
HTTP/2.0 修改了数据格式化(分帧)以及在客户端与服务器之间传输的方式。这两点统帅全局,通过新的分帧层向我们的应用隐藏了所有复杂性。
由于 HTTP/2.0 引入了一个新的二进制分帧层,该层无法与之前的 HTTP/1.x 服务器和客户端向后兼容,因此协议的主版本提升到 HTTP/2.0。
HTTP/2.0 的特点
使用二进制格式传输,更高效、更紧凑。
对报头压缩,降低开销。
多路复用,一个网络连接实现并行请求。
服务器主动推送,减少请求延迟。
默认使用加密。
- HTTP/2.0 二进制分帧层
HTTP/2.0 所有性能增强的核心在于新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输。
这里所谓的 “层” 指的是位于套接字接口与应用可见的高级 HTTP API 之间一个经过优化的新编码机制。
HTTP/1.x 协议以换行符作为纯文本的分隔符,而 HTTP/2.0 将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们编码。
客户端和服务器会替我们完成必要的分帧工作。
6. HTTP/2.0 多路复用
在 HTTP/1.x 中,如果客户端要想发起多个并行请求以提升性能,则必须使用多个 TCP 连接。这种模型也会导致队首阻塞,从而造成底层 TCP 连接的效率低下。
将 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装是 HTTP/2.0 最重要的一项增强。这个机制会在整个网络技术栈中引发一系列连锁反应,从而带来巨大的性能提升。
(1)并行交错地发送多个请求,请求之间互不影响。
(2)并行交错地发送多个响应,响应之间互不干扰。
(3)使用一个连接并行发送多个请求和响应。
(4)不必再为绕过 HTTP/1.x 限制而做很多工作。
(5)消除不必要的延迟和提高现有网络容量的利用率,从而减少页面加载时间。
服务器是属于 IO 密集型的,所以它的压力主要在于 I/O 开销。HTTP 连接越多,服务器的压力越大。
# HTTP2 如何确保⽂件同时传输不会报错
多路复⽤:HTTP/2 的多路复⽤允许在单个 TCP 连接上同时发送多个请求和响应。每个请求或响应都分成帧,并在同⼀个连接上交错发送,从⽽提⾼了效率。
帧排序和流控制:HTTP/2 中的数据传输是以帧为单位进⾏的。每个帧都属于某个特定的流,并且有⼀个独⽴的流标识符。这样可以确保即使在并⾏传输的情况下,帧的顺序和完整性也得到了保障。
错误检测和重传机制:虽然 HTTP/2 本身不直接处理错误检测和重传(这是 TCP 层⾯的职责),但它通过流控制和优先级机制确保了资源的有效管理,减少了因资源竞争和⽹络条件变化导致的错误。
# HTTP2 服务器推送
HTTP/2.0 新增的另一个强大的新功能是,服务器可以对一个客户端请求发送多个响应。 换句话说,除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端明确地请求。
HTTP/2.0 打破了严格的请求-响应语义,支持一对多和服务器发起的推送工作流。
服务器已经知道客户端下一步要请求什么资源,这时候服务器推送即可派上用场。
推送资源可以进行以下处理.
由客户端缓存。
在不同页面之间重用(只要多个页面在同一个域下,websocket 就做不到这点,它只能在当前页面复用)。
与其他资源一起复用。
由服务器设定优先级。
被客户端拒绝。
# HTTP2 伪头字段
- 伪头部字段是 HTTP/2.0 内置的几个特殊的以
:
开始的 key,用于替代 HTTP/1.x 中请求行/响应行中的信息,比如请求方法,响应状态码等。
:method
:目标 URL 模式部分(请求):scheme
:目标 URL 模式部分(请求):authority
:目标 URL 认证部分(请求):path
:目标URL的路径和查询部分(绝对路径产生式和一个跟着 "?" 字符的查询产生式)。(请求):status
:响应头中的HTTP状态码部分(响应)
比如,腾讯课堂 (opens new window)用的就是 HTTP2。
要想使用 HTTP2,得用专门的服务器。
# 了解 HTTP3
运行在 QUIC (opens new window) 之上的 HTTP 协议被称为 HTTP/3.0(HTTP-over-QUIC)。
QUIC 协议(Quick UDP Internet Connection)基于 UDP,正是看中了 UDP 的速度与效率。同时 QUIC 也整合了 TCP、TLS 和 HTTP/2 的优点,并加以优化。
特点
减少了握手的延迟(1-RTT 或 0-RTT)。
多路复用,并且没有 TCP 的阻塞问题。
连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开。
HTTP/3.0 与 HTTP/1.1 和 HTTP/2.0 没有直接的关系,也不是 HTTP/2.0 的扩展。
HTTP/3.0 将会是一个全新的 WEB 协议。
HTTP/3.0 目前处于制订和测试阶段。
HTTP/1.x 和 HTTP/2.0 发送和接收数据包的时候,是需要严格按照包序号的顺序来传输的,但是 HTTP/3.0 并不在乎包的序号,它只在乎接收到的包数量齐全了吗,缺少的包再让服务器重发。
HTTP/3.0 在移动网络上有非常大的优势。
注意
HTTP/2.0 会向前兼容 1.0 和 1.1,但是 HTTP/3.0 并不向前兼容,它是全新的。
# 队首阻塞问题
HTTP/1.1 和 HTTP/2.0 都存在队头阻塞问题(Head of line blocking)。
HTTP/1.1 的队头阻塞
一个 TCP 连接同时传输 10 个请求,其中第 1、2、3 个请求已被客户端接收,但第 4 个请求丢失,那么后面第 5 - 10 个请求都被阻塞,需要等第 4 个请求处理完毕才能被处理,这样就浪费了带宽资源。
HTTP/2.0 的多路复用虽然可以解决 “请求” 这个粒度的阻塞,但 HTTP/2.0 的基础 TCP 协议本身却也存在着队头阻塞的问题。
由于 HTTP/2.0 必须使用 HTTPS,而 HTTPS 使用的 TLS 协议也存在队头阻塞问题。
队头阻塞会导致 HTTP/2.0 在更容易丢包的弱网络环境下比 HTTP/1.1 更慢。
QUIC 解决队头阻塞问题的的方法如下:
QUIC 的传输单元是 Packet,加密单元也是 Packet,整个加密、传输、解密都基于 Packet,这样就能避免 TLS 的队头阻塞问题;
QUIC 基于 UDP,UDP 的数据包在接收端没有处理顺序,即使中间丢失一个包,也不会阻塞整条连接,其他的资源会被正常处理。
# HTTP1、HTTP2、HTTP3 的区别
HTTP/1.1、HTTP/2 和 HTTP/3 是 HTTP 协议的三个主要版本,它们在性能和功能上有显著的区别:
1. HTTP/1.1
⽆并⾏请求:HTTP/1.1 不⽀持⼀个 TCP 连接上的多个并⾏请求。虽然可以通过多个连接实现并⾏,但这增加了延迟和资源消耗。
头部未压缩:HTTP/1.1 的头部没有压缩,这可能导致不必要的数据传输,尤其是在头部信息冗⻓的情况下。
顺序和阻塞:HTTP/1.1 存在 “队头阻塞” 问题,即前⼀个请求的延迟会影响后续请求的处理。
2. HTTP/2
多路复⽤:HTTP/2 引⼊了多路复⽤,允许在单个 TCP 连接上并⾏传输多个请求和响应,极⼤提⾼了效率和⻚⾯加载速度。
头部压缩:HTTP/2 使⽤ HPACK 压缩算法压缩头部信息,减少了传输的数据量。
服务器推送:HTTP/2 ⽀持服务器推送技术,服务器可以主动发送客户端可能需要的资源,减少了往返延迟。
优先级和流控制:HTTP/2 允许设置请求的优先级,并进⾏流控制,有效管理带宽和服务器资源。
3. HTTP/3
基于 QUIC 协议:HTTP/3 是在新的 QUIC 传输协议之上构建的,⽽ QUIC 是基于 UDP 的,不同于前两者基于 TCP。
更快的连接建⽴和恢复:QUIC 减少了连接建⽴的延迟,特别是在丢包情况下的性能更优。
内置加密:QUIC 包含了 TLS 加密,提供了更好的安全性。
改进的阻塞控制:HTTP/3 通过 QUIC 改进了阻塞控制,减少了队头阻塞问题。