1. TLS/SSL 协议概述:HTTPS 与 TLS 的关系、TLS 握手流程、协议版本演进
说实话,搞了这么多年网络安全,我始终觉得理解 TLS 是理解双向认证的基石。很多新手一上来就啃双向认证的配置,结果证书链、握手失败、密码套件不匹配这些问题一个接一个。根因在哪?就是对 TLS 本身缺乏体系化的认识。
这一章节,咱们把 TLS/SSL 的底裤扒干净。不讲玄学,只讲实战中必须知道的那些事。
1.1 HTTPS 与 TLS:看似一家人,实际是两码事
很多人以为 HTTPS 是一种新协议。其实不是。HTTPS 说白了就是「HTTP + TLS」。HTTP 负责应用层的数据传输,TLS 负责给这条传输通道加一把锁。
我见过不少运维同学,把 HTTPS 和 TLS 混着用,结果排错的时候逻辑全乱。我个人的习惯是:谈 HTTP 时只谈请求/响应,谈 TLS 时只谈加密/握手。这样分清楚,遇到问题才知道是哪一层出了故障。
1.2 TLS 握手流程:每次连接都是一次「面签」
你每次访问一个 HTTPS 网站,客户端和服务器都会完成一次握手。我把它比喻成人际交往中的「面签」——双方先亮身份、交换信任凭据、约定加密规则,然后才开始正式通信。
我给你们捋一下最典型的 TLS 1.2 完整握手流程:
- ClientHello:客户端发个招呼,告诉服务器「我支持 TLS 1.2,我能用的密码套件有这些」,附带一个随机数。
- ServerHello:服务器回一句「好,我们用 TLS 1.2,密码套件就选这个」,也带一个随机数。
- Certificate:服务器把自己的数字证书(内含公钥)发给客户端。这一步是身份证明。
- ServerKeyExchange(可选):如果密码套件需要,服务器还会再发一些密钥参数。
- CertificateRequest(可选):如果服务器要求双向认证,它会在这步向客户端要证书。
- ServerHelloDone:服务器说「我这边搞定了」。
- ClientCertificate(可选):客户端回应证书,用于双向认证。
- ClientKeyExchange:客户端生成一个 Pre-Master Secret,用服务器的公钥加密后发过去。
- CertificateVerify(可选):客户端用私钥签名一段数据,证明自己持有证书对应的私钥。
- ChangeCipherSpec:双方各自通知对方「我开始用商定好的密钥加密了」。
- Finished:双方发送一条加密的验证消息,确认整个握手没有被篡改。
等等,你可能会问:为什么 TLS 1.3 握手看起来快很多?别急,我后面会专门对比版本。
ClientHello 和 Certificate 这两个包。前者能看出客户端的能力边界,后者能看出服务端用的是什么证书链。绝大多数握手失败,问题都出在这两处。
1.3 协议版本演进:从 SSL 到 TLS 1.3
版本演进这个话题,我遇到过很多团队还在跑 TLS 1.0,安全意识实在太落后了。咱们看看这几个版本到底经历了什么。
| 版本 | 状态 | 关键变化 | 我的看法 |
|---|---|---|---|
| SSL 2.0 | 已废弃 | 最早商用版本,存在严重安全问题 | 别碰,碰了就是给自己挖坑 |
| SSL 3.0 | 已废弃 | 修复了部分问题,但 POODLE 攻击后彻底淘汰 | 2015 年后我就不再投入任何精力维护了 |
| TLS 1.0 | 已不推荐 | 基于 SSL 3.0 改进,但不兼容 | PCI DSS 等合规标准已明确禁用 |
| TLS 1.1 | 已不推荐 | 添加了 CBC 保护,但 BEAST 攻击仍有风险 | 能升则升,别犹豫 |
| TLS 1.2 | 主流使用 | 引入 AEAD 密码套件,支持 GCM/CCM | 目前最广泛部署的版本,双向认证首选 |
| TLS 1.3 | 推荐使用 | 握手缩减为 1-RTT,移除不安全算法,强制 PFS | 性能和安全双优,但双向认证场景要注意兼容性 |
嗯,这里要注意一点:从 TLS 1.2 到 TLS 1.3,不仅仅是版本号变化。TLS 1.3 把握手的交互次数从 2-RTT 降到了 1-RTT,首次连接就能省一个来回。你们想想看,这对移动端或者高延迟网络来说,体验提升有多大。
我曾经在一个跨国项目中,把内部 API 网关从 TLS 1.2 升级到 TLS 1.3,页面加载时间直接降低了 30% 以上。当然,前提是两端都得支持 1.3。
1.4 本章知识体系一览
下面这张图我手绘了 TLS 在整个安全通信链路中的位置,以及版本演进的核心路径。你可以把它看作后续章节的地图。
从这张图能看出来,TLS 并不玄乎。它本质上是三件事的组合:身份验证、密钥协商、加密传输。双向认证,就是在「身份验证」这步多加了一轮——服务端也要查客户端的身份证。
这一章我们把地基打牢了。后面讲双向认证的具体配置、证书颁发、Nginx 实战、故障排查,你才不会觉得是在看天书。好了,先消化这些,下个知识点再见。