Back to Blog
· 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/3QUIC、更低延迟必须 HTTPS

HTTP/2 协议本身不强制 HTTPS,但浏览器只支持基于 TLS 的 HTTP/2。现在 HTTPS 已成为标配,Let’s Encrypt 提供免费证书,小锁图标代表的是用户数据的保护。

相关阅读