Voocii博客
首页博客AI 热榜作品集读书友链工具关于
Voocii© 2026. Built with Next.js & tRPC.
GitHubXEmailRSS


图解 HTTPS 加密通信全流程

技术rick-hayekrick-hayek2024年11月20日

浏览器地址栏中经常看到一把“小绿锁”(在现代浏览器中通常简化为灰色的锁形图标)。它代表着当前网页正在使用 HTTPS 协议进行安全通信。

它可以用来解决一个问题:当你输入银行密码或提交登录表单时,这些数据是如何安全地穿越复杂的互联网节点,送达服务器而不被任何人窃听或篡改的?

本文将结合交互式动画和时序流程图,用最直观的方式为你彻底拆解 HTTPS(TLS 1.2/1.3)从发起握手到数据加密传输的完整过程。


🗺️ HTTPS 加密通信时序总览

在深入每一步的细节之前,我们可以通过下面的时序交互图建立一个高层级(High-level)的整体认知:

HTTPS 加密通信时序图

Tip

动手体验: 我做了一个交互式动画页面 👉 点击此处在新页面中打开。可以通过点击各个步骤按钮,实时观察“浏览器”、“服务器”以及“CA(证书颁发机构)”之间的网络数据包交互与密钥生成过程。


📡 核心六步:HTTPS 握手与数据传输全流程

HTTPS 通信通常基于 TLS 协议。在建立连接时,浏览器和服务器需要进行多次“交涉”以确认身份并协商出加密密钥。这整个交涉过程被称为 TLS 握手(Handshake)。

下面,分六步详细剖析这其中的技术奥秘:

Step 1:Client Hello —— 浏览器发起问候

【状态:明文传输】

故事从你按下回车键或点击链接的那一刻开始。浏览器(Client)首先向服务器发出加密请求,这在协议里被称为 Client Hello。

在这个请求数据包中,浏览器携带了以下关键信息:

  1. 支持的 TLS 版本:如 TLS 1.2、TLS 1.3。
  2. 支持的加密套件(Cipher Suites):浏览器列出自己支持的非对称加密、对称加密及哈希算法列表,如 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。
  3. 客户端随机数(Client Random):由浏览器本地生成的 32 字节随机数。

❓ 为什么要带随机数?

如果没有随机数,每次握手产生的最终会话密钥都是固定或可预测的。攻击者只需录下你的网络通信,等日后想办法拿到一次密钥,就能解密你所有的历史记录。引入随机数能确保每次连接生成的密钥都是唯一的。


Step 2:Server Hello + 证书 —— 服务器亮出身份

【状态:明文传输】

服务器收到浏览器的问候后,确认可以建立连接,并向浏览器做出回应。

服务器发送的数据包含:

  1. Server Hello:确认使用的 TLS 版本,并从浏览器提供的加密套件列表中选定一个(例如决定使用 ECDHE 进行密钥交换,使用 AES-256-GCM 进行对称加密)。
  2. 服务端随机数(Server Random):服务器本地生成的另一个 32 字节随机数。
  3. 数字证书(Digital Certificate):这是证明服务器身份的“身份证”。

🏢 什么是数字证书与 CA?

数字证书是由公认的受信任第三方机构——**CA(Certificate Authority,证书颁发机构)**颁发的。 证书内包含:

  • 网站的域名、有效期。
  • 服务器的公钥(Public Key)。
  • CA 机构使用自己的私钥对上述内容进行的数字签名(Digital Signature)。

浏览器出厂时,操作系统 and 浏览器内部就已经内置了全球几百个权威 CA 机构的根证书(包含 CA 公钥)。


Step 3:验证证书 —— 确认你没被骗

【状态:浏览器本地计算】

收到服务器传过来的证书后,浏览器绝不会盲目信任,而是会进行三项严格的本地校验:

  1. 验证签名(身份真实性): 浏览器提取出证书中的 CA 数字签名,使用本地内置的受信任 CA 公钥对签名进行解密和验算。如果签名校验通过,说明这张证书确实是由该 CA 机构颁发,中途没有任何人篡改过内容。
  2. 检查有效期: 确保证书处于生效期内,未过期或被废弃。
  3. 核对域名: 比对证书中注册的域名(如 *.voccli.com)与浏览器地址栏正在访问的域名是否匹配。

🔒 为什么攻击者无法伪造证书?

攻击者如果试图修改证书中的域名或公钥,就必须重新生成数字签名。然而,只有真正的 CA 机构才持有对应的私钥,攻击者无法拿到私钥,伪造的签名在浏览器的 CA 公钥验算下会一秒露馅。“改了内容,签名就废”,这就是数字签名的安全基石。


Step 4:ECDHE 密钥协商 —— 最精妙的数学魔法

【状态:明文传输参数 + 本地计算秘密】

证书验证通过,确认了服务器的真实身份。接下来,双方需要做一件极其神奇的事: 在一条所有人都能监听的公共信道上,商量出一个只有双方自己知道的秘密,且中途截获数据包的黑客无法破解它。

这需要借助 ECDHE(椭圆曲线迪菲-赫尔曼密钥交换) 算法:

浏览器 (Client)交互过程服务器 (Server)
① 协商参数
约定公开基点 G、椭圆曲线参数
生成临时私钥 a
计算公钥 A = a \times G
生成临时私钥 b
计算公钥 B = b \times G
② 交换公钥
发送公钥 A \longrightarrow
\longleftarrow 发送公钥 B
计算共享密钥 S = a \times B
(S = a \times b \times G)
计算共享密钥 S = b \times A
(S = b \times a \times G)
  1. 约定参数:双方选定椭圆曲线,并确定曲线上一个公开的起点——基点 G(这是公开标准,黑客也知道)。
  2. 客户端生成:浏览器在本地随机生成一个临时私钥 a(绝不外传),计算出临时公钥 A = a \times G,然后将 A 发给服务器。
  3. 服务端生成:服务器在本地随机生成一个临时私钥 b(绝不外传),计算出临时公钥 B = b \times G,然后将 B 发给浏览器。
  4. 各自计算:
    • 浏览器拿到 B,在本地计算:S = a \times B = a \times (b \times G)。
    • 服务器拿到 A,在本地计算:S = b \times A = b \times (a \times G)。
  5. 神奇的结果:由于乘法结合律,双方在各自端算出的 S(共享秘密 - Pre-Master Secret)是完全相同的!

🕵️ 为什么黑客无法截获共享秘密?

黑客在网络上只能截获公开参数 G、浏览器公钥 A 和服务器公钥 B。要想推算出 S,黑客必须从 A 和 G 中反推出私钥 a(即解出 a = A / G)。 在数学上,这被称为椭圆曲线离散对数难题(ECDLP)。以人类目前的计算机算力,解出这道题需要花费比宇宙寿命还要漫长的时间。


Step 5:派生会话密钥 —— 对称加密登场

【状态:各自本地派生】

有了相同的共享秘密(Pre-Master Secret)后,双方还需要将其与 Client Random 和 Server Random 混合,输入到一个叫 HKDF(基于 HMAC 的密钥派生函数) 中。

就像把原材料倒进搅拌机一样,HKDF 会输出几把针对本次会话的高强度对称加密钥匙:

  • Client Write Key:浏览器发送数据给服务器时的加密钥匙。
  • Server Write Key:服务器发送数据给浏览器时的加密钥匙。
  • 各自的初始化向量 (IV)。

这几把钥匙所使用的对称加密算法一般是 AES-256-GCM 或 ChaCha20-Poly1305。

💡 为什么要大费周折地在握手阶段用“非对称加密”,数据传输又用“对称加密”?

  • 非对称加密(RSA/ECDHE):安全度极高,不需要提前共享密钥,但计算极其复杂,速度慢。
  • 对称加密(AES):速度极快(比非对称加密快数千倍),但需要双方拥有相同的钥匙,且钥匙在网络上传输极易被窃听。

HTTPS 的设计智慧:用高安全性的“非对称加密”安全地商量出钥匙,一旦商量好了,后续所有网页内容的传输全部切换为高效率的“对称加密”。两者优势互补,天衣无缝。


Step 6:加密数据传输 —— 握手完成,正式通信

【状态:密文传输(对称加密保护)】

至此,握手完美结束。

之后你和服务器之间发送的所有应用层数据(HTTP 请求、密码、Cookie、网页 HTML 等),都会被 Client Write Key 或 Server Write Key 进行高强度加密。

  • 网络上的运营商、路由器节点或窃听者,看到的全部是无意义的随机二进制字符流。
  • 认证标签(Auth Tag):每一个加密数据包都附带一个认证标签,确保只要传输过程中有任何 1 个比特的数据被篡改,接收端解密时都会立刻察觉并丢弃数据包,防止被中间人篡改。

🔒 什么是前向保密 (Forward Secrecy)?

每次连接时,握手所生成的临时私钥 a 和 b 在连接断开的瞬间就会在内存中被彻底销毁。 即使很多年后,黑客攻破了目标网站的服务器,盗走了服务器的长期私钥,由于黑客没有当年每次会话生成的临时私钥 a 和 b,他也永远无法解密之前录制下来的任何历史历史流量。这就是 HTTPS 强大的前向安全性。


🏁 总结:闪电般的几十毫秒

用一张极简步骤表回顾一下 HTTPS 的安全逻辑:

步骤参与者传输状态核心逻辑与数学原理
1. Client Hello浏览器 -> 服务器明文递上客户端随机数,提供加密算法清单
2. Server Hello + 证书服务器 -> 浏览器明文选定算法,递上服务端随机数和含服务器公钥的 CA 证书
3. 验证证书浏览器本地无传输用内置的 CA 公钥验证证书数字签名,防伪造
4. ECDHE 密钥协商双向交换公钥明文参数交换临时公钥 A 与 B,通过 a \times B = b \times A 在本地算出共享秘密
5. 派生会话密钥双方各自本地无传输融合共享秘密和两个随机数,派生出高速的对称加密密钥(AES)
6. 加密数据传输浏览器 ↔ 服务器密文开启高速对称加密通信,断开连接后销毁临时密钥确保前向保密

这套复杂的数学舞蹈,在现代计算机和高速网络下,会在你按下回车的 30~80 毫秒 内全部执行完毕。

总的来说,非对称加密、对称加密、CA 数字签名和 ECDHE 密钥交换的完美结合,构建起了今天安全可信的互联网世界。

评论 (0)

暂无评论,快来抢沙发吧!

目录
  • 🗺️ HTTPS 加密通信时序总览
  • 📡 核心六步:HTTPS 握手与数据传输全流程
  • 🏁 总结:闪电般的几十毫秒