TLS 协议基础:从 SSL 到 TLS 的演进
做安全配置这么多年,我见过不少团队还在跑 TLS 1.0,甚至还有在用 SSL 3.0 的。每次看到我都忍不住多说两句——兄弟,该升级了。今天咱们就从根上捋一捋,TLS 到底是什么,版本之间差在哪儿,又是怎么在 HTTPS 里撑起安全大旗的。
1.1 发展历史:SSL 的诞生与 TLS 的继承
故事要从 90 年代说起。Netscape 当年为了给 Web 加把锁,搞出了 SSL(Secure Sockets Layer)。SSL 1.0 内部用,压根没公开。真正露脸的是 SSL 2.0,1995 年发布。那会儿我刚入行,还在写 CGI 脚本,根本不懂这玩意儿。后来 SSL 3.0 在 1996 年出来,修复了一大堆漏洞,成了事实标准。
到了 1999 年,IETF 接手了这件事,把 SSL 3.0 做了标准化,改名叫 TLS 1.0。说白了,TLS 1.0 就是 SSL 3.0 的升级版,只是换了身马甲。所以很多人混着叫 SSL/TLS,其实不对。2006 年 TLS 1.1 出来,加了些保护机制;2008 年 TLS 1.2 发布,成了过去十几年最主流的版本;2018 年 TLS 1.3 终于落地,把安全和性能都推到了新高度。
关键节点一览:
- 1995 – SSL 2.0(已废弃,严禁使用)
- 1996 – SSL 3.0(2015 年被 RFC 7568 正式禁用)
- 1999 – TLS 1.0(RFC 2246)
- 2006 – TLS 1.1(RFC 4346)
- 2008 – TLS 1.2(RFC 5246)
- 2018 – TLS 1.3(RFC 8446)
⚠️ 重要提醒: 我曾经在审计一个客户系统时,发现他们生产环境还在用 SSL 3.0。POODLE 攻击已经公开多年,那台机器等于裸奔。赶紧关掉,顺手写了个整改报告。记住:任何 SSL 版本 + TLS 1.0/1.1 都不应该出现在现代互联网服务中。
1.2 版本差异:TLS 1.0 到 1.3 到底变了什么
你可能会问,版本号跳了三次,每次改了什么?我习惯按几个维度对比:密码套件、握手流程、安全强度。下面这张表帮你快速看明白。
| 特性 | TLS 1.0 | TLS 1.1 | TLS 1.2 | TLS 1.3 |
|---|---|---|---|---|
| 发布年份 | 1999 | 2006 | 2008 | 2018 |
| 核心加密 | RSA、3DES、RC4 | RSA、3DES、RC4(CBC 攻击被修复) | AES-GCM、ECDHE、RSA | AEAD 唯一(AES-GCM、ChaCha20-Poly1305) |
| 握手次数 | 2-RTT | 2-RTT | 2-RTT | 1-RTT(0-RTT 可选) |
| 前向保密 | 不支持(仅 RSA 密钥交换) | 不支持(但 DHE 可选) | 强烈推荐 ECDHE | 强制(所有密钥交换必须提供 PFS) |
| 已知攻击 | BEAST、Lucky13 | Lucky13(部分缓解) | SLOTH、POODLE(需禁用旧套件) | 极少数实现漏洞,协议本身安全 |
为什么 TLS 1.3 这么强?因为它砍掉了所有老旧、不安全的密码套件,只保留 AEAD 加密、ECDHE 密钥交换,而且握手从 2 轮减少到 1 轮。我去年帮一个电商平台迁移到 1.3,页面首屏加载直接快了快 100 毫秒。你想想看,加密反而更快,这才是现代协议该有的样子。
💡 小经验: 如果你还在用 TLS 1.2,至少保证密码套件里只有 ECDHE + AES-GCM 这种现代组合。别把 RC4、CBC 模式或者 3DES 放进去——这些我在国内一家银行系统里见过,服务商居然说“跑了好多年没问题”。没问题只是还没出事而已。
1.3 TLS 在 HTTPS 中的地位
说到 HTTPS,其实就是 HTTP 跑在 TLS 之上。TLS 负责加密通道,HTTP 照常发请求。没有 TLS,HTTPS 就是个空壳子。网上购物、网上银行、登录密码——所有这些敏感信息都是靠 TLS 保护的。
记得有一次,我接到一个紧急排查:客户网站刚上了 HTTPS,但安全扫描报出“弱 TLS 版本”。过去一看,配置里居然启用了 TLS 1.0,而且密码套件里还有 EXPORT 级别的弱密码。管理员一脸无辜:“我用的云厂商默认配置啊。”嗯,默认配置往往为了兼容性,砍得太少。所以我自己做 TLS 配置时,永远会先显式禁用 TLS 1.0/1.1,只留 1.2 和 1.3。
# nginx 配置示例(只允许 TLS 1.2 和 1.3)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
这段配置写进去,重启 nginx,SSL Labs 评分就能冲到 A+。注意,ssl_prefer_server_ciphers 我建议打开,虽然现代客户端都支持服务端选择的套件,但保险起见还是加上。
一句话总结 TLS 和 HTTPS 的关系: HTTPS = HTTP + TLS。TLS 是安全基石,没有它,URI 里的那个 'S' 就是个摆设。
从上图可以清楚看到,TLS 就是个中间层。它把 HTTP 的明文包进去,再交给 TCP 发出去。接收端先解密,再把明文给 HTTP。这个过程对上层应用完全透明——你写 PHP、Java、Node.js 都感觉不到,配置对了就行。
最后提醒一句:别以为配了 HTTPS 就万事大吉。很多公司只装了证书,但 TLS 版本和密码套件还是“出厂设置”。我见过最离谱的,TLS 1.0 开着,密码套件里还有 NULL 加密 —— 等于是用铁皮箱子装了一堆透明玻璃。老老实实按照指南关掉不该开的,只上 1.2 和 1.3,这才是正道。