· 2 min read
HTTP/HTTPS: Web 安全传输的本质
网络协议
访问一个网站时,你可能注意过浏览器地址栏的小锁图标。这个小锁意味着什么?为什么有些网站有,有些没有?这个小锁背后,是 HTTP 和 HTTPS 的本质区别。
HTTP 和 HTTPS 的区别不仅是多一个”S”,更是 Web 安全的基石。
HTTP:明文传输的代价
HTTP(超文本传输协议)是 Web 的基础,属于应用层协议。
数据流向
HTTP 请求: 浏览器 → [格式化数据] → TCP → IP → 网络 → 服务器
HTTP 响应: 服务器 → TCP → IP → 网络 → 浏览器 → 渲染页面
HTTP 的问题
graph LR
A[用户] -->|HTTP 请求| B[中间人]
B -->|转发请求| C[服务器]
C -->|明文响应| B
B -->|明文响应| A
B -.->|篡改数据| A
- 明文传输:用户名、密码、信用卡号一览无余
- 无法验证身份:无法确认服务器是谁
- 数据易篡改:中间人可以修改响应内容
HTTPS:加密传输的实现
HTTPS 本质是 HTTP over TLS/SSL,在传输层和应用层之间增加了安全层。
HTTPS 处理流程
应用层: HTTP 请求
↓
TLS 层: 加密、身份验证
↓
传输层: TCP
↓
网络层: IP
TLS 核心功能
| 功能 | 实现方式 | 作用 |
|---|---|---|
| 加密 | 对称加密 | 数据保密 |
| 身份认证 | 数字证书 | 确认服务器身份 |
| 完整性 | MAC 签名 | 防止数据篡改 |
TLS 握手:加密如何建立
客户端和服务器第一次通信时,需要”握手”建立加密通道:
sequenceDiagram
participant C as 客户端
participant S as 服务器
C->>S: Client Hello(支持的加密算法)
S->>C: Server Hello(选定的算法)
S->>C: 发送证书(包含公钥)
C->>S: 验证证书,生成随机密钥
C->>S: 用公钥加密密钥,发送给服务器
S->>C: 握手完成,后续用对称加密
简化版握手过程
// 1. 客户端发送支持的加密套件列表
const clientHello = {
versions: ['TLS 1.3', 'TLS 1.2'],
cipherSuites: ['AES-256-GCM', 'CHACHA20-POLY1305']
};
// 2. 服务器选择并返回证书
const serverCert = await fetch('/server-cert');
// 3. 客户端验证证书,生成会话密钥
const sessionKey = generateRandomKey();
const encryptedKey = encryptWithPublicKey(sessionKey, serverCert.publicKey);
// 4. 后续通信用对称加密
const encryptedData = encrypt(data, sessionKey);
证书:信任链的基石
证书验证流程
graph TD
A[浏览器] -->|检查| B[证书有效期]
A -->|检查| C[证书域名]
A -->|检查| D[颁发机构]
D -->|检查| E[受信任根证书]
E -->|验证| F[证书签名]
自签名证书 vs 受信任证书
# 自签名证书(开发用)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
# 正式证书(需要 CA 签发)
# 由 Let's Encrypt、 DigiCert 等机构颁发
HTTP/2 与 HTTP/3
现代 HTTPS 不只传输安全,还能享受协议升级:
| 版本 | 特性 | HTTPS 要求 |
|---|---|---|
| HTTP/1.1 | 持久连接 | 可选 |
| HTTP/2 | 多路复用、头部压缩 | 强制 HTTPS |
| HTTP/3 | QUIC、更低延迟 | 必须 HTTPS |
HTTP/2 协议本身不强制 HTTPS,但浏览器只支持基于 TLS 的 HTTP/2。现在 HTTPS 已成为标配,Let’s Encrypt 提供免费证书,小锁图标代表的是用户数据的保护。