网络 & HTTP
HTTP 与 HTTPS
HTTPS 在 HTTP 的基础上加入了 SSL/TLS 层,解决了 HTTP 明文传输带来的三个核心问题:窃听、篡改、身份冒充。
HTTP vs HTTPS
| 维度 | HTTP | HTTPS |
|---|---|---|
| 传输方式 | 明文 | SSL/TLS 加密 |
| 窃听风险 | 有(账号密码可被截获) | 无(内容加密) |
| 篡改风险 | 有(内容可被注入广告) | 无(完整性校验) |
| 身份验证 | 无 | 数字证书验证服务端身份 |
| 默认端口 | 80 | 443 |
| 握手延迟 | TCP 三次握手 | TCP 握手 + TLS 握手 |
| SEO | 普通 | 搜索引擎优先收录 |
TLS 1.3 将握手压缩至 1-RTT(首次)和 0-RTT(会话恢复),现代网络下 HTTPS 与 HTTP 的性能差距可忽略不计。
TLS 握手流程
TLS 握手的目标是:在不安全的网络上,让双方协商出一个只有彼此知道的会话密钥,后续通信用该密钥对称加密。
ECDHE 握手(TLS 1.2,主流)
| 步骤 | 方向 | 内容 |
|---|---|---|
| Client Hello | C → S | 支持的加密套件 + 随机数 A |
| Server Hello | S → C | 选定加密套件 + 随机数 B + 证书(含公钥)+ ECDHE 椭圆曲线公钥(带签名) |
| Client Key Exchange | C → S | 验证证书 → 发送客户端 ECDHE 公钥 → 双方独立算出共享密钥 → Change Cipher Spec |
| Server Finished | S → C | Change Cipher Spec + 握手摘要验证 |
双方凑齐随机数 A + 随机数 B + ECDHE 共享密钥,推导出相同的会话密钥,后续通信切换为对称加密。
RSA 握手(TLS 1.2,旧方案)
第三步改为:客户端生成 Pre-master Secret,用服务端证书公钥加密后发送,服务端用私钥解密。三个随机数合并生成会话密钥。
RSA 方案的致命缺陷:无前向安全性。私钥一旦泄露,所有历史加密流量均可被离线解密。TLS 1.3 已移除 RSA 密钥交换。
ECDHE vs RSA
| 维度 | ECDHE | RSA |
|---|---|---|
| 前向安全性 | ✅ 有(每次握手临时生成密钥对,会话结束即销毁) | ❌ 无(私钥泄露导致历史流量全部可解密) |
| 计算复杂度 | 较高(椭圆曲线运算) | 较低 |
| TLS 1.3 支持 | ✅ 保留 | ❌ 已移除 |
SSL/TLS 版本演进
| 版本 | 年份 | 要点 |
|---|---|---|
| SSL 2.0 | 1995 | 首个公开版本,存在多个安全漏洞 |
| SSL 3.0 | 1996 | 引入消息完整性校验,后被 POODLE 攻击淘汰 |
| TLS 1.0 | 1999 | SSL 3.0 的标准化演进版本 |
| TLS 1.2 | 2008 | 引入 AES-GCM、SHA-256,目前广泛部署 |
| TLS 1.3 | 2018 | 握手简化为 1-RTT、支持 0-RTT 恢复、移除 RSA 密钥交换和旧加密算法 |
证书与信任链
HTTPS 的身份验证依赖证书信任链:服务端证书由 CA(证书颁发机构)签发,CA 根证书预装在操作系统和浏览器中。浏览器验证三项:
- 证书是否由受信任 CA 签发
- 证书域名是否与请求域名匹配
- 证书是否在有效期内且未被吊销
自签名证书在技术上等同于 CA 证书,区别在于没有第三方背书,浏览器会显示安全警告。内网环境可将自签名根证书手动安装到系统信任列表中使用,对外服务须使用受信任 CA 签发的证书。
0-RTT 的限制
TLS 1.3 的 0-RTT 会话恢复使用上次会话的密钥加密早期数据,存在重放攻击风险:攻击者可原样重发 0-RTT 数据包。因此 0-RTT 数据只应用于幂等请求(如 GET),不得用于转账、下单等非幂等操作。