SecurityRonin/tls-handshake
GitHub: SecurityRonin/tls-handshake
一个交互式的 TLS 1.3 握手可视化工具,演示正常流程与多种故障/降级攻击场景。
Stars: 0 | Forks: 0
# TLS 握手可视化 — 了解 HTTPS 工作原理
[](https://tls-handshake.securityronin.com)
交互式分步 **TLS 1.3 握手** 演示以及 **TLS 1.2 降级和遗留攻击** 场景。观察密钥交换、身份验证、加密和完整性如何协同工作,并追踪不同故障或协议回退如何破坏通道。
**[现场演示 →](https://tls-handshake.securityronin.com)**
## 教学内容
每个 HTTPS 连接都以握手开始。本演示逐步遍历 TLS 1.3 协议,并将每一步映射到四个密码学支柱:
1. **ClientHello** — 密钥交换开始(发送 ECDHE 密钥共享)
2. **ServerHello** — 密钥交换完成;握手流量密钥派生。身份验证尚未建立。
3. **Certificate** — 服务器进行身份验证:加密的 Certificate + CertificateVerify 流程已验证。加密已激活。
4. **Client Finished** — 完整性建立:Finished 验证握手摘要;通过 HKDF 派生互补的客户端/服务器应用流量密钥
5. **Encrypted Data** — AEAD 认证应用记录流(认证标签是密码的一部分,而非独立 HMAC)
6. **Done** — 四个支柱全部激活。连接安全。
## What-If 场景
切换场景以观察握手如何变化或中断:
**TLS 1.3 — 基准与变体**
| 场景 | 影响 |
|------|------|
| **HelloRetryRequest** | 步骤 2 — 服务器拒绝客户端的 key_share 组;客户端使用 secp256r1 重试,增加一个 RTT |
| **PSK Session Resumption** | 步骤 2 — 服务器接受会话票据;ECDHE 仍用于前向安全 |
| **0-RTT Early Data** | 步骤 5 — 早期数据在服务器 Finished 之前发送;可重放,绑定到恢复密钥(非新鲜 ECDHE 共享) |
| **Mutual TLS** | 步骤 4 — 客户端在服务器 CertificateRequest 后出示自己的证书 |
**TLS 1.3 — 证书与身份验证故障**
| 场景 | 影响 |
|------|------|
| **Expired Certificate** | 步骤 3 失败 — 证书有效期已结束 |
| **Hostname Mismatch** | 步骤 3 失败 — 证书 CN/SAN 与请求的主机名不匹配 |
| **Weak Signature (SHA-1)** | 步骤 3 失败 — SHA-1 已被密码学破解;TLS 1.3 禁止在 CertificateVerify 中使用 |
| **Revoked Certificate (OCSP staple)** | 步骤 3 失败 — OCSP 状态装订在 Certificate 消息中显示 certStatus: revoked |
| **Certificate Pinning Failure** | 步骤 3 失败 — 证书有效但 SPKI 哈希不匹配固定值 |
| **MITM Attempt** | 步骤 3 失败 — 由不受信 CA 签名的伪造证书,或无效的 CertificateVerify |
| **Client Authentication Failure** | 步骤 4 失败 — 服务器需要客户端证书;客户端发送空 Certificate 消息 |
**TLS 1.3 — 隐私与扩展**
| 场景 | 影响 |
|------|------|
| **SNI Exposed (no ECH)** | 步骤 1 — 服务器名称在明文的 ClientHello 扩展中可见 |
| **ECH Success** | 步骤 1 — 内部 ClientHello 使用服务器的公开公钥加密;取代 ESNI |
| **ALPN Mismatch** | 步骤 3 失败 — 客户端仅提供 `h2`;服务器仅支持 `http/1.1`;致命 `no_application_protocol` 告警 (RFC 7301 §3.3.2) |
| **HSTS** | 步骤 6 — 服务器在 HTTP 响应中发送 `Strict-Transport-Security`;浏览器强制后续访问仅使用 HTTPS |
| **QUIC / HTTP/3 contrast** | 步骤 1 — 教育性对比;QUIC 在 UDP 上通过 CRYPTO 帧承载 TLS 1.3 握手,而非 TLS 记录层 |
**TLS 1.3 — 主动攻击**
| 场景 | 影响 |
|------|------|
| **Session Ticket Theft** | 步骤 2 — 攻击者重放被盗的 PSK 票据以劫持会话 |
| **Record Tampering** | 步骤 5 — 攻击者修改应用数据记录;AES-256-GCM 通过认证标签不匹配检测篡改;连接中止 |
**TLS 1.2 降级路径**
| 场景 | 影响 |
|------|------|
| **TLS 1.2 downgrade (RSA)** | 完全降级 — RSA 密钥交换,无前向安全 |
| **TLS 1.2 + CBC cipher** | 步骤 3 警告 — Lucky13/POODLE 利用 CBC 填充预言机;BEAST 利用可预测的 TLS 1.0 CBC IV |
| **TLS 1.2 + expired certificate** | 步骤 2 失败 — 证书有效期检查 |
| **Export RSA Downgrade (FREAK)** | 步骤 2 — 演示 TLS 1.2 服务器静默接受导出的 RSA 套件;降级成功且客户端无告警 |
| **Export DHE Downgrade (Logjam)** | 步骤 2 — 演示 TLS 1.2 服务器发送弱 512 位 DHE 参数;共享密钥可恢复 |
| **Renegotiation Injection** | 步骤 5 — 预 RFC 5746 的 TLS 1.2 允许通过未认证的重协商注入前缀 |
## 开发
```
npm install
npx playwright install chromium
npm run captures:build
python3 -m http.server 3009 --directory web
# 打开 http://localhost:3009
```
## 捕获固件
该仓库现在包含用于可重现 TLS 1.3 场景的真实本地捕获固件,保存在:
- `fixtures/captures/sni.pcap`
- `fixtures/captures/hostname.pcap`
- `fixtures/captures/mitm.pcap`
- `fixtures/captures/client-auth-fail.pcap`
- `fixtures/captures/mtls.pcap`
- `fixtures/captures/hrr.pcap`
- `fixtures/captures/psk-resumption.pcap`
- `fixtures/captures/zero-rtt.pcap`
- `fixtures/captures/alpn-mismatch.pcap`
该仓库也保留用于说明性或综合性的固件,用于在本地工具难以在真实线路上重现的场景:
- `fixtures/captures/freak.pcapng`
- `fixtures/captures/logjam.pcapng`
- `fixtures/captures/ocsp-revoked.pcapng`
- `fixtures/captures/quic-http3.pcapng`
大多数固件是从 `fixtures/capture-src/` 中的源十六进制转储生成的,使用:
```
npm run captures:build
```
真实的本地 TLS 1.3 捕获使用以下命令生成:
```
npm run captures:real
```
此命令使用 `openssl s_server`、`openssl s_client` 和 `tcpdump` 在 `lo0` 上运行,因此需要本地数据包捕获权限。这些固件有意保留环回地址(`127.0.0.1`),因为它们是真实捕获,而非演示。清单文件 `fixtures/captures/manifest.json` 会通过 `tshark` 刷新,以便可重复检查真实和说明性捕获资源,而非在 UI 中手动编辑。
## 测试
```
npm test
```
174 个 Playwright 端到端测试,涵盖安全标头、快乐路径、场景切换、协议树、捕获固件和重置。
## 技术栈
- 纯 HTML/CSS/JS(单个文件,无框架)
- Playwright 用于端到端测试
- Netlify 用于静态部署
## The Codebreakers 的一部分
本演示配套 **The Codebreakers Part II: The Algorithms** —— 由 [Albert Hui (Security Ronin)](https://linkedin.com/in/albert.hui) 提供的入门信息安全课程。
## 许可证
MIT
标签:0-RTT, AEAD, CBC, Certificate, Client Finished, ClientHello, ECDHE, Encrypted Data, HelloRetryRequest, HKDF, HTTPS, MITM, PSK, SEO: HTTPS 原理, SEO: TLS 演示, SEO: 握手流程, ServerHello, TLS 1.2, TLS 1.3, Web 加密, 互认证, 交互式演示, 会话恢复, 前向安全性, 可视化教学, 后端开发, 多模态安全, 学习工具, 安全协议, 完整性, 密钥交换, 应用层加密, 握手协议, 数据可视化, 早期数据, 特征检测, 网络安全, 证书认证, 过期证书, 降级攻击, 隐私保护