HTTPS 协议

HTTPS = HTTP + TLS协议/SSL协议,在 HTTP 基础上增加加密层,端口 443。 RFC 2818(2000)定义 HTTPS,实质是"HTTP over TLS"。

1. 网络拓扑

scss 复制代码
┌─────────────────────────────────────────────────────────────────┐
│                  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 恢复(仅幂等请求安全)                     │
└─────────────────────────────────────────────────────────────────┘

2. 设计哲学

HTTPS 不是新协议,而是HTTP 运行在 TLS 之上。设计思路是分层组合:

复制代码
应用层语义:  HTTP 请求/响应(不变)
安全层:      TLS 加密/认证/完整性
传输层:      TCP 可靠传输(不变)

专家视角 :HTTPS 的伟大在于HTTP 完全不用改。所有 Web 应用代码、中间件、缓存语义照旧,TLS 在下层透明地加解密。这是分层架构的教科书案例------在正确层次解决问题,不污染上层。

3. 完整连接建立流程

下图为 TLS 1.2 的完整握手(2 RTT,含 ServerKeyExchange / ChangeCipherSpec);TLS 1.3 已精简为 1 RTT 且 ServerHello 之后消息全部加密,详见 TLS协议。

lua 复制代码
客户端                                    服务器
  |                                         |
  | --- 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 有重放攻击风险,仅适合幂等请求。

4. 核心安全机制

机制 防御目标 实现方式
加密 窃听(机密性) 对称加密(AES-GCM/ChaCha20-Poly1305)
证书 中间人冒充(认证) CA 签发 X.509 证书,客户端验证证书链
完整性 篡改 AEAD 或 HMAC
前向安全 长期密钥泄露不危及旧通信 ECDHE 临时密钥对
降级保护 强制降级到弱算法 TLS_FALLBACK_SCSV / TLS 1.3 移除弱算法

5. 证书验证深度

证书验证是 HTTPS 安全的最关键环节,也是最容易被忽略的:

5.1. 验证链

复制代码
服务器证书 → 中间 CA 证书 → 根 CA 证书(系统信任库)

验证步骤:

  1. 证书链构建:服务器发送证书链,客户端逐级向上找签发者
  2. 签名验证:用上级 CA 公钥验证下级证书的签名
  3. 有效期检查:notBefore ≤ 当前时间 ≤ notAfter
  4. 主机名匹配:证书 SAN(Subject Alternative Name)匹配请求的域名
  5. 吊销检查:OCSP(在线)或 CRL(离线)检查证书是否被吊销

专家视角 :证书验证做错等于没有加密。常见错误:

  • 忽略证书错误继续连接(curl -k、Python verify=False)
  • 不验证主机名(只验证证书链不验证域名)
  • 信任所有证书(TrustAllManager)
  • 不检查吊销状态(OCSP Stapling 可减少开销)

5.2. 证书透明度(CT)

  • RFC 6962,证书必须提交到 CT Log,Log 返回签名收据(SCT)
  • 浏览器要求 EV 证书和 2018+ 新签证书必须包含 SCT
  • 目的:让误签证书可被发现(CA 被入侵或恶意签发)

6. HTTP vs HTTPS

对比项 HTTP HTTPS
端口 80 443
加密 无 TLS/SSL
证书 不需要 需要 CA 证书
首次延迟 1-RTT(TCP) 2-3 RTT(TCP+TLS)
服务器开销 低 TLS 握手 CPU + 证书验证
安全性 明文,可窃听/篡改 加密,防窃听/篡改
现代地位 已淘汰 强制(HTTP/2/3 事实上要求 TLS)

7. 性能优化

优化项 说明 效果
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 详解

ini 复制代码
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。

相关推荐
JVM高并发4 小时前
使用 Cloudflare Tunnel(本地管理隧道)搭配 DigitalPlat 免费域名实现内网穿透
网络协议·全栈
Zelman4 小时前
网络协议性能调优手册
网络协议·性能优化
Zelman4 小时前
TCP-IP 协议栈设计哲学
网络协议
姜鱼问生4 小时前
HTTPS 部署实战:未备案域名 + 非标端口的完整方案
linux·https
阿钱真强道5 小时前
28 嵌入式操作系统 | 网关加 TCP 命令通道:粘包/半包怎么切
网络·网络协议·tcp/ip·粘包
hasty6 小时前
一次 WebSocket 握手为何能终止进程?Undici CVE-2026-19534 的异常边界
网络·websocket·网络协议
hasty7 小时前
前缀相同不代表同一网络:ip-address 跨地址族比较缺陷
网络·网络协议·tcp/ip
Lsetea10 小时前
ACME DNS-01报NXDOMAIN:_acme-challenge记录与权威DNS排查
https·dns·ssl证书·acme·dns-01
傲世仙尊10 小时前
HTTP请求与应答-URL全网唯一文件路径报文结构与短连接
网络·网络协议·http