本文覆盖对称/非对称/混合加密原理、数字证书与 CA 信任链、TLS 1.2 四次握手详细流程、TLS 1.3 的 1-RTT/0-RTT 改进、HTTPS 性能优化手段(Session 复用/OCSP Stapling/证书压缩),以及常见安全攻击。
目录
| 章节 | 说明 |
|---|---|
| 加密体系基础 | 对称/非对称/混合加密 |
| 数字证书与 CA 信任链 | 证书结构与验证流程 |
| TLS 1.2 握手流程 | 4 个消息往返的详细过程 |
| TLS 1.3 改进 | 1-RTT/0-RTT,废除不安全算法 |
| HTTPS 性能优化 | Session 复用、OCSP Stapling 等 |
| 常见安全攻击 | 中间人攻击、降级攻击 |
加密体系基础
对称加密
加密和解密使用同一个密钥。速度快,但存在密钥分发问题:如何安全地把密钥传给对方?
| 算法 | 密钥长度 | 说明 |
|---|---|---|
| AES-128-GCM | 128 位 | 目前最常用,硬件加速支持 |
| AES-256-GCM | 256 位 | 更高安全性 |
| ChaCha20-Poly1305 | 256 位 | 纯软件性能优秀,移动端友好 |
| ~~RC4/DES/3DES~~ | — | 已废弃,存在安全漏洞 |
分组模式:AEAD(Authenticated Encryption with Associated Data)在加密同时提供认证,GCM/CCM/Poly1305 均属此类,旧的 ECB/CBC 模式已不推荐。
非对称加密
使用公钥/私钥对:公钥加密只能私钥解密,私钥加密只能公钥解密。解决了密钥分发问题,但运算速度比对称加密慢几百倍。
| 算法 | 安全基础 | 典型用途 |
|---|---|---|
| RSA-2048 | 大整数分解 | 密钥交换(已逐渐废弃)、数字签名 |
| ECDHE | 椭圆曲线离散对数 | 密钥交换(主流),支持前向安全 |
| ECDSA | 椭圆曲线离散对数 | 数字签名 |
常用椭圆曲线:P-256(NIST 推荐)、x25519(最快最安全)
性能对比(参考数据):
AES-128-CBC 加解密 1000 次:~0.97ms,吞吐 13 MB/s
RSA-2048 加解密 1000 次:~840ms,吞吐 15 KB/s
差距约 868 倍
混合加密
TLS 的实际方案:用非对称加密交换会话密钥,用对称加密传输数据。
sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C,S: 非对称加密阶段(握手)
C->>S: 客户端公钥参数
S->>C: 服务端公钥参数 + 证书
Note over C,S: 双方各自计算出相同的 Pre-Master
Note over C,S: 对称加密阶段(数据传输)
C->>S: 用会话密钥加密的 HTTP 请求
S->>C: 用会话密钥加密的 HTTP 响应
数字证书与 CA 信任链
数字证书解决了"如何确认公钥属于真实服务器"的问题,防止中间人伪造公钥。
证书内容
证书包含:
- 服务器域名(Subject)
- 服务器公钥
- 证书有效期
- 颁发机构(Issuer,即 CA)
- CA 的数字签名(用 CA 私钥对上述信息做签名)
信任链验证
根 CA 证书(内置于操作系统/浏览器)
└── 中间 CA 证书(由根 CA 签名)
└── 服务器证书(由中间 CA 签名)
验证过程:
- 用中间 CA 公钥验证服务器证书签名
- 用根 CA 公钥验证中间 CA 证书签名
- 根 CA 证书是否在本机信任列表中
证书吊销
| 方式 | 说明 | 缺点 |
|---|---|---|
| CRL(证书吊销列表) | CA 定期发布,客户端下载对比 | 列表大、有时间窗口 |
| OCSP(在线证书状态协议) | 实时向 CA 查询 | 增加一次网络请求 |
| OCSP Stapling | 服务器预先获取 OCSP 响应,随证书一起发给客户端 | 推荐方案,消除客户端查询延迟 |
TLS 1.2 握手流程
TLS 1.2 完整握手需要 2-RTT(两次消息往返)。
sequenceDiagram
participant C as 客户端
participant S as 服务端
Note over C,S: TCP 三次握手已完成
C->>S: ClientHello<br/>TLS版本 + 随机数(Client Random)<br/>+ 支持的密码套件列表
S->>C: ServerHello<br/>选定密码套件 + 随机数(Server Random)
S->>C: Certificate<br/>服务器证书链
S->>C: ServerKeyExchange<br/>ECDHE 公钥参数(Server Params) + 私钥签名
S->>C: ServerHelloDone
Note over C: 验证证书链<br/>生成 Client Params(ECDHE 公钥)
C->>S: ClientKeyExchange<br/>Client Params
Note over C,S: 双方用 ECDHE 算出 Pre-Master<br/>结合 Client Random + Server Random<br/>生成 Master Secret → 会话密钥
C->>S: ChangeCipherSpec(后续用对称加密)
C->>S: Finished(握手数据摘要,加密验证)
S->>C: ChangeCipherSpec
S->>C: Finished
Note over C,S: 握手完成,开始加密传输 HTTP
三个随机数的意义:Client Random + Server Random + Pre-Master,三个不可靠的随机数混合,使最终会话密钥难以被预测。
ECDHE vs RSA 密钥交换:
| 方式 | 前向安全 | 说明 |
|---|---|---|
| ECDHE | 有 | 每次握手生成临时密钥对,私钥泄露不影响历史会话 |
| RSA | 无 | 用服务器长期私钥加密 Pre-Master,私钥泄露可解密所有历史会话 |
TLS 1.3 改进
TLS 1.3 于 2018 年发布,三大改进目标:兼容、安全、性能。
兼容性
TLS 1.3 伪装成 TLS 1.2(版本号仍写 0x0303),通过 supported_versions 扩展字段标识真实版本,避免中间代理设备不认识新版本。
安全性增强
废除了大量不安全算法:
| 废除内容 | 说明 |
|---|---|
| RSA/DH 密钥交换 | 不具备前向安全 |
| MD5、SHA-1、SHA-224 | 摘要算法已不安全 |
| RC4、DES、3DES | 对称加密已被破解 |
| ECB、CBC 分组模式 | 存在安全漏洞 |
TLS 1.3 只保留 5 个密码套件:AES-128-GCM-SHA256、AES-256-GCM-SHA384、ChaCha20-Poly1305-SHA256 等。
性能提升:1-RTT 握手
sequenceDiagram
participant C as 客户端
participant S as 服务端
C->>S: ClientHello<br/>+ supported_groups(支持的曲线)<br/>+ key_share(客户端 ECDHE 公钥参数)<br/>+ signature_algorithms
S->>C: ServerHello<br/>+ key_share(服务端 ECDHE 公钥参数)<br/>+ ChangeCipherSpec(立即加密)
S->>C: Certificate(加密)<br/>+ CertificateVerify(私钥签名)<br/>+ Finished
C->>S: Finished
Note over C,S: 握手完成,仅 1-RTT
客户端在 ClientHello 中直接带上 ECDHE 公钥参数,服务端一次响应就能完成密钥交换,握手从 2-RTT 降为 1-RTT。
0-RTT(PSK 预共享密钥)
会话复用场景下,客户端可以在第一个包中直接携带加密的应用数据(Early Data),实现 0-RTT。
⚠️ 0-RTT 风险:存在重放攻击(Replay Attack)风险,黑客可截获并重发 Early Data。应仅用于幂等的 GET/HEAD 请求,或通过时间戳/nonce 防重放。
HTTPS 性能优化
优化方向总览
TLS 握手耗时来源:
1. 网络往返(RTT):2-RTT(TLS 1.2)或 1-RTT(TLS 1.3)
2. 证书验证:证书链传输 + OCSP 查询
3. 计算开销:ECDHE 密钥生成、非对称加解密
协议层优化
| 优化手段 | 说明 |
|---|---|
| 升级 TLS 1.3 | 1-RTT 握手,废除慢算法 |
| 使用 ECDHE + False Start | TLS 1.2 下可提前发送数据,降至 1-RTT |
| 选用 x25519 曲线 | 性能最优的椭圆曲线 |
| 使用 ECC 证书 | 224 位 ECC ≈ 2048 位 RSA,证书更小 |
证书优化
- OCSP Stapling:服务器预先获取并缓存 OCSP 响应,随握手一起发给客户端,消除客户端查询 CA 的延迟
- 证书链裁剪:只发必要的中间证书,不发根证书(根证书客户端本地有)
会话复用
| 方式 | 存储位置 | 说明 |
|---|---|---|
| Session ID | 服务器内存 | 简单,但服务器需存储每个客户端状态 |
| Session Ticket | 客户端 | 服务器加密会话信息发给客户端,无状态;需定期轮换 Ticket Key |
| PSK(TLS 1.3) | 客户端 | 0-RTT,效率最高;需防重放攻击 |
会话复用效果:跳过证书验证和密钥交换,直接恢复会话,握手从 1-RTT 降为 0-RTT(PSK)。
常见安全攻击
中间人攻击(MITM)
攻击者在客户端与服务端之间插入自己,分别与双方建立 TLS 连接,转发数据同时解密查看。
防御:
- 使用受信任 CA 签发的证书,客户端验证证书合法性
- HSTS(HTTP Strict Transport Security):强制使用 HTTPS,防止降级
- 证书透明度(Certificate Transparency):CA 必须将签发的证书记录到公开日志
降级攻击(Downgrade Attack)
攻击者篡改握手消息,迫使双方使用旧版本协议(如 SSL 3.0)或弱加密算法。
防御:
- TLS 1.3 废除了所有不安全算法,无法降级到弱套件
- 服务器配置禁用 TLS 1.0/1.1 和弱密码套件
- 使用
Downgrade Sentinel(TLS 1.3 的内置机制)检测降级尝试
BEAST / POODLE / CRIME 等历史漏洞
| 漏洞 | 影响 | 修复 |
|---|---|---|
| BEAST | SSL 3.0/TLS 1.0,CBC 模式漏洞 | 升级 TLS 1.2+,使用 AEAD |
| POODLE | SSL 3.0 填充攻击 | 禁用 SSL 3.0 |
| CRIME | TLS 压缩信息泄露 | TLS 1.3 明确禁止压缩 |
| Heartbleed | OpenSSL 内存越界读取 | 升级 OpenSSL |
参考资料
- 《透视 HTTP 协议》— 罗剑锋,极客时间,第 23、24、25、26、27、28 讲
- RFC 5246 (TLS 1.2)、RFC 8446 (TLS 1.3)
评论 (0)
发表评论