- 网络拓扑
┌─────────────────────────────────────────────────────────────────┐
│ HTTPS 分层加密拓扑 │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 浏览器 │ ←── TCP 443 ──────────────→ │ Web 服务器│ │
│ │ (客户端) │ │ │ │
│ │ │ 分层架构: │ │ │
│ │ ┌──────┐ │ ┌─────────────┐ │ ┌──────┐ │ │
│ │ │HTTP │ │ │ HTTP 语义 │ ← 不变 ──→ │ │HTTP │ │ │
│ │ │应用层│ │ │ 请求/响应 │ │ │应用层│ │ │
│ │ └──────┘ │ ├─────────────┤ │ └──────┘ │ │
│ │ ┌──────┐ │ │ TLS 加密层 │ ← 透明 ──→ │ ┌──────┐ │ │
│ │ │TLS │ │ │ 加密/认证 │ │ │TLS │ │ │
│ │ │安全层│ │ │ 完整性 │ │ │安全层│ │ │
│ │ └──────┘ │ ├─────────────┤ │ └──────┘ │ │
│ │ ┌──────┐ │ │ TCP 传输层 │ ← 不变 ──→ │ ┌──────┐ │ │
│ │ │TCP │ │ │ 可靠字节流 │ │ │TCP │ │ │
│ │ └──────┘ │ └─────────────┘ │ └──────┘ │ │
│ └──────────┘ └──────────┘ │
│ │
│ 证书信任链验证: │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 服务器 │ ←─ │ 中间 CA │ ←─ │ 根 CA │ ←─ │ 系统 │ │
│ │ 证书 │ │ 证书 │ │ 证书 │ │ 信任库 │ │
│ │ *.com │ │ (签发者) │ │ (自签) │ │ (预置) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ 签名验证 ──→ 签名验证 ──→ 信任锚点 │
│ │
│ 连接建立开销: │
│ HTTP: 1-RTT (TCP握手) │
│ HTTPS: 2-3 RTT (TCP + TLS 1.2) 或 1-RTT (TLS 1.3) │
│ HTTPS+0-RTT: 0-RTT 恢复(仅幂等请求安全) │
└─────────────────────────────────────────────────────────────────┘
- 设计哲学
HTTPS 不是新协议,而是HTTP 运行在 TLS 之上。设计思路是分层组合:
应用层语义: HTTP 请求/响应(不变)
安全层: TLS 加密/认证/完整性
传输层: TCP 可靠传输(不变)
专家视角:HTTPS 的伟大在于HTTP 完全不用改。所有 Web 应用代码、中间件、缓存语义照旧,TLS 在下层透明地加解密。这是分层架构的教科书案例——在正确层次解决问题,不污染上层。
- 完整连接建立流程
下图为 TLS 1.2 的完整握手(2 RTT,含 ServerKeyExchange / ChangeCipherSpec);TLS 1.3 已精简为 1 RTT 且 ServerHello 之后消息全部加密,详见 TLS协议。
客户端 服务器
| |
| --- TCP SYN ---------------------------> | (1) TCP 三次握手
| <-- TCP SYN-ACK ------------------------ |
| --- TCP ACK ---------------------------> |
| |
| --- TLS ClientHello -------------------> | (2) TLS 握手
| (支持的密码套件、随机数、SNI) |
| <-- TLS ServerHello ------------------- |
| (选定的密码套件、随机数) |
| <-- TLS Certificate ------------------- |
| (服务器证书链) |
| <-- TLS ServerKeyExchange -------------- |
| (DH 公开参数) |
| <-- TLS ServerHelloDone ---------------- |
| --- TLS ClientKeyExchange -------------> |
| (加密的 PreMasterSecret / DH 公钥) |
| --- TLS ChangeCipherSpec --------------> |
| --- TLS Finished ----------------------> |
| (加密的握手摘要) |
| <-- TLS ChangeCipherSpec --------------- |
| <-- TLS Finished ----------------------- |
| |
| =** 加密 HTTP 通信 **=================> | (3) 应用数据
| |
专家视角:HTTPS 首次连接需要 2-RTT TCP+TLS + 证书验证。TLS 1.3 优化到 1-RTT,0-RTT 恢复甚至 0-RTT——但 0-RTT 有重放攻击风险,仅适合幂等请求。
- 核心安全机制
| 机制 | 防御目标 | 实现方式 |
|---|---|---|
| 加密 | 窃听(机密性) | 对称加密(AES-GCM/ChaCha20-Poly1305) |
| 证书 | 中间人冒充(认证) | CA 签发 X.509 证书,客户端验证证书链 |
| 完整性 | 篡改 | AEAD 或 HMAC |
| 前向安全 | 长期密钥泄露不危及旧通信 | ECDHE 临时密钥对 |
| 降级保护 | 强制降级到弱算法 | TLS\_FALLBACK\_SCSV / TLS 1.3 移除弱算法 |
- 证书验证深度
证书验证是 HTTPS 安全的最关键环节,也是最容易被忽略的:
5.1. 验证链
服务器证书 → 中间 CA 证书 → 根 CA 证书(系统信任库)
验证步骤:
- 证书链构建:服务器发送证书链,客户端逐级向上找签发者
- 签名验证:用上级 CA 公钥验证下级证书的签名
- 有效期检查:notBefore ≤ 当前时间 ≤ notAfter
- 主机名匹配:证书 SAN(Subject Alternative Name)匹配请求的域名
- 吊销检查:OCSP(在线)或 CRL(离线)检查证书是否被吊销
专家视角:证书验证做错等于没有加密。常见错误:
- 忽略证书错误继续连接(
curl -k、Pythonverify=False)- 不验证主机名(只验证证书链不验证域名)
- 信任所有证书(
TrustAllManager)- 不检查吊销状态(OCSP Stapling 可减少开销)
5.2. 证书透明度(CT)
- RFC 6962,证书必须提交到 CT Log,Log 返回签名收据(SCT)
- 浏览器要求 EV 证书和 2018+ 新签证书必须包含 SCT
- 目的:让误签证书可被发现(CA 被入侵或恶意签发)
- HTTP vs HTTPS
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | 无 | TLS/SSL |
| 证书 | 不需要 | 需要 CA 证书 |
| 首次延迟 | 1-RTT(TCP) | 2-3 RTT(TCP+TLS) |
| 服务器开销 | 低 | TLS 握手 CPU + 证书验证 |
| 安全性 | 明文,可窃听/篡改 | 加密,防窃听/篡改 |
| 现代地位 | 已淘汰 | **强制**(HTTP/2/3 事实上要求 TLS) |
- 性能优化
| 优化项 | 说明 | 效果 |
|---|---|---|
| TLS 1.3 | 1-RTT 握手 | 减少 50% 握手延迟 |
| Session Resumption | 复用会话,0-RTT | 恢复连接近零延迟 |
| OCSP Stapling | 服务器附带 OCSP 响应 | 省去客户端在线查吊销 |
| HTTP/2 | 多路复用 | 减少连接数,省多次握手 |
| ECC 证书 | ECDSA 替代 RSA | 证书更小,握手更快 |
| False Start | 握手未完成即发数据 | 减少 1-RTT(TLS 1.2) |
| HSTS | 强制 HTTPS | 省去 307 重定向 |
7.1. HSTS 详解
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age:浏览器在此期间强制 HTTPS(31536000 = 1 年)includeSubDomains:子域名也强制preload:申请加入浏览器内置 HSTS 列表(首次访问也强制 HTTPS)
专家视角:HSTS 解决的是首次访问的降级攻击——攻击者在首次 HTTP 请求时劫持 302 重定向。preload 列表是终极方案(Chrome/Firefox 内置数千域名),但申请需谨慎:提交后只能通过官方 removal 流程申请撤销,且要等浏览器新版本发布才能生效(周期以月计),期间无法回到 HTTP。
适合后端与安全工程师查漏补缺:把 HTTPS 从“配一下证书”升级为可验证的安全体系,重点自查证书校验、吊销检查与 HSTS、TLS 1.3 的落地情况。