一个Https请求的过程详细解读
好的!下面我们将从 底层原理出发,详细讲解一个 HTTPS 请求的完整过程,涵盖从客户端发起请求,到最终获得响应的每一个关键步骤,包括涉及的协议、加密技术、握手流程等,并在最后提供一个清晰的 时序图(Sequence Diagram) 来直观展示整个过程。
一、什么是 HTTPS?
HTTPS(HyperText Transfer Protocol Secure) 是 HTTP 的安全版本,它在 HTTP 和 TCP 之间加了一层 TLS/SSL 协议,用来对通信内容进行 加密、身份认证和数据完整性保护。
- HTTP:明文传输,不安全。
- HTTPS = HTTP + TLS/SSL(加密层),安全可靠。
TLS(Transport Layer Security)是 SSL(Secure Sockets Layer)的升级版本,目前广泛使用的是 TLS 1.2 和 TLS 1.3。
二、HTTPS 请求的底层原理和流程
一个完整的 HTTPS 请求过程可以分为以下几个核心阶段:
- DNS 解析
- TCP 三次握手
- TLS/SSL 四次握手(核心安全环节)
- HTTP 请求与响应(加密通道已建立)
- 连接关闭(可选的 TLS 四次挥手)
下面我们逐步详细讲解每个阶段。
阶段 1:DNS 解析(Domain Name System)
目标: 将域名(如 www.example.com
)解析为对应的 IP 地址(如 93.184.216.34
)。
- 客户端首先检查本地的 hosts 文件 和 DNS 缓存;
- 如果没有找到,就向 配置的 DNS 服务器 发出查询请求;
- DNS 服务器返回目标域名的 IP 地址 给客户端;
🧠 这一步是 明文 的,但与 HTTPS 的安全性无直接关系,属于网络定位的基础步骤。
阶段 2:TCP 三次握手(建立可靠连接)
客户端通过解析得到的 IP 和默认的 443 端口(HTTPS),与服务器建立 TCP 连接。
TCP 三次握手过程:
- 客户端 → 服务器:发送
SYN
包(同步序列号),表示请求建立连接。 - 服务器 → 客户端:回复
SYN-ACK
包,表示收到请求并同意建立连接。 - 客户端 → 服务器:发送
ACK
包,连接建立成功。
✅ 此时,客户端和服务器之间建立起了一条可靠的、有序的、基于字节流的 TCP 连接,但数据还是明文的(还没加密)。
阶段 3:TLS/SSL 四次握手(关键安全环节 🔐)
这是 HTTPS 的核心部分,目的是在不安全的网络上协商出一个 安全的加密通信通道。
TLS 握手的主要任务包括:
- 验证服务器身份(通过数字证书)
- 协商加密算法和密钥
- 生成会话密钥(用于对称加密通信)
- 建立安全上下文
TLS 1.2 和 TLS 1.3 的握手过程略有不同,下面以 TLS 1.2(更通用,便于理解) 为例详细讲解。
🔐 TLS 1.2 四次握手详细过程
目标:协商加密套件、验证身份、交换密钥,最终建立对称加密通信通道。
第一步:Client Hello(客户端 → 服务器)
客户端向服务器发送:
- 支持的 TLS 版本(如 TLS 1.2)
- 支持的 加密套件列表(如 RSA + AES + SHA256)
- 一个随机数 Client Random
- (可选)支持的压缩方法、SNI(Server Name Indication,用于虚拟主机)
🎯 SNI 很重要,它告诉服务器:“我要访问哪个域名”,因为一台服务器可能托管多个 HTTPS 站点。
第二步:Server Hello(服务器 → 客户端)
服务器回应:
- 选择的 TLS 版本
- 选择的 加密套件(如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
- 一个随机数 Server Random
- 服务器的 数字证书(含公钥)
- (可选)服务器的 公钥参数(如 ECDHE 的参数)
- (可选)Server Hello Done 标志
📌 数字证书 包含:
- 服务器域名
- 服务器公钥
- 证书颁发机构(CA)信息
- 有效期等
它用于证明“我是真正的 www.example.com”。
第三步:客户端验证证书 + 密钥交换
客户端收到证书后:
-
验证证书是否可信:
- 检查证书是否过期
- 是否由受信任的 CA 签发
- 证书链是否完整
- 域名是否匹配
✅ 通常通过操作系统的 CA 根证书库,或浏览器内置的信任库验证。
-
生成一个随机数 Pre-Master Secret,并用服务器的 公钥(来自证书)加密,发送给服务器。
-
生成会话密钥(Master Secret / Session Key):
- 客户端和服务器都有:Client Random、Server Random、Pre-Master Secret
- 利用密钥导出函数(PRF)生成相同的 对称加密密钥,用于后续通信。
🔑 从此之后,通信使用 对称加密(如 AES),因为对称加密性能更高。
第四步:Server Final(服务器 → 客户端)
服务器:
- 用自己的 私钥 解密得到 Pre-Master Secret
- 根据 Client Random、Server Random、Pre-Master Secret,生成相同的会话密钥
- 可能发送一个 Finished 消息,表示握手完成
客户端也发送 Finished 消息
✅ 至此,TLS 握手完成!双方已经协商好加密算法和密钥,接下来所有 HTTP 数据都会被加密传输。
阶段 4:加密的 HTTP 通信
一旦 TLS 握手完成,客户端和服务器之间的通信就处于 加密的安全通道 中。
此时,客户端通过该加密连接发送 HTTP 请求(如 GET /index.html),服务器返回 HTTP 响应(如 HTML 页面、JSON 数据等)。
🔒 所有 HTTP 内容都经过对称加密(如 AES),即使被中间人截获,也无法解密内容。
阶段 5:连接关闭(可选)
- 可以使用 TCP 四次挥手 关闭连接;
- 也可以复用连接(HTTP Keep-Alive),减少握手开销;
- 如果使用 TLS 1.3,握手过程更快更安全(后面会提到)。
三、TLS 1.3 握手(更简洁、更安全 ⚡)
TLS 1.3 是 TLS 1.2 的升级版,大幅简化了握手过程,只需要 1-RTT(一次往返)即可完成握手,并且 剔除了不安全的加密算法。
简要流程:
- Client Hello:包含支持的加密套件 + 一个随机数 + “密钥分享”参数(如 DH 参数)
- Server Hello:选择加密套件 + 随机数 + 证书 + 会话密钥相关参数
- 客户端验证证书 + 计算密钥,然后直接发送加密的 HTTP 请求
✅ TLS 1.3 通常只需要 1 次往返(1-RTT),甚至在某些情况下支持 0-RTT(但有安全风险)。
四、HTTPS 请求的完整时序图(Sequence Diagram)
下面是使用 Mermaid 语法绘制的时序图,展示了从客户端发起 HTTPS 请求,到最终获得响应的完整交互过程,重点突出 TLS 握手。
五、总结:HTTPS 请求的底层流程一览表
步骤 | 阶段 | 协议/技术 | 作用 |
---|---|---|---|
1 | 域名解析 | DNS | 将域名转为 IP 地址 |
2 | 建立连接 | TCP | 三次握手,建立可靠传输通道 |
3 | 安全握手 | TLS/SSL | 协商加密算法、验证身份、交换密钥,建立加密通道 |
4 | 加密通信 | HTTP over TLS | 所有 HTTP 数据通过加密通道传输 |
5 | 连接关闭 | TCP | 可选的连接终止过程 |
六、补充:为什么需要 HTTPS?
问题 | HTTP 的缺陷 | HTTPS 的解决 |
---|---|---|
窃听 | 数据明文传输,容易被窃听 | 数据加密,防止中间人监听 |
篡改 | 数据可被篡改 | 数据完整性校验(MAC / Hash) |
伪装 | 无法确认对方身份 | 数字证书验证服务器身份 |
会话劫持 | Cookie 等敏感信息易被盗 | 加密保护 + 安全 Cookie 策略 |
七、延伸知识(可选深入学习)
- 数字证书的签发与信任链
- RSA / ECC / DH 密钥交换算法原理
- TLS 1.3 的 1-RTT / 0-RTT 握手优化
- HTTP/2 或 HTTP/3 over HTTPS
- 如何配置 Nginx 的 HTTPS(包括证书部署、强制跳转、HSTS 等)
✅ 总结一句话:
一个 HTTPS 请求的本质,就是在 TCP 连接之上,通过 TLS 协议建立一个加密的安全通道,确保数据传输的保密性、完整性与真实性,然后再在此通道上传输 HTTP 数据。
相关文献
【知识科普】DNS(域名解析服务)深入解读
【知识科普】一篇文章带你了解什么是http以及https
【知识科普】HTTPS 加密中信息的可见性详解
一文教你弄懂网络协议栈以及报文格式