← 返回总目录

Day 146 — HTTPS 深入 + 抓包分析:TLS 握手与证书验证(Phase 10 开篇)

网络安全开发 88 行 3 个可运行脚本

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 经典四步)

  1. ClientHello:客户端发送——支持的 TLS 版本、密码套件(cipher suites)列表、客户端随机数、SNI(想访问哪个域名)
  2. ServerHello + Certificate:服务器选定套件、返回服务器随机数 + 证书链
  3. 密钥交换:客户端验证证书 → 生成预主密钥,用服务器证书里的公钥加密发给服务器(RSA 交换);或 ECDHE 双方各自算(更安全,具备前向保密)
  4. 完成:双方用(两个随机数 + 预主密钥)导出会话密钥,互发 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 两者都用

2.2 前向保密(Forward Secrecy)

RSA 交换:服务器私钥一旦泄露,历史抓包全部可解密。ECDHE:每次会话临时生成密钥对,用完即弃——私钥泄露也解不了历史流量。

2.3 SNI 与证书选择

一台服务器一个 IP 可能托管多个 HTTPS 站点。ClientHello 里的 SNI 字段告诉服务器"我要访问哪个域名",服务器据此返回对应证书。没加密的 SNI 也成为审查/分流依据(ECH 就是解决这个的)。

三、避坑说明

  1. 别用 ssl._create_unverified_context():教程常这么写,等于关掉证书验证,直接开门给 MITM。抓包实验用完立刻删。
  2. 证书验证失败 ≠ 网络坏了:系统时间错误会导致"证书未生效/已过期"误报——排障先 date。
  3. Python 自带证书库问题:certifi 与系统 CA 可能不一致,requests 用 certifi,socket+ssl 默认用系统库。
  4. 抓包他人流量合法性:企业网络抓包须经告知;对他人 HTTPS 做 MITM 在未授权情况下可能违法。

四、今日代码

文件 内容
code/01-tls-handshake.py 用 ssl/socket 真实完成一次 TLS 握手,打印版本/套件/证书链/耗时
code/02-cert-verification.py 证书验证实验:正常站点通过、自签证书被拒、降级到不验证上下文对比

五、今日练习

见 exercises/checklist.md(5 题,含参考答案)。

六、图解

见 diagrams/README.md:TLS 握手时序图、证书信任链、MITM 原理。