TLS/SSL 基础原理:对称加密与非对称加密、数字证书、CA 机构、TLS 握手过程详解

在配置 ThingsBoard 的 HTTPS 之前,必须理解 TLS/SSL 协议的核心机制。TLS(传输层安全协议)是 HTTPS 的安全基石,它通过混合加密体系、数字证书和握手流程,解决互联网通信中的机密性、完整性和身份验证三大问题。

2.1 对称加密与非对称加密

TLS 并非只使用一种加密算法,而是结合了对称加密与非对称加密的优点,形成“混合加密”方案。

特性 对称加密 非对称加密
密钥数量 加密和解密使用同一个密钥 使用一对密钥:公钥(公开)和私钥(保密)
计算速度 非常快,适合大量数据加密 慢(比对称加密慢 100~1000 倍)
典型算法 AES、ChaCha20、3DES RSA、ECDSA、Ed25519
密钥分发 需要安全的带外信道传递密钥 公钥可公开传输,私钥本地保管
TLS 中的角色 加密实际的 HTTP 数据(会话数据) 加密传输对称密钥(密钥交换)
关键理解: 非对称加密用于握手阶段安全地交换对称密钥,后续所有应用数据使用对称加密传输。这种设计既保证了密钥分发的安全性,又兼顾了大数据量加密的性能。

2.2 数字证书与 CA 机构

非对称加密解决了密钥分发问题,但带来了新的挑战:你拿到的公钥真的是服务器的公钥吗? 数字证书和 CA(证书颁发机构)正是为了解决这个身份验证问题而存在。

数字证书的核心内容

一个 X.509 数字证书包含以下关键字段:

  • 主体(Subject):证书持有者的身份信息,如域名(CN=thingsboard.example.com)
  • 公钥:服务器或客户端的公钥值
  • 颁发者(Issuer):签发该证书的 CA 机构名称
  • 有效期:证书的生效和过期时间
  • 签名:CA 使用自己的私钥对证书内容生成的数字签名
  • 序列号:CA 为该证书分配的唯一编号

CA 机构的信任链

CA 是受信任的第三方机构,负责验证申请者的身份并签发证书。浏览器和操作系统内置了受信任的根 CA 列表。验证流程如下:

  1. 服务器在 TLS 握手时发送自己的证书(叶子证书)。
  2. 客户端检查证书的颁发者,找到对应的中间 CA 证书。
  3. 逐级向上验证,直到根 CA 证书(自签名,受信任锚点)。
  4. 使用上级 CA 的公钥验证下级证书的数字签名。
  5. 验证域名、有效期、是否被吊销。
ThingsBoard 实践提示: 生产环境建议使用 Let's Encrypt 等公共 CA 签发的证书,客户端自动信任。开发或内网环境可使用自签名证书,但需要在每个客户端手动导入信任。
数字证书信任链结构 根 CA 自签名 · 受信任锚点 中间 CA 由根 CA 签发 服务器证书 由中间 CA 签发 签发 签发 验证方向:客户端从服务器证书 → 中间 CA → 根 CA,逐级验证签名 任何一级签名验证失败或证书过期,浏览器将显示安全警告

2.3 TLS 握手过程详解

TLS 握手是客户端和服务器在传输任何应用数据之前,协商加密参数、验证身份并生成会话密钥的过程。以最常用的 TLS 1.3 为例,握手流程大幅简化,只需 1 个往返(1-RTT)。

TLS 1.3 握手步骤

  1. ClientHello:客户端发送支持的 TLS 版本、密码套件列表、随机数(client_random)和密钥交换参数(如 ECDHE 公钥)。
  2. ServerHello + 证书:服务器选择 TLS 版本和密码套件,发送自己的随机数(server_random)、密钥交换参数、证书链和数字签名。
  3. 密钥计算:双方使用 ECDHE 密钥交换算法,结合 client_random 和 server_random,独立计算出相同的会话密钥。
  4. Finished 消息:双方发送加密的 Finished 消息,包含之前所有握手消息的摘要,用于验证握手未被篡改。
  5. 安全通道建立:握手完成,开始使用对称密钥加密应用数据。
重要安全概念: 前向安全性(Forward Secrecy)—— 即使服务器私钥泄露,攻击者也无法解密之前记录的 TLS 会话数据。TLS 1.3 强制使用 ECDHE 密钥交换,确保前向安全。ThingsBoard 配置 HTTPS 时,应优先选择支持 ECDHE 的密码套件。
TLS 1.3 握手流程 客户端 服务器 ① ClientHello TLS 版本 · 密码套件 · client_random · ECDHE 公钥 ② ServerHello + 证书 选定版本 · server_random · ECDHE 公钥 · 证书链 · 签名 ③ 密钥计算 双方独立计算会话密钥 ④ Finished(加密) 包含握手消息摘要,验证完整性 ⑤ 安全通道建立 开始加密传输应用数据 TLS 1.3 相比 TLS 1.2 减少了 1 个往返(1-RTT vs 2-RTT),并移除了不安全的密码套件 0-RTT 模式允许在重连时立即发送数据,但需注意重放攻击风险

2.4 密码套件与算法选择

密码套件(Cipher Suite)是一组算法的组合,决定了 TLS 握手和加密的具体实现方式。一个典型的密码套件名称如 TLS_AES_128_GCM_SHA256 包含:

  • 密钥交换算法:TLS 1.3 中由协商机制决定,通常为 ECDHE
  • 认证算法:ECDSA 或 RSA 签名
  • 对称加密算法:AES-128-GCM 或 ChaCha20-Poly1305
  • 哈希算法:SHA256 或 SHA384
ThingsBoard 推荐配置: 在 ThingsBoard 的 JVM 参数或反向代理(Nginx)中,优先启用以下密码套件:TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256。禁用 RC4、3DES、CBC 模式等不安全算法。

2.5 本章小结