tls协议

TLS(Transport Layer Security,传输层安全性协议) 是现代互联网安全的基石。简单来说,它的使命就是给原本“裸奔”的 TCP 流量穿上一层防弹衣。


1. TLS 到底解决了什么问题?

在没有 TLS 的年代(比如纯 HTTP),信息传输面临三大威胁:

  • 窃听(Eavesdropping):第三方可以看到你的密码、信用卡号。
  • 篡改(Tampering):第三方可以修改你发送的内容。
  • 冒充(Impersonation):你以为在和银行通信,其实对方是个钓鱼网站。

TLS 的三个核心特性正是为了对症下药:

  1. 机密性(Confidentiality):通过对称加密保障内容只有双方能看懂。
  2. 完整性(Integrity):通过**摘要算法(MAC)**确保内容没被动过。
  3. 身份认证(Authentication):通过数字证书验证对方的真实身份。

2. TLS 的两阶段工作流程

TLS 的运行可以分为两个关键阶段:握手阶段(Handshake)记录阶段(Record Protocol)

第一阶段:握手(协商“保险箱”钥匙)

握手是 TLS 最精彩的部分,其目的是为了在不安全的网络环境下,安全地生成一把只有通信双方知道的对称加密密钥

以主流的 TLS 1.2 为例(TLS 1.3 进行了简化):

  1. Client Hello:客户端给服务端打招呼,告诉对方自己支持哪些加密套件(Cipher Suites)和一个随机数 A
  2. Server Hello:服务端从中选出一套算法,给回一个随机数 B,并附上自己的数字证书
  3. 验证与密钥交换
    • 客户端检查证书是否合法(是否过期、颁发机构是否可信)。
    • 如果证书没问题,客户端利用从证书里拿到的公钥,加密第三个**预主随机数(Pre-master Secret)**发给服务端。
  4. 生成主密钥:双方现在都有了随机数 A、B 和 预主随机数。它们通过特定的函数把这三个数揉在一起,生成最终的对称密钥(Session Key)
  5. 确认开启加密:双方互相发一个“Finished”消息,表示以后的聊天都用这把新钥匙加密了。

为什么不全程用非对称加密(公钥/私钥)?
因为非对称加密太慢了!TLS 极其聪明:先用复杂的非对称加密交换钥匙,一旦钥匙换好了,后面大规模的数据传输全部改用极快的对称加密

非常敏锐的观察!在网络协议的学习中,大家往往会被握手阶段(Handshake Protocol)复杂的数学交换所吸引,而忽略了默默承载数据的记录阶段(Record Protocol)

如果说握手阶段是“谈生意、定合同”,那么记录阶段就是“正式履行合同、运送货物”。


第二阶段:记录协议(Record Protocol)

记录层位于 TLS 握手协议的下方,直接承载在上层协议(如 HTTP, FTP)和下层传输协议(TCP)之间。它的主要任务是:将上层应用数据安全地封装成一个个“记录包”。

记录阶段的四个关键步骤

当你的浏览器想要发送一段 HTTP 请求(比如 GET /index.html)时,记录层会按顺序执行以下操作:

  1. 分段(Fragmentation)
    上层数据可能很大,记录层会将其切分成较小的块(每个记录块通常不超过 16KB),以便于处理。

  2. 压缩(Compression - 可选且现代已弃用)
    早期的 TLS 支持在记录层压缩,但由于存在安全漏洞(如 CRIME 攻击),现代 TLS(包括 TLS 1.3)已经禁止了这一步

  3. 计算 MAC / 添加认证标签(Integrity)

    • 在 TLS 1.2 中:使用握手阶段协商出的密钥和 HMAC 算法为数据计算一个“哈希值”。
    • 在 TLS 1.3 中:采用更先进的 AEAD(关联数据的认证加密) 模式。这一步确保了:如果黑客在传输过程中改动了一个比特位,接收方在校验时就会发现。
  4. 加密(Encryption)
    使用握手阶段生成的对称密钥(如 AES),对“数据 + 认证标签”进行整体加密。此时,数据变成了只有持有钥匙的人才能解开的“密文”。


记录包的结构(抓包视角)

如果你用 Wireshark 观察一个 TLS 记录包,你会发现它通常包含一个简短的头部(Header)

字段 长度 说明
Type 1 Byte 区分包类型(22 是握手包,23 是应用数据包)
Version 2 Bytes TLS 版本(如 0x0303 代表 TLS 1.2)
Length 2 Bytes 后面加密数据的长度
Encrypted Data 变长 真正的加密荷载(含填充和 MAC)

为什么记录阶段很重要?

  1. 防重放攻击:记录层会给每个包维护一个隐式的序列号。即使黑客截获了一个合法的加密包并原封不动地再次发送,接收方也会因为序列号对不上而丢弃它。
  2. 前向安全性:虽然记录阶段使用对称加密,但它依赖于握手阶段产生的临时密钥。
  3. 效率优化:由于记录块大小上限的存在,TLS 可以在接收到部分数据时就开始解密,而不必等待整个网页下载完,这提升了流式传输的效率。

总结

  • 握手阶段:确定算法、交换随机数、验证身份、生成密钥。(逻辑核心
  • 记录阶段:分段、计算校验、加密、增加包头。(执行核心

3. 数字证书:如何证明“你是你”?

你可能会问:“如果黑客伪造一个服务端发给我公钥怎么办?”
这就是 CA(数字证书认证机构) 的作用。

  • CA 签名:服务端会将自己的信息和公钥交给 CA。CA 用自己的私钥对这些信息进行哈希后签名。
  • 客户端验证:你的浏览器/系统里内置了这些顶级 CA 的公钥。只要用 CA 的公钥能解开这个签名,就证明这个服务器的身份是经过权威认证的。

4. TLS 1.2 vs 1.3:时代的进步

目前 TLS 1.3 已经非常普及,它相比 1.2 有两个巨大的飞跃:

  1. 更快的速度(1-RTT):TLS 1.2 握手需要往返两次(2-RTT),而 1.3 只需要一次往返就能建立连接。
  2. 安全性升级:删除了很多陈旧、不安全的加密算法(比如 MD5, SHA-1, RSA 密钥交换等),强制要求具有**前向安全性(Forward Secrecy)**的算法(如 ECDHE)。

总结

如果用一个生活中的例子来类比:

  • TCP 是快递公司,负责把箱子送到目的地。
  • TLS 则是你在寄快递前,先和收件人商量好一个复杂的暗号(握手),并把信件放进一个坚固的保险箱里(加密)。即使快递员(黑客)半路截获了箱子,他也打不开,更没法伪造里面的内容。