tls协议
TLS(Transport Layer Security,传输层安全性协议) 是现代互联网安全的基石。简单来说,它的使命就是给原本“裸奔”的 TCP 流量穿上一层防弹衣。
1. TLS 到底解决了什么问题?
在没有 TLS 的年代(比如纯 HTTP),信息传输面临三大威胁:
- 窃听(Eavesdropping):第三方可以看到你的密码、信用卡号。
- 篡改(Tampering):第三方可以修改你发送的内容。
- 冒充(Impersonation):你以为在和银行通信,其实对方是个钓鱼网站。
TLS 的三个核心特性正是为了对症下药:
- 机密性(Confidentiality):通过对称加密保障内容只有双方能看懂。
- 完整性(Integrity):通过**摘要算法(MAC)**确保内容没被动过。
- 身份认证(Authentication):通过数字证书验证对方的真实身份。
2. TLS 的两阶段工作流程
TLS 的运行可以分为两个关键阶段:握手阶段(Handshake)和记录阶段(Record Protocol)。
第一阶段:握手(协商“保险箱”钥匙)
握手是 TLS 最精彩的部分,其目的是为了在不安全的网络环境下,安全地生成一把只有通信双方知道的对称加密密钥。
以主流的 TLS 1.2 为例(TLS 1.3 进行了简化):
- Client Hello:客户端给服务端打招呼,告诉对方自己支持哪些加密套件(Cipher Suites)和一个随机数 A。
- Server Hello:服务端从中选出一套算法,给回一个随机数 B,并附上自己的数字证书。
- 验证与密钥交换:
- 客户端检查证书是否合法(是否过期、颁发机构是否可信)。
- 如果证书没问题,客户端利用从证书里拿到的公钥,加密第三个**预主随机数(Pre-master Secret)**发给服务端。
- 生成主密钥:双方现在都有了随机数 A、B 和 预主随机数。它们通过特定的函数把这三个数揉在一起,生成最终的对称密钥(Session Key)。
- 确认开启加密:双方互相发一个“Finished”消息,表示以后的聊天都用这把新钥匙加密了。
为什么不全程用非对称加密(公钥/私钥)?
因为非对称加密太慢了!TLS 极其聪明:先用复杂的非对称加密交换钥匙,一旦钥匙换好了,后面大规模的数据传输全部改用极快的对称加密。
非常敏锐的观察!在网络协议的学习中,大家往往会被握手阶段(Handshake Protocol)复杂的数学交换所吸引,而忽略了默默承载数据的记录阶段(Record Protocol)。
如果说握手阶段是“谈生意、定合同”,那么记录阶段就是“正式履行合同、运送货物”。
第二阶段:记录协议(Record Protocol)
记录层位于 TLS 握手协议的下方,直接承载在上层协议(如 HTTP, FTP)和下层传输协议(TCP)之间。它的主要任务是:将上层应用数据安全地封装成一个个“记录包”。
记录阶段的四个关键步骤
当你的浏览器想要发送一段 HTTP 请求(比如 GET /index.html)时,记录层会按顺序执行以下操作:
分段(Fragmentation)
上层数据可能很大,记录层会将其切分成较小的块(每个记录块通常不超过 16KB),以便于处理。压缩(Compression - 可选且现代已弃用)
早期的 TLS 支持在记录层压缩,但由于存在安全漏洞(如 CRIME 攻击),现代 TLS(包括 TLS 1.3)已经禁止了这一步。计算 MAC / 添加认证标签(Integrity)
- 在 TLS 1.2 中:使用握手阶段协商出的密钥和 HMAC 算法为数据计算一个“哈希值”。
- 在 TLS 1.3 中:采用更先进的 AEAD(关联数据的认证加密) 模式。这一步确保了:如果黑客在传输过程中改动了一个比特位,接收方在校验时就会发现。
加密(Encryption)
使用握手阶段生成的对称密钥(如 AES),对“数据 + 认证标签”进行整体加密。此时,数据变成了只有持有钥匙的人才能解开的“密文”。
记录包的结构(抓包视角)
如果你用 Wireshark 观察一个 TLS 记录包,你会发现它通常包含一个简短的头部(Header):
| 字段 | 长度 | 说明 |
|---|---|---|
| Type | 1 Byte | 区分包类型(22 是握手包,23 是应用数据包) |
| Version | 2 Bytes | TLS 版本(如 0x0303 代表 TLS 1.2) |
| Length | 2 Bytes | 后面加密数据的长度 |
| Encrypted Data | 变长 | 真正的加密荷载(含填充和 MAC) |
为什么记录阶段很重要?
- 防重放攻击:记录层会给每个包维护一个隐式的序列号。即使黑客截获了一个合法的加密包并原封不动地再次发送,接收方也会因为序列号对不上而丢弃它。
- 前向安全性:虽然记录阶段使用对称加密,但它依赖于握手阶段产生的临时密钥。
- 效率优化:由于记录块大小上限的存在,TLS 可以在接收到部分数据时就开始解密,而不必等待整个网页下载完,这提升了流式传输的效率。
总结
- 握手阶段:确定算法、交换随机数、验证身份、生成密钥。(逻辑核心)
- 记录阶段:分段、计算校验、加密、增加包头。(执行核心)
3. 数字证书:如何证明“你是你”?
你可能会问:“如果黑客伪造一个服务端发给我公钥怎么办?”
这就是 CA(数字证书认证机构) 的作用。
- CA 签名:服务端会将自己的信息和公钥交给 CA。CA 用自己的私钥对这些信息进行哈希后签名。
- 客户端验证:你的浏览器/系统里内置了这些顶级 CA 的公钥。只要用 CA 的公钥能解开这个签名,就证明这个服务器的身份是经过权威认证的。
4. TLS 1.2 vs 1.3:时代的进步
目前 TLS 1.3 已经非常普及,它相比 1.2 有两个巨大的飞跃:
- 更快的速度(1-RTT):TLS 1.2 握手需要往返两次(2-RTT),而 1.3 只需要一次往返就能建立连接。
- 安全性升级:删除了很多陈旧、不安全的加密算法(比如 MD5, SHA-1, RSA 密钥交换等),强制要求具有**前向安全性(Forward Secrecy)**的算法(如 ECDHE)。
总结
如果用一个生活中的例子来类比:
- TCP 是快递公司,负责把箱子送到目的地。
- TLS 则是你在寄快递前,先和收件人商量好一个复杂的暗号(握手),并把信件放进一个坚固的保险箱里(加密)。即使快递员(黑客)半路截获了箱子,他也打不开,更没法伪造里面的内容。