TLS/SSL 基础概念:你真的了解它们吗?

讲网关加密之前,我觉得有必要先把地基打牢。你可能会说:“TLS 和 SSL 不就是一回事吗?”

嗯,不能说完全错了。但我在项目里见过不少工程师把两者混为一谈,结果排查证书兼容性问题时踩了坑。今天我们就从零开始捋一捋。

TLS 与 SSL:同根生,但别搞混

SSL 是 Netscape 在 90 年代搞出来的。1.0 版本基本没公开,2.0 和 3.0 才是大家常说的“老 SSL”。后来 IETF 接手,把 SSL 3.0 改吧改吧,改名叫 TLS 1.0。说白了,TLS 1.0 == SSL 3.1。

协议 发布年份 现状 我见过的问题
SSL 2.0 1995 已废弃(有严重漏洞) 老设备里还能扫到,必须封禁
SSL 3.0 1996 已废弃(POODLE 攻击) 我曾经在内网遗留系统上被迫维护过……痛苦
TLS 1.0 1999 逐步禁用(BEAST 攻击) PCI DSS 合规检查时被要求关掉
TLS 1.1 2006 逐步禁用 现在大部分浏览器也不认了
TLS 1.2 2008 主流(推荐) 大部分生产环境都在用这个
TLS 1.3 2018 最新(强烈推荐) 握手快了一倍,我在性能调优时尝到了甜头
千万别手软:SSL 2.0/3.0 和 TLS 1.0/1.1 在服务端配置里直接禁用掉。我曾经接手过一个项目,就因为留着 TLS 1.0 导致被扫出 BEAST 漏洞,紧急打补丁折腾了一宿。

TLS 握手协议流程:一句话说不清,但可以画出来

为什么要搞握手?因为双方要在不安全的信道里,安全地协商出一个对称加密密钥。

你自己想想看:如果直接用非对称加密传输所有数据,性能扛不住。如果直接用对称加密,密钥怎么安全地传给对方?

所以 TLS 握手做了三件事:

  • 身份验证——服务器出示证书,证明“我是我”。(可选双向验证)
  • 密钥协商——用非对称加密或 DH 系列算法,安全地交换出对称密钥。
  • 数据加密——后续通信全部走对称加密,快!

下面这张图是我自己梳理的 TLS 1.2 完整握手流程(省略了 Session Resume 分叉),你把它吃透了,后面讲 Termination 就顺了。

TLS 1.2 完整握手流程(简化版) 客户端 (Client) 服务端 (Server) ClientHello ServerHello + Certificate + ServerHelloDone ClientKeyExchange (用证书公钥加密预主密钥) ChangeCipherSpec + Finished 验证 Finished ChangeCipherSpec + Finished 验证 Finished ✅ 握手完成,开始加密通信 说明:实际 TLS 1.2 握手还有 CertificateVerify 等步骤,这里展示核心消息流
小技巧:TLS 1.3 把这个 2-RTT 握手压缩到了 1-RTT,甚至 0-RTT(需要特殊配置)。如果你在做网关加密,强烈建议优先用 TLS 1.3,一来减少延迟,二来砍掉了不少老旧算法,安全风险也小了。

对称加密 vs 非对称加密:一个快一个安全

这个其实是基础中的基础,但我还是想用你自己的话讲透。

对称加密:加密和解密用同一把钥匙。好比你家大门钥匙,自己锁自己开。快,但是怎么把钥匙给对方?

  • 常见算法:AES、ChaCha20、DES(千万别再用)
  • 典型场景:TLS 握手完成后,数据段全部用对称加密,扛得住高并发
  • 我在项目中遇到过:有一次误配了 AES-256-CBC 而没用 GCM 模式,结果被协议检测工具报出弱加密套件,赶紧切成了 AES-256-GCM

非对称加密:公钥加密,私钥解密。你想想看,公钥全世界都能拿到,私钥只有自己藏着。这就解决了密钥分发问题。但是慢,慢到只能用来加密小数据(比如对称密钥)。

  • 常见算法:RSA、ECDH、DHE
  • 典型场景:TLS 握手阶段交换预主密钥(Pre-Master Secret)
特性 对称加密 非对称加密
速度 快(硬件加速后几十 Gbps) 慢(通常 < 1Gbps,取决于密钥长度)
密钥管理 困难(每对通信方需要独立密钥) 容易(公钥公开,私钥保密)
典型算法 AES-256-GCM, ChaCha20-Poly1305 RSA-2048, ECDHE-P256
在TLS中的角色 加密传输数据(大量) 身份认证 + 密钥协商(少量)
核心结论:TLS 就是利用非对称加密的“安全性”来传输对称加密的“钥匙”,之后所有数据都用对称加密跑。这个设计思路也叫“混合加密系统”。理解了这一点,边界网关上的 TLS Termination 原理就懂了一半。

常见误解与避坑

我自己刚开始接触时也迷糊过,这里列几个坑:

  • 证书=加密? 不是。证书只做身份绑定,真正加密靠非对称密钥对里的公钥。
  • TLS 1.2 加密套件越多越好? 大错特错。我曾经见过生产环境配了 30 多个套件,攻击面被撑得巨大。只保留 ECDHE-RSA-AES256-GCM-SHA384 这类强套件就够了。
  • 自签名证书不能用在生产? 不一定。内部服务间通信,如果你有内部 PKI 或自己做 CA,自签名是可以的。但对外暴露的服务千万不能用。
曾经踩过的坑:有一次我优化 HTTPS 性能,把对称加密从 AES-256 降级到了 AES-128 想省 CPU,结果被安全团队拦下了。其实 AES-256 在支持 AES-NI 指令集的 CPU 上几乎不额外耗性能,所以别省这点。保持 256 位,心里踏实。