$HTTPS = HTTP + TLS/SSL$,在 HTTP 基础上增加加密和身份验证。
| 特性 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | 明文 | TLS 加密 |
| 证书 | 不需要 | 需要 CA 证书 |
| 性能 | 快 | 略慢(握手开销) |
| 安全性 | 低 | 高 |
┌───────────────────────────┐
│ 应用层 (HTTP) │
├───────────────────────────┤
│ TLS记录协议 (TLS Record) │
├───────────────────────────┤
│ TLS握手协议 │
│ TLS密码变更协议 │
│ TLS告警协议 │
├───────────────────────────┤
│ TCP │
├───────────────────────────┤
│ IP │
└───────────────────────────┘
阶段1(非对称): 用非对称加密协商对称密钥
阶段2(对称): 用对称密钥加密实际数据
┌──────────────────────────────┐
│ 数字证书 (X.509) │
├──────────────────────────────┤
│ 版本号 / 序列号 / 签名算法 │
│ 颁发者(issuer) │
│ 有效期 │
│ 使用者(subject) = 网站域名 │
│ 使用者公钥 │ ← 关键
│ CA的数字签名 │ ← 关键
└──────────────────────────────┘
根CA (Root CA) ← 浏览器内置信任
│ 签发
▼
中间CA (Intermediate CA)
│ 签发
▼
网站证书 (leaf certificate)
客户端 服务器
│ ① ClientHello (版本/套件/随机数) │
│ ─────────────────────────────────→ │
│ ② ServerHello (选定版本/套件/随机数)│
│ ③ Certificate (服务器证书) │
│ ④ ServerHelloDone │
│ ←───────────────────────────────── │
│ ⑤ ClientKeyExchange (预主密钥,公钥加密)│
│ ⑥ ChangeCipherSpec │
│ ⑦ Finished │
│ ─────────────────────────────────→ │
│ ⑧ ChangeCipherSpec ⑨ Finished │
│ ←───────────────────────────────── │
│ ═══ 加密应用数据 ═══ │
客户端随机数 + 服务器随机数 + 预主密钥
│
密钥派生函数(KDF)
│
主密钥(Master Secret)
│
会话密钥: 加密密钥、MAC密钥、IV
客户端 → ClientHello + 密钥共享 → 服务器
服务器 → ServerHello + 密钥共享 + 证书 + Finished
客户端 → Finished
═══ 1-RTT 加密通信 ═══
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
│ │ │ │ │ │
│ │ │ │ │ └─ PRF哈希
│ │ │ │ └─ 分组密码模式
│ │ │ └─ 对称加密算法
│ │ └─ 身份验证算法
│ └─ 密钥交换算法
└─ 协议
| 套件 | 安全性 | 性能 |
|---|---|---|
| ECDHE-RSA-AES256-GCM-SHA384 | 高 | 中 |
| ECDHE-RSA-AES128-GCM-SHA256 | 高 | 快 |
| ECDHE-ECDSA-AES256-GCM-SHA384 | 高 | 快 |
即使服务器私钥泄露,之前的加密通信也无法被解密。
ECDHE(椭圆曲线 Diffie-Hellman 临时密钥):
客户端生成临时密钥对 $(a, g^{a})$,服务器生成 $(b, g^{b})$;交换公钥 $g^{a} \leftrightarrow g^{b}$;共享密钥 $g^{(ab)}$。
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。