← 返回 Tony's Lab
RFC 9458 · Oblivious HTTP

没有人同时看到
「你是谁」和「你发了什么」

Cloudflare 在生日周开放了自服务 OHTTP Gateway 的封闭测试,并把原来的 Privacy Gateway 更名为 OHTTP Relay。这篇文章拆开两跳架构、双盲隐私模型,以及它为什么必须由 互不勾结的两方分别运营。

发布于 2026-10-03 · 解读自 blog.cloudflare.com
Request Inspector 切换视角 → 看每一方究竟能看到什么
你
小美
客户端
R
Relay
中继
G
Gateway
网关
F
Flo
应用服务器
TCP 来源 IP
设备 TLS 指纹
地理位置
请求体(明文)
The problem

一次普通请求,泄露了什么

小美打开 Flo 想查自己的经期记录。如果手机直接连服务器,服务器日志里会静静记下这一串—— 注意,哪怕她没登录,这些信息也足以把她「认出来」:

# 服务器看到的(普通 HTTPS)
ipAddress: 192.0.2.33                      # 你在哪
ASN: 7922
tlsCipher: AEAD-CHACHA20-POLY1305-SHA256    # 你手机的指纹,可能唯一
tlsVersion: TLSv1.3
Country / Region / City: US / California / Campbell   # 精确到城市
body: "查询我这个月的周期记录"              # 你查了什么

问题不只是「服务器知道了你查经期」。而是:同样的 IP + 同样的设备指纹,会让服务器把几十次请求 串成同一个人的行为轨迹——你什么时候查、查了几次、有没有变化,全都能对上号。 就算不登录,也一样能被追踪。

Mechanism

OHTTP 的两跳:Relay 与 Gateway

OHTTP(Oblivious HTTP,IETF 标准 RFC 9458)的思路很干脆:把一次请求拆成两跳, 让身份和内容分别落在两个不同的人手里。

请求体用 HPKE(混合公钥加密)封装,只有客户端和应用服务器能解开;Relay 拿到的永远只是噪声。 于是形成「双盲」:Relay 只有身份,Gateway 和应用服务器只有内容,没有一方同时掌握两者。

类比:普通代理像「戴口罩跑腿」——信上还写着你的住址。OHTTP 像把信锁进铁盒: 转运站看得到「某人把盒子交来了」却打不开盒子;开锁处打得开盒子,但盒外的寄件人信息早被转运站撕掉了。
Compare

三个场景,一次说清

Scenario A

没有 OHTTP

应用服务器同时看到你的 IP、设备指纹、位置,以及请求内容
多次请求可被串成同一个人 —— 隐私在这里没有边界。
Scenario B

正确的 OHTTP(Relay 与 Gateway 由不同方运营)

Relay知道「是谁」,但看不到请求内容
Gateway / 服务器知道「发了什么」,但看不到是谁
身份与内容被劈开,没有任何一方能同时拿到两者。
Scenario C

两家都放在 Cloudflare(隐私模型破功)

Cloudflare同时握着「IP」和「明文」—— 一个时间戳就能把两边对上
这正是新 Gateway 会主动拒绝解密来自 Cloudflare Workers / 代理源站请求的原因。

这也是这次发布的核心:过去,服务器已经跑在 Cloudflare 上的客户,没法用 Cloudflare 的 Relay—— 因为那样 Cloudflare 会同时看到元数据和明文。现在客户可以按架构二选一,既不破坏双盲,也不用自建网关。

In Production

现实中已经在跑的例子

How it's built

Cloudflare 的五个工程决策

01 / anycast

全边缘部署

网关跑在 Cloudflare 全球每台边缘服务器上。Relay→Gateway 的跳数被压到最低;如果源站也在 Cloudflare, 解密与回源甚至能落在同一台机器上。

02 / keys

密钥全托管

HPKE 公钥配置由平台维护,公钥挂在 /.well-known/ohttp-gateway。客户端还能从不同 IP 下载密钥,进一步防关联。

03 / access

先鉴权,再解密

Cloudflare Access 在解密之前执行策略:mTLS、静态服务凭证、自定义外部逻辑,用来只放行可信 Relay。

04 / guardrail

拒绝自破双盲

如果请求来自 Cloudflare Workers 或被 Cloudflare 代理的源站,网关会拒绝解密——防止客户不小心把 Relay 和 Gateway 放在同一家。

05 / abuseguard

绑定 zone

网关只服务自己的域名:foo.example.com 能发,wikipedia.com 不能,避免有人把你的 zone 当成打别人域名的跳板。

06 / transport

支持分块传输

同时支持标准与 chunked OHTTP。官方推荐 chunked —— 网关可以按「块」增量处理,延迟更低。

Get started

怎么接入

The catch

一个必踩的坑

OHTTP 只保护网络层。它不碰请求体内容。如果你在 body 里写了 {"email":"xiaomei@example.com", …},那么 Gateway 和应用服务器照样看得一清二楚—— 前面所有加密全部白做。所以「别在请求体里塞能识别身份的信息」是使用 OHTTP 的硬要求。