HTTPS 协议

文章来源声明: 原文作者:Zelman; 来源站点:掘金; 原文链接:https://juejin.cn/post/7691556425943777321; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

适合后端与安全工程师查漏补缺:把 HTTPS 从“配一下证书”升级为可验证的安全体系,重点自查证书校验、吊销检查与 HSTS、TLS 1.3 的落地情况。

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

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

  1. 设计哲学

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

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

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

  1. 完整连接建立流程

下图为 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 有重放攻击风险,仅适合幂等请求。

  1. 核心安全机制

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

证书验证是 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 被入侵或恶意签发)
  1. HTTP vs HTTPS

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

优化项说明效果
TLS 1.31-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。