TLS/SSL 加密概述
TLS/SSL 加密概述
本节介绍 TLS/SSL 加密协议的核心概念和工作原理,以及它在 MQTT 安全通信中的作用。学习完成后,您将能够:
- 理解 TLS 握手过程
- 解释 TLS 如何保护 MQTT 通信
- 区分 TLS 和 SSL 的区别
- 解释 TLS 加密的基本原理
在开始本节之前,请确保:
- 理解 MQTT 安全挑战
- 了解公钥基础设施(PKI)基本概念
- 了解证书和加密的基本概念
TLS vs SSL
Section titled “TLS vs SSL”| 版本 | 发布时间 | 状态 | 说明 |
|---|---|---|---|
| SSL 1.0 | 1994 | ❌ 未发布 | 存在安全缺陷 |
| SSL 2.0 | 1995 | ❌ 已弃用 | 严重安全漏洞 |
| SSL 3.0 | 1996 | ❌ 已弃用 | POODLE 攻击 |
| TLS 1.0 | 1999 | ❌ 已弃用(RFC 8996) | SSL 3.0 升级版 |
| TLS 1.1 | 2006 | ❌ 已弃用 | 安全增强 |
| TLS 1.2 | 2008 | ✅ 推荐 | 当前广泛使用 |
| TLS 1.3 | 2018 | ✅ 推荐 | 最新标准,更快更安全 |
注意:虽然常统称为 “SSL”,现代系统实际使用的是 TLS。ESP32 支持 TLS 1.2 和 TLS 1.3。
TLS Handshake
Section titled “TLS Handshake”完整握手过程
Section titled “完整握手过程”客户端 (ESP32) 服务器 (MQTT Broker) │ │ │ ─── ClientHello ──────────► │ │ (支持的 TLS 版本、加密套件) │ │ │ │ ◄── ServerHello ────────── │ │ (选定的 TLS 版本、加密套件) │ │ │ │ ◄── Certificate ────────── │ │ (服务器证书 + 中间证书) │ │ │ │ ◄── ServerHelloDone ────── │ │ │ │ ─── ClientKeyExchange ────► │ │ (生成预主密钥,用公钥加密) │ │ │ │ ─── ChangeCipherSpec ─────► │ │ (通知切换到加密通信) │ │ │ │ ─── Finished ─────────────► │ │ (加密的握手完成消息) │ │ │ │ ◄── ChangeCipherSpec ───── │ │ ◄── Finished ───────────── │ │ │ │ ═══ 加密通信开始 ══════════► │ │ (所有数据使用会话密钥加密) │握手阶段说明
Section titled “握手阶段说明”| 阶段 | 作用 | 关键信息 |
|---|---|---|
| Hello | 协商参数 | TLS 版本、加密套件、随机数 |
| 证书交换 | 身份验证 | 服务器证书(包含公钥) |
| 密钥交换 | 生成共享密钥 | 客户端用服务器公钥加密预主密钥 |
| 会话密钥 | 建立加密通道 | 双方使用主密钥派生对称加密密钥 |
| 确认 | 验证完成 | 加密传输握手确认消息 |
Certificate Chain
Section titled “Certificate Chain”┌────────────────────────────────────────┐│ 根证书 (Root CA) ││ Let's Encrypt Authority X3 ││ (自签名,嵌入在浏览器/操作系统中) │└────────────────┬───────────────────────┘ │ 签名┌────────────────▼───────────────────────┐│ 中间证书 (Intermediate CA) ││ Let's Encrypt R3 ││ (由根证书签名) │└────────────────┬───────────────────────┘ │ 签名┌────────────────▼───────────────────────┐│ 服务器证书 (Server Cert) ││ *.example.com / mqtt.example.com ││ (由中间证书签名,包含域名和公钥) │└────────────────────────────────────────┘证书文件说明
Section titled “证书文件说明”| 文件 | 格式 | 内容 | 角色 |
|---|---|---|---|
cert.pem | PEM | 服务器证书 | 公开,发给客户端 |
privkey.pem | PEM | 服务器私钥 | 机密,仅服务器持有 |
chain.pem | PEM | 中间证书链 | 公开,辅助客户端验证 |
fullchain.pem | PEM | 服务器 + 中间证书 | 服务器配置用 |
ca_cert.pem | PEM | 根证书 | 客户端预置,验证服务器 |
TLS in MQTT
Section titled “TLS in MQTT”MQTTS (MQTT over TLS)
Section titled “MQTTS (MQTT over TLS)”标准 MQTT: mqtt://broker.example.com:1883 (明文)MQTT over TLS: mqtts://broker.example.com:8883 (加密)TLS 对 MQTT 的保护:
| MQTT 数据 | 未加密 | TLS 加密 |
|---|---|---|
| CONNECT 用户名 | 明文可见 | 加密隐藏 |
| CONNECT 密码 | 明文可见 | 加密隐藏 |
| PUBLISH 消息体 | 明文可见 | 加密隐藏 |
| SUBSCRIBE Topic | 明文可见 | 加密隐藏 |
| 客户端 ID | 明文可见 | 加密隐藏 |
| 消息 Topic | 明文可见 | 加密隐藏 |
ESP32 的 TLS 支持
Section titled “ESP32 的 TLS 支持”| 功能 | 支持情况 |
|---|---|
| TLS 1.2 | ✅ 完整支持 |
| TLS 1.3 | ✅ 支持 (ESP-IDF v4.4+) |
| 加密套件 | AES、CHACHA20、ECDHE |
| 证书验证 | ✅ 支持 |
| 客户端证书 | ✅ 支持 |
| PSK | ✅ 支持(预共享密钥) |
Encryption Algorithms
Section titled “Encryption Algorithms”对称加密 vs 非对称加密
Section titled “对称加密 vs 非对称加密”| 特性 | 对称加密(AES) | 非对称加密(RSA/ECC) |
|---|---|---|
| 密钥 | 同一密钥用于加密和解密 | 公钥加密,私钥解密 |
| 速度 | 🔥 快 | 🐢 慢 |
| 用途 | 加密实际数据 | 交换对称密钥、数字签名 |
| 密钥长度 | 128/256 位 | 2048/4096 位(RSA)或 256 位(ECC) |
| 在 TLS 中的角色 | 批量数据加密 | 握手阶段的密钥交换 |
Pre-sales Key Points
Section titled “Pre-sales Key Points”简化解释给买家
Section titled “简化解释给买家”| 买家问题 | 简化回答 |
|---|---|
| ”TLS 是什么?" | "就像给您的数据加了一个加密信封,只有接收方可以打开" |
| "需要额外硬件吗?" | "不需要,ESP32 本身就支持 TLS 加密,软件配置即可" |
| "会变慢吗?" | "首次连接需要 1-3 秒握个手,之后传输几乎不影响速度" |
| "需要付费吗?" | "Let’s Encrypt 提供免费证书,不需要付费” |
Summary
Section titled “Summary”本节介绍了 TLS 加密的基础知识:
- TLS vs SSL:现代系统使用 TLS,TLS 1.2 和 1.3 是推荐版本
- 握手过程:协商参数 → 证书交换 → 密钥交换 → 加密通信
- 证书链:根 CA → 中间 CA → 服务器证书的信任链条
- MQTTS:MQTT over TLS 使用 8883 端口,加密所有消息内容
- ESP32 支持:完整支持 TLS 1.2/1.3,硬件无需额外成本