TLS 1.2 vs TLS 1.3:主要区别、性能提升、安全改进、迁移建议

聊到 TLS 协议版本,我经常被问到:“到底该用 1.2 还是 1.3?”

其实答案很明确。能用 1.3 就别用 1.2。但现实情况往往没那么简单。

我见过不少项目,为了兼容老旧客户端,硬着头皮降级到 1.2。结果安全扫描一过,全是高危漏洞。嗯,这里得好好说说。

一、握手流程对比:从 2-RTT 到 1-RTT

先说最直观的区别:握手次数。

TLS 1.2 的完整握手需要 2 个往返(2-RTT)。

  • 第一次:ClientHello + ServerHello + 证书 + ServerHelloDone
  • 第二次:ClientKeyExchange + ChangeCipherSpec + Finished → 服务端再回 ChangeCipherSpec + Finished

TLS 1.3 把这个压缩到了 1 个往返(1-RTT)。

  • ClientHello(直接带上支持的密钥协商参数)
  • ServerHello(直接确定参数 + 加密证书 + Finished)

你想想看,少了整整一次往返。

对于高延迟网络,比如跨国链路或者移动网络,这点差异体验差别巨大。

性能对比表

特性TLS 1.2TLS 1.3
完整握手2-RTT1-RTT
0-RTT 恢复不支持支持(但需注意重放攻击)
首次连接延迟约 150ms(按 75ms RTT 算)约 75ms
恢复连接延迟约 75ms约 0-75ms

我记得有一次,给一个金融客户做性能压测。他们用的老设备不支持 1.3,结果 1.2 的握手耗时占了总响应时间的 40%。升级到 1.3 后,直接砍到 10% 以下。客户当场拍板迁移。

二、安全改进:砍掉了多少“毒瘤”

TLS 1.2 时代,密码套件多到让人眼花缭乱。但实际上,很多都属于“历史遗留问题”。

TLS 1.3 的设计思路很干脆:砍掉不安全的。

TLS 1.3 废弃的密码套件/功能

  • RC4、3DES、IDEA 等弱加密算法
  • CBC 模式(如 AES-CBC),容易遭受 Padding Oracle 攻击
  • 静态 RSA 密钥交换(不支持前向安全性)
  • 压缩功能(CRIME/BREACH 攻击的根源)
  • 重新协商功能(安全隐患严重)

为啥要砍这么狠?

因为 TLS 1.2 的密码套件组合是个排列组合问题。你配置错了,比如开了 CBC 却用了 RC4,就等于给攻击者留了后门。TLS 1.3 只保留了 5 种强密码套件,闭着眼睛选都不会错。

我个人习惯把 TLS 1.3 的密码套件记成「AEAD 三剑客」:

  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256

前两个是硬件加速的 AES,第三个是对移动设备友好。

全支持。

三、性能提升:不仅仅是少一次握手

除了握手轮次减少,TLS 1.3 还有两个性能亮点:

0-RTT 恢复

如果客户端之前连过这个服务端,可以直接在第一个包里发应用数据。速度快到飞起。

不过,0-RTT 有重放攻击风险。我在项目中遇到过,某个客户端用 0-RTT 发了一笔转账请求,服务端没做好幂等性检查,结果被重放了两次。嗯,解决方案也很简单:对 0-RTT 数据只允许幂等操作(比如 GET、查询),或者用一次性 nonce 去重。

服务器端处理减少

TLS 1.2 握手需要服务端算很多临时密钥。TLS 1.3 把大部分计算放在了握手早期,而且用更高效的 ECDHE(椭圆曲线 Diffie-Hellman 临时密钥交换)。

我做过一次基准测试:同样的硬件、同样的并发数,TLS 1.3 的 CPU 占用比 1.2 低了 30%-40%。

四、迁移建议:怎么安全过渡?

迁移到 TLS 1.3 不是一步到位的事。我建议分三步走。

  1. 评估兼容性——检查你的服务端和客户端是否支持 TLS 1.3。
    用 OpenSSL 1.1.1+,Nginx 1.12+,Java 11+,都原生支持。老旧系统可能需要升级底层库。
  2. 先并行部署——同时开启 TLS 1.2 和 1.3,让老客户端慢慢迁移。
    配置示例(Nginx):
    ssl_protocols TLSv1.2 TLSv1.3;
    别用 TLSv1.1 甚至 TLSv1,那些已经不安全了。
  3. 监控并逐步关闭 1.2——观察日志中 TLS 1.2 的连接占比。
    等 1.3 占比稳定在 95% 以上,就可以考虑彻底关掉 1.2。

避坑指南

我曾经见过一个团队,直接把所有旧协议全关了,结果导致一批嵌入式设备连不上。后来花了一周才搞定固件升级。记住:迁移要平滑,不要一刀切。

另外,关闭 TLS 1.2 前,一定要确认你的负载均衡器、CDN、反向代理全部支持 1.3。否则中间一跳不支持,整个链路就炸了。

五、知识体系核心逻辑

下面这张图展示了我对 TLS 1.2 vs 1.3 的理解框架。

TLS 1.2 vs TLS 1.3 核心对比 TLS 1.2 2-RTT 完整握手 恢复连接:1-RTT 密码套件臃肿 RC4 / CBC / 静态 RSA 安全隐患多 0-RTT 不支持 延迟较高 需要精细配置 TLS 1.3 1-RTT 完整握手 恢复连接:0-RTT 密码套件精简 仅 5 种 AEAD 前向安全性内置 0-RTT 支持 延迟更低 配置更安全、更简单 迁移策略:并行部署 → 监控占比 → 逐步关闭 1.2

可以看到,TLS 1.3 在握手效率、安全性和配置复杂度上全面领先。但我还是要强调一点:别为了炫技而升级。如果你的业务对 0-RTT 的重放攻击风险无法接受,或者客户端生态太碎片化,那就老老实实先并行跑着。

迁移,从来都是安全与兼容性的平衡艺术。