本节摘要:TLS 在不安全信道上为两个端点协商出对称密钥,实现端到端加密与身份验证。本节讲清对称与非对称加密的分工、TLS 1.2/1.3 握手的逐步过程、证书链如何验证"这是真服务器"、前向保密的意义,并抓包对照真实握手报文。
上一节看到中间人能对明文流量做的一切,这一节装锁。TLS 的工程之美在于它没有修改网络任何一层——TCP 照旧、IP 照旧、路由器照旧,一切魔法都发生在连接两端的应用层里。
对称加密(AES 等):加解密同一把钥匙,快到能加密整个视频流;死穴是钥匙怎么安全递给对方——明文寄钥匙等于没锁。
非对称加密(RSA、ECC 等):公钥加密只有私钥能解,解决了"不安全信道上递钥匙";但慢三个数量级,加密大流量不现实。
TLS 的分工一目了然:非对称只用来协商对称钥匙(握手阶段,几个包),对称负责全部数据加密(传输阶段)。类比金融世界:非对称是当面的身份核验与密封信封,对称是之后往来的通用密押——仪式用贵的,日常用快的。
TLS 1.2 握手(四次往返前完成,以 HTTPS 为例): ① ClientHello 客户端:支持的 TLS 版本、密码套件清单、随机数 C、 (1.3 起)预分享密钥猜测 ② ServerHello + 证书 服务器:选定套件、随机数 S、数字证书(含服务器公钥) (证书如何验真,见下一节段) ③ 客户端验证证书 → 生成预主密钥,用服务器公钥加密发出 ④ 双方用(C + S + 预主密钥)各自推导出同一套会话密钥 → 互发 Finished(用新密钥加密的握手摘要)验证推导一致 → 之后全部数据用会话密钥对称加密 为什么 Finished 要验一遍?防止握手内容被中间人篡改—— 摘要覆盖全部握手报文,改过任何一个字节,双方算出的 验证值对不上,连接立即失败。篡改在数学上无处遁形。 TLS 1.3 的提速(对照 6.2 的 QUIC 动机): 握手从 2-RTT 压到 1-RTT——ClientHello 直接带上 密钥交换参数(ECDHE),服务器一个来回就能开传; 会话恢复 0-RTT(有重放风险,仅限幂等请求)。 且砍掉了所有遗留弱算法——旧版本里"能协商出弱加密" 本身就是漏洞(降级攻击面)。
前向保密值得单独讲:如果用 RSA 静态私钥交换密钥,攻击者今天录下全部密文、明年偷到私钥,就能回头解密今天的一切(存档解密攻击)。现代强制使用临时 Diffie-Hellman 族(ECDHE)——每次会话的密钥由双方临时随机数现场算出,用完即焚,私钥泄露也解不了过去的流量。牺牲一点性能,买断"历史不可回溯"。
公钥收到只是开始——上一节的中间人完全可以递上自己的公钥。证书解决"公钥属于谁":由你操作系统/浏览器内置的根证书机构(CA)签发。验证是一条链:
浏览器验证 www.example.com 证书的完整逻辑: 根 CA(系统内置,信任的起点,约 150 家) ↓ 用根私钥签署 中间 CA 证书("我是某签发机构,被根授权代签") ↓ 用中间 CA 私钥签署 站点证书("www.example.com 的公钥是 …,有效期至 …") 浏览器逐级用上级公钥验下级签名 → 全链有效 + 域名匹配(证书里的域名 = 访问的域名) + 在有效期内 + 未被吊销 → 绿锁亮起 任何一环断裂的后果(真实报错对照): ERR_CERT_AUTHORITY_INVALID → 签发者不在信任库 (企业内网抓包代理、或真·中间人) ERR_CERT_DATE_INVALID → 过期(最常见的线上事故: 运维忘续期,全站用户看到红色警告) ERR_CERT_COMMON_NAME_INVALID → 域名不匹配 (证书是 a.com 的,访问的却是 b.com)

# 过滤 tls.handshake 抓一次访问 No. Time 协议 概要 5 0.000 TLSv1.3 Client Hello(版本、套件、随机数、SNI 域名明示) 6 0.045 TLSv1.3 Server Hello(选定套件、随机数、密钥交换参数) 7 0.046 TLSv1.3 Certificate, Certificate Verify, Finished 8 0.047 TLSv1.3 Finished(客户端) 9 0.048 TLSv1.3 Application Data(第一个加密业务包) 解读三个细节: 1. No.5 的 SNI 字段是明文的域名——TLS 设计于 CDN 时代之前, 服务器需要先知道域名才能选证书。这是"元数据公开"的 又一实例(7.1 节),新标准加密 Client Hello 正在铺开。 2. No.7 服务器把证书、签名验证、结束验证一包发完—— 这就是 1.3 的 1-RTT:第 9 包已经开始传业务数据。 3. 从 No.9 起抓包只能看到密文——中间人视角到此致盲。 命令行快速体检任何站点: $ openssl s_client -connect example.com:443 -brief Protocol version: TLSv1.3 Ciphersuite: TLS_AES_256_GCM_SHA384 Peer certificate: CN=www.example.com ← 证书域名 Verification: OK ← 链验证通过
⚠️ 常见坑:自签证书在测试环境方便,但养成"点掉浏览器警告继续访问"的肌肉记忆后,真中间人攻击的警告你也会点掉。测试域名请用内部 CA 并分发信任,别训练用户无视红线。
单点加密牢固了,下一节把它组织成体系——防火墙、VPN 与纵深防御的治理框架。