搜索 K
Appearance
AirPick 实验室 · 隐私安全组 · 2026 年 3 月修订版
如果你只想知道答案,看这五条就够了:
trustAllCerts 或干脆不校验证书。除此之外没有第四条路。echo | openssl s_client -connect 目标域名:443 -servername 目标域名 -showcerts,看签发者是 DigiCert、Let's Encrypt、Google Trust Services 这类权威 CA,还是某个你没听过的陌生名字。后者就是有人在中间解密你。理解了这五条,后面 3000 字都是在解释「为什么」。
要回答「机场能看到什么」,先要搞清楚它扮演的角色。
机场客户端有三类主流工作模式,它们对数据的可见度完全不同:
HTTP 代理(CONNECT 隧道):客户端向代理发一条 CONNECT www.example.com:443 HTTP/1.1 请求,代理回 HTTP/1.1 200 Connection Established,此后这条 TCP 连接就变成纯字节管道。代理只负责把字节往源站搬,不参与 TLS 握手内容。
SOCKS5:比 HTTP 代理更低一层,连 HTTP 语义都没有,只做 TCP/UDP 转发,可见度更低。
TUN / 虚拟网卡模式(Clash、Sing-box、Surge 常用):在系统层截获全部 IP 包,按规则决定哪些走代理、哪些直连。它能看到目标 IP 和端口,但同样看不进 TLS 载荷。
关键点在这里:TLS 的加密协商发生在你的设备和源站服务器之间,代理设备位于两者之间的转发路径上,但它没有 TLS 会话密钥。它能看到的是 TLS 记录层的外壳——握手包、记录类型、长度、时序——而不是记录层里面的明文 HTTP。
打个比方:你寄一封用银行级密码锁密封的信,快递公司能称重、能记录收发地址、能统计你每天寄了几封,但只要它没有钥匙,就开不了信。
很多人对「HTTPS 端到端加密」的认知停留在「加了密」,但加密的粒度一直在变。
TLS 1.2 时代:ClientHello 里的 SNI 字段完全明文。任何中间设备(包括代理)都能直接读到你要访问哪个域名。同时 RSA 密钥交换被广泛使用,缺少前向保密(PFS),长期私钥一旦泄露,历史流量理论上可被回溯解密。
TLS 1.3 时代(2018 年标准化,2026 年已是绝对主流):
ECH(Encrypted Client Hello):把 ClientHello 里的 SNI 也加密,用一层「外层 SNI」做幌子。这意味着中间人连「你访问哪个域名」都看不到了。2026 年的现状是:Cloudflare 全量支持,Chrome/Firefox 已默认开启部分场景,但国内源站与大量中小站点尚未跟进,覆盖率仍有明显缺口。
结论:即使不依赖 ECH,TLS 1.3 已经让代理的可见面收缩到「IP + 端口 + 流量特征」;启用 ECH 后进一步收缩到「IP + 端口」。但这些都不影响一个核心事实——代理从来就没拿到过你的明文密码。
既然 TLS 这么硬,那「机场偷密码」的传言从哪来?答案是 MITM。它的原理非常朴素:
代理伪装成源站,向你的设备出示一张它自己签的证书;同时它又以客户端身份连接真正的源站。你的设备如果不校验或信任了这张证书,就会把明文交给代理,代理读完再转发。
MITM 要成功,必须满足一个前提:你的设备信任了攻击者的 CA。现实中只有三条路能达成这个前提。
路径 A:主动诱导你安装根证书(最常见)
典型话术:「安装证书后可以解锁 Netflix 4K」「装个证书去广告更干净」「这个 App 需要证书才能用」。你一旦在系统设置里把这张 CA 标记为「受信任」,Clash / Surge / Shadowrocket / Sing-box 的 MITM 模块就能解密你所有不启用证书 Pinning 的 HTTPS 流量。注意:这不是技术漏洞,这是你自己授权的。
路径 B:利用客户端不校验证书
Android 7 之前,App 默认信任用户安装的证书;部分老旧 SDK、爬虫工具、内部测试 App 会写 trustAllCerts,或者干脆把接口写成 http://。这类客户端在任何代理环境里都是裸奔状态。
路径 C:系统级劫持
公共 WiFi 搭伪热点 + Captive Portal 诱导安装描述文件、企业 MDM 批量下发根证书。这类攻击和机场无关,但后果一样。
如何快速识别:浏览器报「你的连接不是私密连接」、证书签发者是一串陌生域名、证书有效期异常短(几小时到几天)、同一个域名在不同网络下证书指纹不一致——出现任何一条,立即断开。
这张表是本篇最实用的一张。建议收藏。
| 可见维度 | HTTP 明文 | HTTPS (TLS 1.2) | HTTPS (TLS 1.3 + ECH) | HTTPS + 恶意根证书 |
|---|---|---|---|---|
| 目标域名(SNI) | 可见 | 可见 | 部分/完全隐藏 | 可见 |
| 完整 URL 路径 | 可见 | 不可见 | 不可见 | 可见 |
| 请求头(Cookie/Referer/UA) | 可见 | 不可见 | 不可见 | 可见 |
| 表单明文(账号密码) | 可见 | 不可见 | 不可见 | 可见 |
| 银行卡号 / CVV | 可见 | 不可见 | 不可见 | 可见 |
| 响应正文 | 可见 | 不可见 | 不可见 | 可见 |
| IP + 端口 + 流量体积 | 可见 | 可见 | 可见 | 可见 |
| 连接时序与行为画像 | 可见 | 可见 | 可见 | 可见 |
| TLS 指纹(JA3/JA4) | 不适用 | 可采集 | 可采集 | 可采集 |
| 篡改 / 注入能力 | 完全可控 | 无 | 无 | 完全可控 |
看这张表只需要抓两个重点:第一,HTTPS 把你的凭证保护得死死的;第二,一旦信任了恶意 CA,你相当于从 HTTPS 列瞬间掉回 HTTP 列,前面所有保护归零。
不是所有流量都应该走代理。按敏感度分层,是最省心的策略。
极高敏感(建议直连或严格分流) 网上银行、证券账户、支付平台后台、域名注册商控制台、云服务商 Root 账号、公司 SSO 后台。这些站点的共同点是:一次凭证泄露就是资金或资产的直接损失,而它们通常在国内可直连。没有必须走代理的理由。
高敏感(可以走,但要确认证书) Google / Microsoft / GitHub / AWS 控制台、ChatGPT、跨境电商卖家后台(Amazon Seller Central、Shopify Admin)。判据是:地址栏锁标正常 + 未安装任何非权威 CA。这类平台几乎都启用了 HSTS 与证书 Pinning,是最难被 MITM 的一批。
中等敏感(正常走代理即可) 社交媒体、内容站、流媒体、搜索引擎。被看到的元数据价值有限,风险主要是行为画像而非资产损失。
开发场景(单独说) SSH 有自己的主机密钥验证机制,与 TLS 是两套独立体系,代理无法解密。Git over HTTPS 依赖 TLS 校验;Git over SSH 依赖 Known Hosts。两者只要不做 StrictHostKeyChecking=no 这类骚操作,都是安全的。
一个反直觉的建议:如果某个机场为了「解锁流媒体」要求你安装根证书,而你只是想看个剧——放弃解锁,保住证书信任链。这是性价比最高的决定。
Clash / Mihomo(Clash Verge、Mihomo Party 等)
打开配置文件,搜索 mitm。如果存在类似下面的段落,说明这个订阅具备解密 HTTPS 的能力:
mitm:
enable: true
ca-passphrase: "xxxx"
ca-certificate: ./ca.crt再看有没有 skip-cert-verify: true。这个字段本意是给自签证书的源站放行,但如果出现在你的订阅节点配置里,它意味着你的客户端主动放弃了证书校验——等于把 HTTPS 降级成 HTTP。
排查命令(Windows / macOS 通用,先找配置文件位置):直接搜文本 grep -iE "mitm|skip-cert-verify|insecure" 配置文件路径。
Shadowrocket
设置 → 证书 → 查看已安装的 CA。如果你不抓包,直接删掉。删除后 MITM 模块自动失效。
Surge
MITM 需要手动开启 + 手动安装证书,默认关闭。检查 [MITM] 段落是否被订阅动态写入。
Sing-box
检查 inbounds 里是否存在 tls + reality 组合用于入站解密;同时检查 outbounds 里的 insecure: true。
浏览器侧加固(三件事,五分钟搞定)
about:config 将 dom.security.https_only_mode 设为 true;certmgr.msc → 受信任的根证书颁发机构。看到不认识的、签发者是个人或陌生域名的,删掉。以下命令在 macOS / Linux 原生可用,Windows 建议用 WSL 或 Git Bash。
命令 1:验证证书链是否被掉包
echo | openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts 2>/dev/null | openssl x509 -noout -issuer -subject -dates正常输出应以 issuer=C = US, O = DigiCert Inc 或 O = Let's Encrypt、O = Google Trust Services 之类开头。如果看到 issuer=CN = Clash、CN = Surge、某个陌生域名,或者日期只有几天有效期——你正在被解密。
命令 2:查看本次请求实际使用的 TLS 版本
curl -sS -o /dev/null -vI https://www.example.com 2>&1 | grep -E "SSL connection|TLS"正常应显示 TLSv1.3 或 TLSv1.2。若出现 TLSv1.0、SSLv3,说明链路被降级。
命令 3:确认域名解析有没有被劫持
dig +short www.example.com @1.1.1.1
dig +short www.example.com @8.8.8.8两个结果应一致,且应属于该站点的 CDN 网段(Cloudflare、Akamai、Fastly 等)。如果返回一个你没见过的国内 IP,或者两个 DNS 结果不一致,就是 DNS 层被动了手脚。
命令 4:定位链路哪一跳在丢包
mtr -rwzc 50 1.1.1.1看 Loss% 列。首跳丢包是本地网络问题;中间某跳大面积丢包是国际出口拥塞;末跳丢包才是落地机房问题。注意:中间跳丢包不等同于故障,很多骨干路由不响应 ICMP,只要末跳稳定就��问题。
命令 5:TCP 层连通性快速验证
tcping -c 10 www.example.com 443比 ping 更贴近真实业务,因为它测的是 TCP 握手。延迟稳定但握手失败,通常是目标端口被拦。
判定表
| 现象 | 最可能原因 | 处置动作 |
|---|---|---|
| 证书签发者为陌生名字 | 已被 MITM 解密 | 立即断开,删除可疑根证书 |
| 证书有效期只有几小时 | 动态签发的伪造证书 | 同上,并更换机场 |
curl 显示 TLSv1.0 | 链路被强制降级 | 检查客户端 insecure 类配置 |
| 两个公共 DNS 解析结果不一致 | DNS 劫持 | 启用 DoH/DoT,检查节点侧 DNS |
| 浏览器锁标正常但页面被插入广告 | HTTP 资源注入 | 检查页面是否混合加载 HTTP 资源 |
| 特定 App 抓不到包 | 该 App 启用证书 Pinning | 属正常保护,非故障 |
💡 顺带一提:一家机场会不会碰你的数据,本质上取决于它的商业模式。靠卖流量赚钱的服务商没有动机去解密用户流量——那是纯粹的负收益行为,一旦被发现就是品牌死亡。真正需要警惕的是免费机场与「装证书送解锁」的诱导型服务。
| 话术 / 行为 | 真实含义 | 风险等级 | 建议 |
|---|---|---|---|
| 「装证书解锁 Netflix / Disney+」 | 需要 MITM 才能改流媒体鉴权 | 极高 | 直接放弃该功能 |
| 「不记录任何日志」但订阅里带 MITM 模块 | 宣传与实现矛盾 | 极高 | 换服务商 |
| 「免费机场,永久免费」 | 靠注入广告 / 转卖流量变现 | 高 | 不用敏感账号登录 |
| 要求关闭杀软 / 装描述文件 | 需要系统级权限 | 高 | 拒绝 |
| 「独家协议,速度翻倍」但无任何技术说明 | 大概率是普通中转包装 | 中 | 看实测不看宣传 |
| 节点延迟全部显示「1ms」 | 客户端测的是本地进程延迟 | 低(但说明不专业) | 看真实测速报告 |
订阅链接含大量 skip-cert-verify |