当你在浏览器地址栏看到那个小小的锁形图标时,背后其实刚刚完成了一场精密的“加密谈判”——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 Spec 和 Finished。客户端验证服务器的 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 到加密通道建立


朋友圈点赞图在线生成源码