Day 146 — HTTPS 深入 + 抓包分析:TLS 握手与证书验证(Phase 10 开篇)
阶段:Phase 10 — 网络安全开发(Day 146–165)
主题:HTTPS/TLS 握手流程 / 证书验证机制 / 抓包分析思路(Python ssl/socket 实战)
一、概念解释
1.1 HTTPS = HTTP + TLS
HTTP 是明文协议——路由器、运营商、同一 WiFi 里的任何人都能看到你发了什么。HTTPS 就是用 TLS(Transport Layer Security) 给 HTTP 套一层加密通道:
明文时代: [ HTTP 报文 ] ────────────▶ 中间人全看得见
加密时代: [ HTTP 报文 ] → [ TLS 加密 ] ──▶ 中间人只见密文
1.2 TLS 握手流程(TLS 1.2 经典四步)
- ClientHello:客户端发送——支持的 TLS 版本、密码套件(cipher suites)列表、客户端随机数、SNI(想访问哪个域名)
- ServerHello + Certificate:服务器选定套件、返回服务器随机数 + 证书链
- 密钥交换:客户端验证证书 → 生成预主密钥,用服务器证书里的公钥加密发给服务器(RSA 交换);或 ECDHE 双方各自算(更安全,具备前向保密)
- 完成:双方用(两个随机数 + 预主密钥)导出会话密钥,互发 Finished 验证,之后所有报文对称加密
TLS 1.3 把流程压缩到 1-RTT 甚至 0-RTT,且砍掉了 RSA 密钥交换(只留 ECDHE)。
1.3 证书验证机制(信任链)
浏览器凭什么相信 www.baidu.com 的证书?
根CA(Root CA) ──签发──▶ 中间CA ──签发──▶ 网站证书
↑
预装在操作系统/浏览器的信任库里(如 DigiCert、GlobalSign)
验证时逐级检查:签名有效 → 未过期 → 域名匹配(SAN) → 链能追溯到受信根 → 未被吊销。任何一环失败即报警。今天代码会真实演示"自签证书被拒"。
1.4 抓包分析思路
| 工具 | 层次 | 能看到什么 |
|---|---|---|
| Wireshark | 包级(TCP/TLS record) | 握手全过程,但看不到密文内容 |
| Fiddler / Charles | 代理级(MITM) | 明文 HTTP 内容(需装它的根证书) |
| mitmproxy | 代理级 + 可编程 | Python 脚本化处理流量 |
关键认知:对 HTTPS 直接抓包只能看到密文;Fiddler 之所以能看到明文,是因为它做了中间人(MITM)——客户端其实是在和 Fiddler 握手。这依赖你主动信任它的假根证书,所以浏览器会拼命警告。
本机无 Wireshark 也没关系:Python ssl 模块就是最小抓包实验室——连接时打印握手结果、证书、协商出的套件,等于把 ClientHello 之后的过程"看清"。
二、原理解析
2.1 对称 vs 非对称——TLS 两者都用
- 握手阶段用非对称(RSA/ECDHE)解决"密钥交换":不用事先共享秘密
- 通信阶段用对称(AES-GCM/ChaCha20):快,适合大流量
- 一句话:非对称建立信任,对称保障速度
2.2 前向保密(Forward Secrecy)
RSA 交换:服务器私钥一旦泄露,历史抓包全部可解密。ECDHE:每次会话临时生成密钥对,用完即弃——私钥泄露也解不了历史流量。
2.3 SNI 与证书选择
一台服务器一个 IP 可能托管多个 HTTPS 站点。ClientHello 里的 SNI 字段告诉服务器"我要访问哪个域名",服务器据此返回对应证书。没加密的 SNI 也成为审查/分流依据(ECH 就是解决这个的)。
三、避坑说明
- 别用
ssl._create_unverified_context():教程常这么写,等于关掉证书验证,直接开门给 MITM。抓包实验用完立刻删。 - 证书验证失败 ≠ 网络坏了:系统时间错误会导致"证书未生效/已过期"误报——排障先
date。 - Python 自带证书库问题:
certifi与系统 CA 可能不一致,requests 用 certifi,socket+ssl 默认用系统库。 - 抓包他人流量合法性:企业网络抓包须经告知;对他人 HTTPS 做 MITM 在未授权情况下可能违法。
四、今日代码
| 文件 | 内容 |
|---|---|
code/01-tls-handshake.py |
用 ssl/socket 真实完成一次 TLS 握手,打印版本/套件/证书链/耗时 |
code/02-cert-verification.py |
证书验证实验:正常站点通过、自签证书被拒、降级到不验证上下文对比 |
五、今日练习
见 exercises/checklist.md(5 题,含参考答案)。
六、图解
见 diagrams/README.md:TLS 握手时序图、证书信任链、MITM 原理。