394 字
1 分钟
TLS 与 HTTPS 协议:加密传输
前言
HTTPS 已成为 Web 安全的基石。本章详解 TLS 1.2/1.3 协议、握手流程、证书验证与 PKI 系统。
相关章节:
- DNS 协议详解 — DNSSEC 与证书验证的关系
- WebSocket 协议 — WSS 安全连接依赖 TLS
- OAuth2 与 OIDC 协议 — OAuth 强制要求 HTTPS
一、TLS 协议概述
1.1 协议版本演进
| 版本 | 年份 | 主要改进 |
|---|---|---|
| SSL 3.0 | 1996 | 初始版本,已废弃 |
| TLS 1.0 | 1999 | 废弃 |
| TLS 1.1 | 2006 | 废弃 |
| TLS 1.2 | 2008 | AEAD 支持 |
| TLS 1.3 | 2018 | 简化握手、0-RTT 支持 |
1.2 协议分层
graph TB
A["应用层 HTTP"] --> B["TLS Record Protocol"]
B --> C["TLS Handshake Protocol"]
B --> D["TLS Alert Protocol"]
B --> E["TLS App Data Protocol"]
二、TLS 1.3 握手详解
2.1 TLS 1.2 vs 1.3 握手对比
flowchart LR
subgraph TLS12["TLS 1.2 (2-RTT)"]
direction TB
C1["ClientHello"] --> S1["ServerHello + Certificate"]
S1 --> C2["ServerKeyExchange"]
C2 --> S2["ClientKeyExchange"]
S2 --> C3["ChangeCipherSpec + Finished"]
C3 --> S3["ChangeCipherSpec + Finished"]
end
subgraph TLS13["TLS 1.3 (1-RTT)"]
direction TB
D1["ClientHello + KeyShare"] --> E1["ServerHello + KeyShare"]
E1 --> E2["Certificate + Finished"]
E2 --> D2["Finished + AppData"]
end
2.2 TLS 1.3 完整握手流程
sequenceDiagram
participant C as Client
participant S as Server
Note over C,S: 1-RTT 握手
C->>S: ClientHello<br/>+ Supported Groups<br/>+ Key Share<br/>+ Signature Algorithms
S->>C: ServerHello<br/>+ Key Share
S->>C: EncryptedExtensions
S->>C: Certificate
S->>C: CertificateVerify
S->>C: Finished
C->>S: Finished
Note over C,S: 握手完成,开始加密通信
C->>S: Application Data (加密)
S->>C: Application Data (加密)
2.3 0-RTT 握手
# TLS 1.3 0-RTT 早期数据# 用于 HTTP/3 QUIC 场景early_data = tls_session.early_data # 加密应用数据三、TLS 1.3 vs 1.2
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手RTT | 2-RTT | 1-RTT |
| 0-RTT | 不支持 | 支持 |
| RSA 密钥交换 | 支持 | 废弃 |
| CBC 模式 | 支持 | 废弃 |
| AEAD | 可选 | 必须 |
四、证书与 PKI
4.1 证书链验证流程
flowchart TB
subgraph Browser["浏览器证书验证"]
direction TB
A["收到服务器证书"] --> B{"检查证书有效期"}
B -->|过期| C1["证书过期错误"]
B -->|有效| D{"检查域名匹配"}
D -->|不匹配| C2["域名不匹配"]
D -->|匹配| E{"检查证书吊销<br/>CRL/OCSP"}
E -->|已吊销| C3["证书已吊销"]
E -->|有效| F{"验证签名链"}
F --> G["Intermediate CA 签名验证"]
G --> H{"Root CA 在信任库?"}
H -->|否| C4["未知颁发者"]
H -->|是| I["证书有效"]
end
4.2 证书链结构
graph TB
subgraph TrustStore["操作系统/浏览器信任库"]
Root["Root CA<br/>DigiCert/Let's Encrypt<br/>自签名, 预置信任"]
end
subgraph PKI["PKI 层级"]
Root --> Int1["Intermediate CA 1"]
Root --> Int2["Intermediate CA 2"]
Int1 --> Leaf1["Server Certificate<br/>example.com"]
Int2 --> Leaf2["Server Certificate<br/>api.example.com"]
end
style Root fill:#90EE90
style TrustStore fill:#E8E8E8
4.3 证书验证代码
# OpenSSL 证书验证示例import ssl
context = ssl.create_default_context()context.check_hostname = Truecontext.verify_mode = ssl.CERT_REQUIRED
# 自定义 CA 证书context.load_verify_locations("ca-bundle.crt")五、HSTS 与安全头
5.1 HSTS 配置
# Nginx 配置 Strict-Transport-Securityadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";5.2 安全响应头
| 头 | 说明 |
|---|---|
| Strict-Transport-Security | 强制 HTTPS |
| Content-Security-Policy | XSS 防护 |
| X-Frame-Options | 点击劫持防护 |
| X-Content-Type-Options | MIME 类型嗅探防护 |
六、证书固定 (Certificate Pinning)
6.1 HPKP 固定
# 证书指纹固定PINNED_CERT = "sha256/xxxxxxxxxx=="七、TLS 常见问题
| 问题 | 解决方案 |
|---|---|
| 证书过期 | 自动化续期 (Let’s Encrypt) |
| 中间人攻击 | 证书链验证 |
| 协议降级 | 禁用 TLS 1.0/1.1 |
| 弱密码套件 | 强制 TLS 1.3 |
八、总结
TLS 1.3 是现代 HTTPS 的标准,提供更强的安全性和简化的握手流程。
参考资料
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
TLS 与 HTTPS 协议:加密传输
https://blog.souloss.com/posts/web/tls-and-https-protocols/ 部分信息可能已经过时
相关文章 智能推荐
1
WebSocket 协议:双向通信
网络 深度解读 WebSocket 协议——握手流程、帧格式、心跳机制、代理穿透
2
为 Web 应用构建可扩展的访问控制能力
网络 深入探讨 Web 应用访问控制体系的设计——RBAC(基于角色)与 ABAC(基于属性)模型对比、混合策略的工程实现,以及代码层面的权限中间件、动态策略引擎的落地方案。
3
TLS 1.3 握手详解
密码学与安全工程 深入 TLS 1.3——握手流程、0-RTT、密钥派生、与 TLS 1.2 对比。
4
TLS 握手实战:从自建 CA 到抓包分析
密码学与安全工程 综合性实战——从零构建 PKI 证书体系、配置 TLS 服务器、用 s_client 和 Python 分析 TLS 1.3 与 TLS 1.2 握手的每一个细节。
5
HTTP/1.0:扩展协议
web 在 HTTP/0.9 的基础上,探索 HTTP/1.0 引入的核心新特性——请求头与响应头、状态码、多种 HTTP 方法(GET/POST/HEAD),并动手实现一个支持 HTTP/1.0 的 Python 服务器。






