SecurityRonin/tls-handshake

GitHub: SecurityRonin/tls-handshake

一个交互式的 TLS 1.3 握手可视化工具,演示正常流程与多种故障/降级攻击场景。

Stars: 0 | Forks: 0

# TLS 握手可视化 — 了解 HTTPS 工作原理 [![Netlify Status](https://api.netlify.com/api/v1/badges/placeholder/deploy-status)](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 加密, 互认证, 交互式演示, 会话恢复, 前向安全性, 可视化教学, 后端开发, 多模态安全, 学习工具, 安全协议, 完整性, 密钥交换, 应用层加密, 握手协议, 数据可视化, 早期数据, 特征检测, 网络安全, 证书认证, 过期证书, 降级攻击, 隐私保护