一、什么是 TLS?
TLS 的全称是 传输层安全协议 。它的前身是网景公司开发的 SSL。
你可以把它理解为互联网上的"保镖"或"装甲运输车"。当你在网上进行任何需要保密的操作时(比如登录网银、在线支付、查看邮件),TLS 就在背后默默工作,确保两点:
-
保密性:你发送和接收的数据都被加密,任何中间人截获到的都只是一堆乱码。
-
完整性:数据在传输过程中没有被篡改。
-
身份验证:你能确认你正在通信的网站就是它声称的那个网站,而不是一个钓鱼网站。
简单来说,TLS 为原本明文的互联网通信套上了一个安全的管道。
二、为什么我们需要 TLS?(解决的问题)
在没有 TLS/SSL 的时代,互联网通信使用明文协议(如 HTTP、FTP)。这带来了巨大的安全风险:
-
窃听:黑客在同一个Wi-Fi下,可以轻易地看到你浏览的所有网页内容、输入的密码和信用卡号。
-
篡改:中间人可以修改你收到的数据,比如在软件下载链接中植入病毒。
-
冒充:攻击者可以伪装成你想要的访问的网站(例如假网银),骗取你的凭证。
TLS 就是为了从根本上解决这些问题而诞生的。
三、TLS 的核心概念
要理解 TLS 如何工作,需要先了解几个核心概念:
-
非对称加密
-
原理:使用一对密钥(公钥和私钥)。公钥是公开的,用于加密数据;私钥是秘密保存的,用于解密数据。用公钥加密的数据,只有对应的私钥才能解开。
-
特点:计算复杂,速度慢。主要用于安全地交换对称加密的密钥。
-
类比:公钥就像一个打开的挂锁,任何人都可以拿来锁上箱子;但只有拥有私钥(唯一一把钥匙)的人才能打开箱子。
-
-
对称加密
-
原理:加密和解密使用同一把密钥。
-
特点:计算简单,速度快。主要用于加密实际传输的应用数据。
-
类比:就像一个需要同一把钥匙开锁和上锁的保险箱。
-
-
数字证书与CA
-
问题 :如何确保你拿到的公钥确实是来自
www.bank.com,而不是黑客伪造的? -
解决方案 :数字证书。它就像一个网站的"数字身份证",里面包含了网站的信息、公钥,并由一个受信任的第三方机构------证书颁发机构 用其私钥进行签名。
-
流程:你的浏览器(或操作系统)内置了信任的 CA 列表。当网站出示其证书时,浏览器会用内置的 CA 公钥去验证证书的签名。如果验证通过,就证明这个证书是可信的,里面的公钥也是可信的。
-
-
散列函数
-
原理:将任意长度的数据映射为固定长度的、唯一的"指纹"(散列值)。
-
特点:单向性(无法从散列值反推原始数据)、雪崩效应(原始数据微小改动,散列值变化巨大)。
-
用途:在 TLS 中用于确保数据的完整性(消息验证码 MAC)和协议本身的安全。
-
四、TLS 握手详解(核心流程)
这是 TLS 最精妙的部分。我们以最常见的 RSA 握手流程 为例,分解其步骤:
TLS 1.2 握手流程图 (基于 RSA)
这是最经典的握手模式,它需要两次往返(2-RTT)。

目标:客户端与服务器安全地协商出后续用于对称加密的"会话密钥"。
步骤:
-
Client Hello
-
客户端向服务器发送信息,包括:
-
支持的 TLS 版本号(如 TLS 1.2, TLS 1.3)。
-
客户端生成的随机数。
-
支持的密码套件列表。
-
支持的压缩方法等。
-
-
-
Server Hello
-
服务器回应客户端,包括:
-
选定的 TLS 版本号。
-
服务器生成的随机数。
-
从客户端列表中选择的一个密码套件。
-
服务器的数字证书。
-
-
-
证书验证
-
客户端验证服务器的证书:
-
检查证书是否由可信的 CA 签发(链式验证)。
-
检查证书是否在有效期内。
-
检查证书中的域名是否与正在访问的域名一致。
-
-
如果验证失败,浏览器会弹出严重警告。
-
-
Premaster Secret 生成与加密
-
客户端再生成一个随机数,称为 "预主密钥"。
-
客户端使用服务器证书中的公钥加密这个"预主密钥",然后发送给服务器。
-
-
服务器解密 Pre-master Secret
-
服务器用自己的私钥解密,得到"预主密钥"。
-
至此,客户端和服务器都拥有了三个随机数:Client Random, Server Random, Pre-master Secret。
-
-
生成会话密钥
-
客户端和服务器分别 使用相同的算法(如 PRF),将三个随机数混合计算,生成相同的**"主密钥"**。
-
再根据"主密钥"派生出后续通信中实际用于对称加密和完整性验证的会话密钥。
-
-
就绪确认
-
客户端和服务器相互发送一条"Finished"消息,这条消息是用刚刚生成的会话密钥加密的,内容包含之前所有握手信息的摘要。
-
对方收到后,解密并验证摘要是否正确。这一步同时验证了握手过程是否被篡改,以及密钥协商是否成功。
-
-
安全通信开始
- 握手完成!此后,所有的应用程序数据(HTTP、FTP等)都将使用协商好的会话密钥进行对称加密和解密。
核心思想 :使用非对称加密的安全特性来安全地交换一个对称加密的密钥,然后利用对称加密的高效性来加密实际数据。
五、TLS 1.2 与 TLS 1.3 的重大区别
TLS 1.3(于2018年发布)是当前的最新版本,相比 TLS 1.2(2008年),它进行了重大改进,主要目标是 更安全、更快速。
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手速度 | 需要 2-RTT | 仅需 1-RTT(甚至 0-RTT),延迟大幅降低。 |
| 密码套件 | 支持大量过时、不安全的算法(如 RSA、静态DH、RC4、SHA-1等)。 | 大幅精简,只保留经过验证安全的现代算法(如 AEAD、ECDHE)。 |
| 密钥交换 | 支持静态 RSA,存在前向安全问题。 | 默认使用(EC)DHE ,提供前向安全。 |
| 握手过程 | 协商过程复杂,易受降级攻击。 | 简化并加密了大部分握手内容,能有效抵抗降级攻击。 |
| 工作方式 | 完整的握手流程(见上文)。 | 1-RTT 握手 :客户端在 Client Hello 中就"猜测"服务器会支持的密钥交换参数,并直接发送自己的公钥,大大减少了来回通信的次数。 |
前向安全:即使服务器私钥在未来某天被泄露,黑客也无法解密之前截获的通信记录,因为每次会话的临时密钥都是独立的。
TLS 1.3 的设计目标非常明确:更快的速度 和更强的安全。它主要通过以下两大革新来实现:
-
简化的握手流程 (1-RTT 和 0-RTT)
-
TLS 1.2 及之前 :完成一个完整的握手需要 2次往返(2-RTT)。
-
TLS 1.3 的默认模式 :将握手过程精简到只需 1次往返(1-RTT) 。实现这一点的关键在于,客户端在第一次打招呼 (
ClientHello) 时,就直接带上密钥交换所需的参数,省去了等待服务器选择算法后再响应的步骤。 -
更快的 0-RTT 模式 (零往返) :如果客户端之前连接过该服务器,它可以在首次握手的消息中,就直接携带加密过的应用数据 。这对于刷新页面、重连等场景意义重大,能显著降低延迟,感觉就像"秒连"一样。
-
-
加密算法的精简与强化
TLS 1.3 做了一次彻底的"瘦身",果断移除了所有已知存在安全风险的旧加密算法,例如:
-
RSA 密钥传输(缺乏前向保密)
-
CBC 模式密码
-
RC4 流密码
-
SHA-1 哈希函数
-
等等
这样一来,协议本身更简洁,也从根本上杜绝了因错误配置旧算法而导致的安全漏洞。
-
🛡️ TLS 1.3 的安全性
你可能会问,这么快,安全吗?答案是:在提供极致速度的同时,TLS 1.3 的安全性不降反升。
-
前向保密成为标配 :TLS 1.3 强制使用诸如 ECDHE 这类具有前向保密特性的密钥交换算法 。这意味着即使服务器私钥在未来某天被泄露,黑客也无法解密之前截获的通信数据。
-
0-RTT 模式的风险与应对 :这是唯一需要关注的安全点。0-RTT 数据存在重放攻击 的风险 ,即攻击者可能截获并重复发送你首次握手时携带的数据。
-
风险范围:这种攻击通常只能影响幂等操作(如重复的查询请求),难以直接窃取会话或注入恶意代码。
-
解决方案:协议层面提供了缓解机制,服务器可以识别并拒绝可能的重放数据。对于关键操作(如登录、支付),应用层应避免使用 0-RTT,或通过 token 等机制进行额外防护 。
-
总体而言,TLS 1.3 在强安全模型下的分析结果是乐观的 ,其设计和实现经受住了严格的检验
TLS 1.3 握手流程图 (1-RTT 模式)
TLS 1.3 通过精简和优化,将握手缩短到了一次往返(1-RTT)

关键点解析:
-
1-RTT: 客户端在第一次
ClientHello中就"猜测"并发送了密钥共享参数,服务器在ServerHello中立即回应,将密钥交换与协商合并,极大地减少了延迟。 -
前向安全: 默认使用基于迪菲-赫尔曼的密钥交换,每次会话的临时密钥都是独立的,提供了前向安全性。
-
简化与加密: 握手过程大幅简化,并且从
ServerHello之后的消息就开始加密,隐藏了证书等敏感信息,更能抵抗窃听和降级攻击。
如果客户端"猜"错了,服务器没有它提供的那些加密方式怎么办?
TLS 1.3 的设计者们当然考虑到了这一点,并为此设计了一个非常巧妙的"回退机制 ",通常被称为 HelloRetryRequest。
解决方案:HelloRetryRequest (你好,重试请求)
当服务器在 ClientHello 中没有找到自己能支持的密钥交换参数时,它不会直接让握手失败,而是会发起一次"重试"。
具体流程如下:
-
客户端 :发送
ClientHello,其中包含了自己支持的密钥共享参数(例如,提供了Group A和Group B的公钥)。 -
服务器 :检查后发现,自己既不支持
Group A也不支持Group B,但它发现客户端在密码套件列表里是支持Group C的。 -
服务器发送 HelloRetryRequest :服务器会回复一个特殊的消息 ------
HelloRetryRequest。这条消息本质上是一个"修正指令",告诉客户端:- "你提供的密钥参数我都不支持,请改用
Group C重新发起握手。"
- "你提供的密钥参数我都不支持,请改用
-
客户端重新发送 ClientHello :客户端收到
HelloRetryRequest后,会重新构造一个ClientHello消息,这次它会乖乖地包含服务器指定的Group C的密钥共享参数。 -
正常继续 :服务器收到新的
ClientHello,发现有了自己需要的Group C参数,于是握手就可以正常继续下去了。

这对性能和安全有什么影响?
-
性能影响:
-
如果发生了
HelloRetryRequest,那么整个握手过程就会从理想的 1-RTT 变成 2-RTT。 -
但是,这种情况在实践中非常罕见! 因为互联网上主流和推荐的密钥交换算法(如 X25519, P-256)已经高度统一。客户端在第一次请求时发送的通常就是这些最常用的参数,所以"猜错"的概率很低。
-
因此,TLS 1.3 在绝大多数情况下都能享受 1-RTT 的低延迟,仅在极少数配置不匹配的情况下回退到和 TLS 1.2 类似的 2-RTT。这是一个"用极小的性能风险,换取了巨大的普遍性能提升"的聪明设计。
-
-
安全影响:
-
这个回退机制是协议内明确定义的,不是降级攻击 。
HelloRetryRequest消息本身是明文的,但之后的所有通信安全性与正常的 1-RTT 握手无异。 -
它同样具备前向安全等所有安全特性。
-
核心思想总结
你可以把这个机制理解为:
客户端在第一次打招呼时,做了一个"最优猜测"。如果猜对了,大家一拍即合,一次握手成功。如果猜错了,服务器会说'不对,重来,用这个!',客户端就重新用正确的参数再试一次。
这确保了 TLS 1.3 在追求极致速度的同时,并没有牺牲兼容性和灵活性。它巧妙地平衡了"多数情况下的高性能"与"少数情况下的兼容性"问题。
六、TLS 的应用场景
TLS 远不止用于浏览网页。
-
HTTPS: = HTTP + TLS,是 TLS 最广为人知的应用。
-
邮件传输:SMTPS, IMAPS, POP3S。
-
VPN:一些VPN协议基于TLS。
-
即时通讯:WhatsApp, Signal 等应用的消息加密。
-
VoIP:加密语音通话。
-
API 通信:现代微服务和移动应用后端API都使用TLS加密。
-
物联网:保护IoT设备与云端的通信。
总结
TLS 是现代互联网安全的基石。它通过巧妙的密码学组合:
-
使用数字证书进行身份验证,防止冒充。
-
使用非对称加密安全交换密钥,为后续通信奠定基础。
-
使用对称加密处理业务数据,保证效率和性能。
-
使用散列算法保证数据完整性,防止篡改。
从 TLS 1.2 到 TLS 1.3 的演进,体现了安全领域"去芜存菁"的思路,在提升安全性的同时,也优化了性能,确保了互联网既能高效运转,又能保护每个人的隐私和数据安全。