第1章:为什么我们还在聊一个30年前的协议?
说来有点意思。TLS 协议的历史,其实是一部互联网安全攻防的进化史。我刚入行那会儿,有个老工程师跟我说:搞懂 SSL/TLS,你就懂了一半的网络安全。当时我不信,后来踩了无数坑才明白——他说得一点不夸张。
1.1 从 SSL 到 TLS:一个被迫升级的故事
事情要从 1994 年说起。网景公司为了给网上购物加点安全感,搞出了 SSL 1.0。嗯,这版本没发布过,内部就被毙了。真正面世的是 SSL 2.0,1995 年发布。但这玩意儿漏洞多得跟筛子似的,连基本的消息完整性都保证不了。
SSL 3.0 算是一次重大改进。我记得在 2014 年之前,很多银行系统还在用 SSL 3.0。为什么?因为旧系统不好动。直到 POODLE 漏洞 爆出来,大家才不得不升级。
然后互联网工程任务组 IETF 接手了这项工作。他们改了个名——TLS 1.0,1999 年发布。说白了,TLS 1.0 就是 SSL 3.0 的小改版,内核几乎一样。
关键时间线:
- 1995 — SSL 2.0 发布(已弃用,不要用)
- 1996 — SSL 3.0 发布(2015 年被正式废弃)
- 1999 — TLS 1.0 发布(RFC 2246)
- 2006 — TLS 1.1 发布(RFC 4346)
- 2008 — TLS 1.2 发布(RFC 5246,现在的主流)
- 2018 — TLS 1.3 发布(RFC 8446,当前最新版本)
为什么 TLS 1.2 到现在还是主流?因为 1.3 的部署需要应用层调整。我曾经帮一个客户迁移到 1.3,结果发现他们的负载均衡器不支持——嗯,这就是现实。
1.2 TLS vs SSL:别再搞混了
很多人到现在还管 TLS 叫 SSL。开发同事跟我说「这个 SSL 证书过期了」,我一看,明明是个 TLS 证书。说白了,这是个历史遗留的称呼习惯,但技术上有本质区别。
| 特性 | SSL 3.0 | TLS 1.2 | TLS 1.3 |
| 握手轮次 | 2-RTT | 2-RTT | 1-RTT(0-RTT 复用) |
| 密码套件 | 老旧,不安全 | 支持 AEAD、ECDHE | 强制 AEAD,移除静态 RSA |
| 前向安全性 | 不支持 | 可选 | 强制 |
| SNI 扩展 | 不支持 | 支持 | 支持(加密 SNI 可选) |
| 会话恢复 | Session ID | Session Ticket | PSK + Ticket |
一个小建议:如果你还在配置 SSL 相关的选项,赶紧检查一下。我最近审计一个项目,发现 Nginx 配置里还留着 ssl_protocols SSLv3——浏览器早不支持了,但攻击工具依然可以尝试降级攻击。
1.3 TLS 在现代安全中的地位
你想想看,现在互联网上每一笔交易、每一次登录、每一条消息,只要经过 HTTPS,背后都是 TLS 在兜底。TLS 已经不只是「加密」那么简单了。
TLS 承担了三件事:
- 加密 — 内容只有收件人才能读懂
- 完整性 — 内容没被中间人篡改
- 身份验证 — 你连接的是真的服务器
别看这三点描述起来简单,实现起来门道很多。比如加密强度不够,破解只是时间问题;完整性校验没做好,攻击者可以改数据包。
注意:别以为升级到 TLS 1.3 就万事大吉了。我见过很多团队只升级了协议版本,但证书管理一塌糊涂。证书过期、私钥泄露、弱签名算法——这些坑一个个等着你跳。TLS 是一个链条,任何一节断了都不安全。
这些年,TLS 协议还在不断演进。比如 HTTP/3 基于 QUIC,而 QUIC 的加密层直接借鉴了 TLS 1.3 的握手设计。说白了,TLS 已经变成了底层基础设施,就像 TCP 一样不可或缺。
这张图展示了 TLS 的发展脉络。你能看到一条清晰的路线:老的被淘汰,新的接上来。但现实部署中,很多企业还在用 TLS 1.0。为什么会这样?兼容性包袱太重了。
我在做安全审计时经常遇到这种情况:一个内部系统用了十多年的 HTTPS 接口,客户端是嵌入式设备。升级 TLS 版本?那边设备固件没法升级。这种时候,只能靠反向代理或者隧道做妥协方案。记住,安全是平衡的艺术。
回顾一下:
- 不要用 SSL 任何版本,浏览器都已经不支持了
- TLS 1.0/1.1 也在逐步弃用,PCI DSS 等标准已明确禁止
- 当前推荐:TLS 1.2 + 1.3 双栈部署,逐步淘汰低版本
- TLS 不只是加密,它定义了现代社会数字信任的基础