Files
AgentMessage/https-tls-principle-ytb.md
2026-05-04 20:44:34 +08:00

357 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HTTPS/TLS 通信原理详解
> 本文基于视频内容深度扩展,补充技术细节与常见误区
---
## 一、加密基础
### 1.1 对称加密Symmetric Encryption
加密和解密使用**同一把密钥**。
```
明文 + 密钥 → 密文
密文 + 密钥 → 明文
```
特点:
- 速度快,适合加密大量数据
- 核心问题:**密钥如何安全传递给对方?**(密钥分发问题)
常见算法AES-256-GCM、ChaCha20、3DES
### 1.2 非对称加密Asymmetric Encryption
每人持有一对密钥:
- **公钥Public Key**:可公开分发,用于加密
- **私钥Private Key**:严格保密,用于解密
```
明文 + 公钥 → 密文
密文 + 私钥 → 明文
```
也可以反向用——私钥签名,公钥验签:
```
明文 + 私钥 → 签名
签名 + 公钥 → 验证通过/失败
```
特点:
- 解决了密钥分发问题
- 速度慢CPU 开销约是对称加密的 100-1000 倍
- 不适合加密大数据
常见算法RSA2048/4096 位、ECCElliptic Curve CryptographyECDSA、ECDH
**ECC 相比 RSA 的优势**用更短的密钥达到同等安全强度RSA-2048 ≈ ECC-256握手更快、证书更小。
### 1.3 混合加密Hybrid Encryption
实际应用中HTTPS 同时使用两种加密:
1. 用非对称加密**安全交换**一个临时会话密钥
2. 用对称加密(会话密钥)**高效传输**实际数据
这是 TLS 的核心设计思想。
---
## 二、TLS 握手详解
TLS 握手是建立安全连接的核心过程。以下以 **TLS 1.2****TLS 1.3** 分别说明。
### 2.1 TLS 1.2 握手流程
以 RSA 密钥交换为例(最常见):
```
客户端 服务端
| |
|---- ClientHello (支持的密码套件, 客户端随机数) ---->|
| |
|<--- ServerHello (选定的密码套件, 服务端随机数) -----|
|<--- 服务器证书 (含公钥) ---------------------------|
|<--- ServerKeyExchange (DH参数可选) ---------------|
| |
| 客户端验证证书链,提取公钥 |
| |
|---- ClientKeyExchange (用公钥加密的预备主密钥) --->|
| |
| 双方用 客户端随机数 + 服务端随机数 + 预备主密钥 |
| 计算出相同的"会话密钥"(对称密钥) |
| |
|---- ChangeCipherSpec (切换到加密模式) ------------->|
|---- Finished (加密的握手消息摘要) ---------------->|
| |
|<--- ChangeCipherSpec -------------------------------|
|<--- Finished --------------------------------------|
| |
|======= 之后所有 HTTP 数据用会话密钥加密传输 =======|
```
关键点:
- 客户端和服务端各有一个**随机数**(防重放)
- 预备主密钥Pre-Master Secret由客户端生成用服务端公钥加密后发送
- 最终会话密钥 = PRF(客户端随机数 || 服务端随机数 || 预备主密钥)
**ECDHE 握手**TLS 1.2 更常见的方式):
- 服务端和客户端各自生成临时 EC 密钥对
- 通过 ECDH 算法各自推导出相同的预备主密钥
- 特点:**前向保密Forward Secrecy**——即使未来私钥泄露,历史会话仍安全(因为每次会话的密钥都是临时的)
### 2.2 TLS 1.3 握手流程2018 年标准化)
TLS 1.3 大幅简化了握手:
```
客户端 服务端
| |
|---- ClientHello (支持的密码套件, 客户端随机数) --->|
| + (可选) 客户端 DH/ECDH 公钥 |
| |
|<--- ServerHello (选定的密码套件, 服务端随机数) -----|
|<--- 服务器证书 + 证书验证 + 服务端 DH 公钥 --------|
|<--- Finished --------------------------------------|
| |
| 客户端用服务端 DH 公钥 + 客户端 DH 私钥 |
| 计算出会话密钥 |
| |
|---- 证书验证 + Finished -------------------------->|
| |
|========= 1-RTT 后开始加密传输 ====================|
```
改进:
- **1-RTT**TLS 1.2 RSA 握手是 2-RTT
- 废弃了 RSA 密钥交换(不支持不支持前向保密的 RSA**强制前向保密**
- 废弃了 CBC 模式(易遭 BEAST 等攻击),只用 GCM/Chacha20-Poly1305
- 握手消息在加密通道中传输TLS 1.2 的前半部分在明文)
---
## 三、证书与 CA 信任链
### 3.1 证书内容
X.509 证书包含:
```
证书版本 / 序列号
持有者信息 (Subject)
颁发者信息 (Issuer)
公钥 + 算法
证书有效期 (Not Before / Not After)
扩展字段 (SAN, 密钥用途, CA 路径长度等)
CA 的数字签名
```
关键扩展:
- **Subject Alternative Name (SAN)**:证书允许的域名列表(支持通配符如 `*.example.com`
- **Basic Constraints**:是否 CA 证书
- **Key Usage**:证书用途(服务器认证、代码签名等)
### 3.2 证书信任链
操作系统和浏览器预置了约 100+ 个**根 CA 证书**(如 DigiCert、Let's Encrypt、GlobalSign 等)。
一条典型的信任链:
```
根 CA 证书 (Root CA)
└── 由根 CA 签名
中间 CA 证书 (Intermediate CA 1)
└── 由中间 CA 签名
中间 CA 证书 (Intermediate CA 2)
└── 由中间 CA 2 签名
网站证书 (End-entity / Leaf Certificate)
└── 你的域名(如 vpn.example.com
```
验证过程(链式验证):
```
浏览器持有根 CA 公钥
用根 CA 公钥验证 "根 → 中间 CA 1" 的签名 → 得到中间 CA 1 公钥
用中间 CA 1 公钥验证 "中间 CA 1 → 中间 CA 2" 的签名 → 得到中间 CA 2 公钥
用中间 CA 2 公钥验证 "中间 CA 2 → 网站证书" 的签名 → 得到网站公钥
验证网站证书的域名与访问域名是否一致
验证证书是否在有效期内、是否被吊销
```
### 3.3 证书类型
| 类型 | 验证级别 | 浏览器地址栏 |
|------|---------|------------|
| DVDomain Validation| 仅验证域名控制权 | 锁 + 安全 |
| OVOrganization Validation| 验证域名 + 企业身份 | 锁 + 企业名 |
| EVExtended Validation| 严格企业审核(已逐步淘汰)| 绿条Safari 已移除) |
Let's Encrypt 是免费 DV 证书的代表,三个月有效期,自动化续期。
### 3.4 证书吊销与 OCSP
证书泄露或私钥丢失时,需要吊销。
**CRLCertificate Revocation List**CA 维护被吊销证书的序列号列表。缺点:列表可能很大,浏览器每次都要下载。
**OCSPOnline Certificate Status Protocol**:浏览器直接查询 CA 的 OCSP 服务器验证证书状态。缺点隐私泄露CA 知道你访问了哪个网站CA 不在线则验签失败。
**OCSP Stapling**:服务端主动向 CA 查询自己证书的状态,将 OCSP 响应附在 TLS 握手时一起发给浏览器,浏览器无需额外请求。
**CRLSette 和 OCSP Must-Staple**:现代浏览器综合使用多种策略判断证书是否可信。
---
## 四、机场老板和 GFW 到底能看到什么?
### 4.1 网络分层与可见信息
| 协议层 | 可见信息 | 加密情况 |
|--------|---------|---------|
| HTTP 应用层 | 请求路径、Headers、Body | 端到端加密 |
| TLS 加密层 | 加密的内容、加密的域名SNI 部分情况) | 端到端加密 |
| TCP 层 | 端口号、序列号、连接状态 | 部分可见 |
| IP 层 | 源/目的 IP 地址 | 明文 |
| 数据链路层 | MAC 地址、局域网拓扑 | 明文 |
### 4.2 TLS 握手中的明文部分(重要!)
**SNIServer Name Indication**
TLS 1.2 及之前的握手ClientHello 中有一个字段叫 SNI写明要访问的域名
```
SNI: vpn.example.com ← 明文,不加密
```
这是因为 TLS 在 TCP 握手**之后**才建立,而服务端可能同一 IP 托管多个域名,需要靠 SNI 决定返回哪个证书。所以**在 TLS 握手阶段,服务商/ISP/GFW 就能看到你要访问的域名**。
**ESNIEncrypted SNI** 是针对此问题的解决方案,已演变为 **ECHEncrypted Client Hello**,将 SNI 加密。但目前普及率很低。
**DNS 查询**
如果你用的 DNS 服务器在境内(如 114.114.114.114 或 223.6.6.6GFW 能在 DNS 层面知道你查询了哪些域名。
解决方法:
- DoHDNS over HTTPSDNS 查询通过 HTTPS 加密传输ISP 看不到具体查询内容
- DoTDNS over TLSDNS 查询通过 TLS 加密传输
- 直接使用境外 DNS如 8.8.8.8)配合代理
但 DoH/DoT 本身也有 SNI 问题——你要访问哪个 DoH 服务商(如 `dns.google`)在 TLS 握手中依然是明文。
### 4.3 机场老板能看到的
| 信息 | 能否看到 | 原因 |
|------|---------|------|
| 访问的域名SNI | ✅ 能看到 | TLS ClientHello 明文 |
| 具体 URL 路径 | ❌ 看不到 | HTTPS 加密 |
| 账号、密码 | ❌ 看不到 | HTTPS 加密 |
| 访问的内容 | ❌ 看不到 | HTTPS 加密 |
| 流量大小 | ✅ 能看到 | 加密了内容,但流量字节数裸奔 |
| 连接时长 | ✅ 能看到 | 流量元数据 |
| 访问时间 | ✅ 能看到 | 日志记录 |
**结论**:机场老板知道你在用他的线路访问 `*.google.com`,但不知道你在 Google 上搜了什么、登录了什么账号。
### 4.4 GFW 能看到的
GFW 是部署在骨干网入口/出口的流量审查设备,能力比普通 ISP 更强:
| 信息 | 能否看到 |
|------|---------|
| 你的公网 IP | ✅ 明文 |
| 目的地 IP | ✅ 明文 |
| SNI 域名 | ✅ 明文TLS 握手) |
| DNS 查询记录(若用境内 DNS | ✅ 明文 |
| HTTPS 加密内容 | ❌ 看不到 |
| HTTP/2 或 HTTP/3 的头部 | ✅ 部分明文HPACK 压缩可部分隐藏) |
GFW 的主要手段:
- **DNS 污染**:对特定域名返回虚假 IP配合 DNS 缓存投毒)
- **SNI 阻断**:检测 ClientHello 中的特定域名,直接 TCP RST 或丢包
- **关键词过滤**:对 HTTP 明文流量(未加密的 HTTP 1.1)做 DPI 内容匹配
- **流量指纹**:识别特定协议的流量特征(如 WireGuard、Trojan 的独特握手模式)
- **机器学习**:识别代理流量的统计特征
**GFW 不能直接破解 HTTPS 内容**,但可以通过 SNI 和域名黑名单做主动探测,或通过 DNS 污染让用户连到伪基站。
---
## 五、安全误区详解
### 误区 1装了抓包工具的根证书后所有 HTTPS 都安全了
实际上:
```
你装了小证书的根证书 → 抓包工具拦截了 TLS 握手
→ 抓包工具用自己的证书伪装成目标服务器
→ 你和抓包工具之间用合法(小证书的)证书加密
→ 抓包工具和真实服务器之间用真实证书加密
→ 抓包工具完整解密了你的流量
```
这就是**中间人攻击MITM**。在企业网络安全审计场景下是合法行为,但被恶意利用时,你的所有 HTTPS 流量都会被第三方解密。
### 误区 2HTTPS 加密了就是绝对安全
HTTPS 只保护**传输层安全**,不保护:
- **服务端被入侵**:攻击者拿到服务器私钥后可解密历史会话(除非有前向保密)
- **客户端被入侵**:键盘记录器、恶意浏览器插件可以截取解密后的内容
- **社会工程学**:钓鱼网站本身也可能有 HTTPSDV 证书只需验证域名)
### 误区 3VPN 能完全隐藏我的流量
VPN 隐藏了你到 VPN 服务商之间的流量:
- ISP 只能看到你连到了 VPN 服务器的 IP看不到具体访问内容
- 但 VPN 服务商能看到你的 SNI、流量大小和访问时间
- 如果 VPN 服务器日志保存完整,配合 IP 地址分配记录可追溯用户
这就是"机场老板能看到 SNI 但看不到内容"的实际含义。
### 误区 4加密强度越高越好
AES-256 在目前和未来几十年内都是安全的(量子计算除外)。过度使用 AES-512 等超长密钥反而增加 CPU 开销而无实际安全收益。关键是**正确配置和前向保密**,而不是盲目追求密钥长度。
---
## 六、为什么钱还是丢了?
视频提出的核心问题:技术无懈可击,但钱仍然被盗。
**根本原因不是加密被破解,而是身份验证链被人绕过:**
1. **钓鱼网站**:你以为自己访问的是 `bank.com`,但域名是 `bark.com`(视觉混淆:`l` vs `1`TLS 证书是 `bark.com` 的合法 DV 证书,浏览器完全信任。攻击者在完全合法的 HTTPS 通道中完成钓鱼。
2. **社工欺骗**攻击者获取了你足够多的个人信息通过数据泄露库直接在正规网站上以你的身份操作HTTPS 毫无作用。
3. **SIM 卡克隆/呼叫转移**:攻击者通过运营商内部关系补办你的 SIM 卡,接收银行短信验证码。
4. **恶意 App**:你在手机上安装了来路不明的应用,申请了辅助功能权限,直接读取屏幕内容和键盘输入,绕过所有加密。
5. **网络层劫持**:路由器被恶意固件感染,或处于中间人网络环境中,配合根证书安装(或其他手段),直接截取明文。
**总结**HTTPS 是安全架构中极其重要的一环,但它只解决传输通道的机密性和完整性问题。安全木桶的短板永远是人在最薄弱的地方——保持警惕、使用官方渠道、安装可信证书,才是真正的防线。
---
## 附录:常用工具与检测方法
```bash
# 查看网站证书链
openssl s_client -connect google.com:443 -showcerts </dev/null
# 查看证书详细信息
openssl x509 -in cert.pem -text -noout
# 检查 TLS 版本和密码套件
curl -v https://example.com
# 检查域名证书是否有效
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509
# 检测 SNI抓包可见性
# Wireshark 过滤: tls.handshake.extensions_server_name
```