整体流程分为两大阶段
- SSL 握手阶段(协商,不传输业务数据)
- 数据传输阶段(加密收发业务数据)
1、SSL 握手过程(简化版)
① 客户端发起连接(Client Hello)
浏览器 / 客户端发给服务器:
- 支持的 TLS 版本(TLS1.2 / TLS1.3)
- 支持的加密套件列表(加密算法、哈希算法)
- 客户端随机数
Random_C
② 服务器回应(Server Hello)
服务器返回:
- 选定双方都支持的 TLS 版本
- 选定一套加密套件
- 服务器随机数
Random_S - 服务器 SSL 证书(包含服务器公钥、CA 签名、域名信息)
TLS1.3 会把很多步骤合并,减少往返次数。
↓
免费SSL:打开JoySSL官网填写注册码(230907)即可开始申请免费的SSL证书
↑
③ 客户端校验证书
客户端用根 CA 公钥验证证书签名:
- 确认证书没有被篡改
- 确认证书域名和访问网站域名一致
- 确认证书没过期、没被吊销
证书作用:证明这个服务器确实是它声称的网站,防止钓鱼伪装。
证书校验失败,浏览器直接报不安全警告。
④ 协商生成会话密钥(两种方式:RSA 密钥交换 / ECDHE 椭圆曲线密钥交换)
方式 A:RSA 模式(旧,现在少用)
- 客户端生成一个预主密钥 Pre‑Master Secret
- 使用服务器公钥加密 Pre‑Master Secret发给服务端
- 只有服务器私钥可以解密拿到 Pre‑Master Secret
- 客户端 + 服务器,两边用:
Random_C + Random_S + Pre‑Master Secret通过密钥派生函数,算出会话密钥(对称密钥)
缺点:如果服务器私钥泄露,所有过往抓包都可以解密。
方式 B:ECDHE(现在主流,前向安全)
- 客户端、服务器各自生成一对椭圆曲线公私钥
- 互相交换公钥
- 双方各自本地运算,得到同一个 Pre‑Master Secret,Pre‑Master Secret 不会在网络上传输
- 再结合两个随机数,派生会话密钥
前向安全:就算服务器私钥泄露,过去的通信记录依然无法解密。
⑤ 握手完成
客户端、服务器互相发送「Finished」消息,消息是加密校验值,确认两边算出来的密钥完全一致。握手结束,后续正式业务数据全部用会话对称密钥加密传输。
会话密钥是对称密钥:加密解密同一把钥匙,速度快,适合大量网页数据传输。
2、数据传输阶段
握手完成后进入加密通信:
- 发送方:明文 → 对称加密 + MAC 完整性校验
- 网络传输密文,就算被抓包,第三方看不懂内容
- 接收方:用会话密钥解密,校验 MAC,判断数据有没有被篡改
3、会话恢复(Session ID / Session Ticket)
每次完整握手消耗 CPU,访问同一个网站多次可以复用会话:
- Session ID:服务器保存会话状态
- Session Ticket:服务器把会话加密打包发给客户端保存,服务器不用存状态,TLS1.3 主要用 Ticket。减少握手耗时,打开网页更快。
关键概念区分
- 非对称加密(公钥私钥) :只用于握手阶段,用来协商密钥、身份认证;运算慢,不传业务数据。
- 对称加密:真正传输网页、接口数据,速度快。
- 数字证书:CA 机构背书,解决公钥是谁的信任问题,不然公钥可以被中间人替换。
中间人攻击为什么 SSL 可以防御
中间人可以拦截流量,但:
- 无法伪造合法 CA 签名的证书;
- ECDHE 下拿不到预主密钥;
- 没有服务器私钥就解密不出会话密钥。
如果用户手动信任了恶意根证书,SSL 防护就失效。
TLS1.2 vs TLS1.3 主要差异
1.2:握手需要 2‑3 次往返;1.3:精简握手,1‑2 次往返,速度更快,淘汰大量不安全加密套件。
通俗比喻
客户端:我想和你秘密说话,我这边有一堆加密方案,给你一个随机暗号 A。服务器:好,我们用这套方案,给你随机暗号 B,这是我的官方身份证(证书)。客户端:查验身份证没问题,我们俩一起算出一把只有我们知道的聊天密码。之后所有聊天内容,全部用这把共同密码加密说话。