HTTPS 握手过程详解:从 Client Hello 到加密通道建立

当你在浏览器地址栏看到那个小小的锁形图标时,背后其实刚刚完成了一场精密的“加密谈判”——TLS 握手。它是 HTTPS 安全通信的基石,决定了后续所有数据传输的机密性、完整性和身份可信度。本文将以 TLS 1.2 为主线,拆解从 Client Hello 到加密通道建立的完整流程,并简要对比 TLS 1.3 的优化。

一、握手前的准备:为什么需要握手?

HTTP 本身是明文协议,数据在网络上裸奔,容易被窃听、篡改或冒充。HTTPS 在 HTTP 与 TCP 之间插入 TLS/SSL 层,通过握手实现三个目标:

  • 身份验证:确认服务器是“真身”,而非中间人伪造。
  • 密钥协商:双方在不安全的信道上,安全地生成只有彼此知道的会话密钥。
  • 算法协商:确定后续通信使用的加密套件(如 AES-256-GCM、ECDHE 等)。

握手完成后,应用层数据才会用协商出的对称密钥加密传输。

二、TLS 1.2 握手全流程

1. Client Hello:客户端发起“提案”

浏览器(客户端)首先向服务器发送 Client Hello 消息,内容包括:

  • 客户端随机数(Client Random):32 字节随机值,后续用于生成密钥。
  • 支持的 TLS 版本:如 TLS 1.2、TLS 1.3。
  • 密码套件列表:按优先级排列,例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • 扩展字段:如 SNI(指定要访问的域名)、ALPN(协商 HTTP/2)、支持的椭圆曲线等。

这一步相当于客户端说:“我支持这些加密方案,你选一个吧。”

2. Server Hello:服务器“拍板”

服务器收到 Client Hello 后,从中选择双方都支持的最高版本和最优密码套件,回复 Server Hello

  • 服务器随机数(Server Random):另一个 32 字节随机值。
  • 选定的 TLS 版本密码套件
  • 会话 ID(用于会话恢复,可选)。

此时,双方已交换了随机数,但尚未验证身份,也未生成密钥。

3. Certificate:服务器出示“身份证”

服务器紧接着发送 Certificate 消息,包含自己的数字证书链(通常是服务器证书 + 中间 CA 证书)。证书中携带:

  • 服务器公钥
  • 域名信息
  • 有效期
  • CA 的数字签名

客户端会用内置的根证书验证签名,确认证书是否由可信 CA 签发、域名是否匹配、是否在有效期内。如果验证失败,浏览器会弹出警告。

4. Server Key Exchange(可选):传递密钥交换参数

如果使用 ECDHE 等前向安全的密钥交换算法,服务器会在此消息中发送:

  • 椭圆曲线公钥(或 DH 参数)
  • 对参数的签名(用证书私钥签名,防止篡改)

客户端用服务器证书公钥验证签名,确保参数来自真正的服务器。

5. Server Hello Done:服务器“说完了”

服务器发送 Server Hello Done,表示自己这一方的握手消息已发送完毕,等待客户端回应。

6. Client Key Exchange:客户端“交出”公钥

客户端生成自己的 ECDHE 公钥,通过 Client Key Exchange 消息发给服务器。此时,双方都拥有了对方的公钥和两个随机数,可以独立计算出相同的预主密钥(Pre-Master Secret)。

7. Change Cipher Spec + Finished:切换到加密模式

客户端发送 Change Cipher Spec,通知服务器:“接下来的消息我要用协商好的密钥加密了。” 然后发送 Finished 消息,内容是之前所有握手消息的哈希值,用会话密钥加密。

服务器同样回复 Change Cipher SpecFinished。客户端验证服务器的 Finished 值,若正确,则握手成功。

8. 加密通道建立

至此,双方已拥有相同的会话密钥(由 Pre-Master Secret 和两个随机数推导出主密钥,再扩展为多个对称密钥)。后续所有 HTTP 数据都用对称加密传输,效率远高于非对称加密。

三、TLS 1.3 的优化:更快、更安全

TLS 1.3 对握手做了大幅精简:

  • 1-RTT 握手:客户端在 Client Hello 中直接带上密钥共享(Key Share),服务器在 Server Hello 中即可计算密钥,省去额外往返。
  • 0-RTT 恢复:会话恢复时,客户端可直接发送加密数据,实现零往返延迟(但需注意重放攻击风险)。
  • 移除不安全算法:只保留前向安全的密钥交换和 AEAD 加密套件。
  • 加密更多握手消息:证书等敏感信息也被加密,减少信息泄露。

四、关键概念速查

概念 作用
Client Random / Server Random 参与密钥生成,防止重放
预主密钥 双方独立计算出的共享秘密
会话密钥 最终用于对称加密的密钥
前向安全 即使长期私钥泄露,历史会话仍安全
SNI 让服务器知道客户端要访问哪个域名

五、总结

HTTPS 握手是一场精心设计的“安全舞蹈”:从 Client Hello 的提案,到证书验证的身份确认,再到密钥交换与 Finished 校验,每一步都在不安全的信道上构建出可信的加密通道。理解这个过程,不仅能帮你排查 HTTPS 连接问题,更能让你体会到现代密码学在工程上的精妙平衡——安全、性能与兼容性,缺一不可。

下次看到浏览器上的小锁,你或许会想起:这背后,是数十毫秒内完成的数百行协议交互。

未经允许不得转载:任鹏个人博客 » HTTPS 握手过程详解:从 Client Hello 到加密通道建立

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏