如何验证你连上的是 TeeChat 的安全 OpenAPI 接入点
TeeChat OpenAPI 是什么?
TeeChat OpenAPI 是托管在 openapi.teechat.ai 上的 OpenAI 兼容 HTTP API。你把现有客户端(OpenClaw、WorkBuddy 等)的 base_url 指过来、用普通 API key,继续调 /v1/chat/completions 即可,不必先接入 TeeChat 聊天 SDK。工具接入示例见 OpenAPI 正式上线:接 WorkBuddy。
和常见「TLS 在普通云主机上终止、运维或失陷主机可能直接看到提示词」的模型 API 不同,TeeChat 的 OpenAPI 接入点 被设计成:
- TLS 连接终止于机密硬件内(受度量的 SEV-SNP / SGX 环境),而不是宿主机上的普通反向代理。
- 你可以独立核对 线上接入点是否与已发布的开源度量值一致(本文主题)。
- 产品承诺是「可验证的 TEE 代理」 — 请求在边界内做推理处理后按 OpenAPI 路径丢弃(该 API 不提供聊天历史产品)。接入点在 TLS 解密后仍会在机密容器内短暂看到明文;这 不是 端到端加密(网关自始至终无法看到明文)。
对用户数据保护意味着什么
| 担心的事 | OpenAPI 能给出的帮助 |
|---|---|
| 流量是不是打到任意中间人? | 可选 challenge + quote:证明线上接入点的 TLS 与代码身份。 |
| 运维能不能随手从宿主机抄提示词? | 私钥与请求处理被限定在机密容器内且其度量值可以验证;TLS 流量仅在机密容器内解密。 |
| 还能否继续用现有工具? | 保持 OpenAI 兼容 — Agent / SDK 不必改成 TeeChat 聊天应用。 |
它不是严格意义上的端到端加密。 端到端、客户端强制的更强机密性见 TeeChat ope.* + TeeChat SDK(机密对话)。OpenAPI 适合 便捷集成 + 可选验证。
多数 OpenAI 客户端 从不 调用证明接口 — 这是有意设计。本文面向 需要证明 的读者:安全评审、监控,以及能在 TeeChat「设置 → 推理 → OpenAPI验证」或多发几次 HTTPS 的集成方。
技术契约(字节布局与 JSON)见:attestation-challenge.md。
你可以验证什么
- TLS 连接终止于 TeeChat 受度量 的接入点内(SGX enclave 或机密虚拟机),而不是任意中间人。
- 挑战/应答验证方式返回新鲜数据,并非攻击方缓存的旧数据。
- 你的安全加密 TLS 连接使用了经过硬件认证的证书公钥,确保没有中间人能够截取数据。
快速路径
| 角色 | 方式 |
|---|---|
| 桌面 — 完整验证 | 打开 TeeChat 桌面应用 → 设置 → 推理 → OpenAPI验证 → 验证 OpenAPI 接入点(quote 密码学、golden digests、会话 SPKI;通过后有字段详情面板)。 |
| Web — 轻量预览(等同 curl) | 需登录 TeeChat 账号。在浏览器新标签页打开 设置 → 推理 → OpenAPI验证 → 点击 获取 challenge 证据。只拉取并展示 challenge JSON 字段,不做 完整验证。完整验证请用桌面端或 CLI。 |
| 命令行 — 轻量预览 | 下文 curl 片段 — 与 Web 轻量预览同级,无需登录;不是 完整验证。 |
| 安全研究者 — 完整验证 | teechat-openapi-attest verify https://openapi.teechat.ai(见下文)。 |
四种方式对比:
| 桌面「验证 OpenAPI 接入点」 | Web「获取 challenge 证据」 | 命令行轻量预览(curl) | 安全研究者「teechat-openapi-attest」 | |
|---|---|---|---|---|
| 需登录 TeeChat | 是 | 是 | 否 | 否 |
| 发 challenge、展示字段 | 是 | 是 | 是(原始 JSON) | 是 |
| 验证 quote 签名 / collateral | 是 | 否 | 否 | 是 |
| 对照 golden digests / SHA256SUMS | 是 | 否 | 否 | 是 |
| 绑定本连接 TLS 对端 SPKI | 是 | 否(浏览器读不到对端证书) | 否 | 是 |
| 验证实现源码 | 客户端内置 | — | — | 开源(teechat-openapi) |
桌面 — 完整验证
- 安装 TeeChat 桌面端 并登录。
- 打开 设置 → 推理 → OpenAPI验证。
- 点击 验证 OpenAPI 接入点。
客户端会在本机 TLS 会话上发起 challenge,核验 quote 密码学、golden digests / SHA256SUMS,并绑定对端证书 SPKI。通过后可打开 查看字段详情。
这是面向普通用户的完整验证路径。浏览器无法读取对端证书,因此网页设置里的检查不能替代桌面完整验证。
Web 轻量预览(等同 curl,非完整验证)
入口(请在新标签页打开):
https://chat.teechat.ai/app?settings=inference&sub=openapi
路径:设置 → 推理 → OpenAPI验证(需先登录 TeeChat 账号)。在 浏览器 中打开后点击 获取 challenge 证据。对公开 challenge 接口而言,这与下方 curl 取到的是同一类 JSON;差别是 网页设置页需要登录,而 curl 直接打公开接口、无需登录。轻量检查只做结构校验并逐字段说明,不是 完整验证。
需要完整验证时:见上文 桌面 — 完整验证,或使用下文 teechat-openapi-attest。
仅取证的 curl(非完整验证)
NONCE=$(openssl rand -base64 32 | tr '+/' '-_' | tr -d '=\n')
curl -fsS -X POST https://openapi.teechat.ai/v1/attestation/challenge \
-H 'Content-Type: application/json' \
-d "{\"nonce_b64\":\"${NONCE}\"}" | tee /tmp/openapi-challenge.json
完整验证请用完整验证器或 TeeChat 桌面客户端。
完整验证器(推荐)
克隆 teechat-openapi 仓库,在仓库根目录执行:
cargo run -p teechat-openapi-attest -- verify https://openapi.teechat.ai
或安装二进制后:
teechat-openapi-attest verify https://openapi.teechat.ai
验证器会:
- 首选: 从 GitHub Releases 拉取
openapi-edge-attest.json与SHA256SUMS。 - 建立 TLS 连接、读取对端叶证书 SPKI,并在 同一会话 上 POST 新鲜 challenge。
- 验证硬件 quote(当前公网接入点为 SNP 报告;也接受可远程验证的 SGX DCAP ECDSA)及 collateral。
- 用你的 nonce 与 JSON 身份字段重算
report_data。 - 对照 app allowlist 中该主机名的
build_version、code_hash、measurement、policy_hash;若存在SHA256SUMS,还要求code_hash出现在其中。 - 按 allowlist 行的
golden_version核对公开 golden digests(TEE / 镜像度量)。 - 将
edge.tls_cert_spki_sha256绑定到实时 TLS 对端(VIP 探测可用--skip-session-spki跳过)。
退出码 0 且 "ok": true 表示全部通过;退出码 2 表示失败 — 查看 stderr 与 JSON 结论。
信任:GitHub 首选,teechat.ai 回退
OpenAPI(以及 OPE、Inference Engine)均为开源,GitHub Releases 是首选信任根:
- Release 页面:https://github.com/Lightec-AI/teechat-openapi/releases
- 资产:
openapi-edge-attest.json(度量 allowlist)与SHA256SUMS(二进制摘要)
若无法访问 GitHub,验证器回退到 TeeChat 网站上的 Ed25519 签名镜像:
此时 JSON 中 "trust_source": "teechat_fallback",并填充 trust_fallback_tip(同时打印到 stderr)。网络恢复后请打开 GitHub Release,核对 openapi-edge-attest.json / SHA256SUMS 中的 build_version、code_hash、measurement 与本次结果一致。
如何解读「通过」
验证成功时 JSON 大致如下(公网 openapi.teechat.ai 当前为 SNP CVM;字段名与 teechat-openapi-attest / 桌面完整验证一致):
{
"ok": true,
"endpoint": "https://openapi.teechat.ai",
"hostname": "openapi.teechat.ai",
"quote_format": "snp_report",
"build_version": "0.8.1",
"code_hash": "<64 hex>",
"measurement": {
"kind": "launch_digest",
"launch_digest": "<64 hex>",
"image_digest": "<64 hex>"
},
"golden_version": "openapi-golden-…-seal-sync-app-0.8.1",
"policy_hash": "<64 hex>",
"tls_cert_spki_sha256": "<64 hex>",
"peer_spki_sha256": "<64 hex>",
"session_bind_mode": "spki",
"manifest_epoch": 1,
"manifest_key_id": "github:teechat-openapi:v0.8.1",
"trust_source": "github",
"golden_trust_source": "github",
"github_release_url": "https://github.com/Lightec-AI/teechat-openapi/releases/tag/v0.8.1",
"trust_fallback_tip": "",
"hardware": {
"kind": "snp_report",
"product": "…",
"launch_measurement": "<96 hex>",
"challenge_canonical_launch_digest": "<64 hex>",
"policy_debug": false,
"guest_svn": 0
},
"verified_at_unix": 1750000000
}
| 字段 | 含义 |
|---|---|
ok | 全部策略检查通过。 |
hostname | 用于对照 allowlist 行的主机名(通常等于 endpoint 主机)。 |
quote_format | 公网当前为 snp_report;验证器也接受 sgx_dcap_ecdsa。拒绝仅本地的 sgx_report。 |
build_version / code_hash / measurement | app allowlist(GitHub Release)锁定的接入点身份。公网 measurement 为 launch_digest + image_digest(非 SGX mrenclave)。 |
golden_version / golden_trust_source | 拆分信任:TEE/镜像度量钉在 teechat-golden-digests(或 www 回退);与 app 行上的 golden_version 对齐。 |
policy_hash | challenge 报告的运行时策略摘要;须与 allowlist 行一致(若该行要求)。 |
trust_source | app allowlist 来源:github(首选)、teechat_fallback 或 local。 |
trust_fallback_tip | 使用 teechat.ai app 回退时非空 — 如何再核对 GitHub Release。 |
tls_cert_spki_sha256 / peer_spki_sha256 | quote 声称的服务端 SPKI vs 本连接观察到的对端 SPKI。 |
session_bind_mode | spki = 绑定叶证书 SPKI(契约);cert_der = 旧版整叶证书哈希;skipped = 使用了 --skip-session-spki。 |
manifest_epoch | app allowlist 世代;epoch 变更时需重新验证。 |
hardware.policy_debug(SNP)/ hardware.debug(SGX) | 生产策略 reject_debug 下须为 false。 |
通过证明什么: 你连接的主机 TLS 证书与 quote 一致、quote 对你的 nonce 新鲜、硬件签名有效,且运行中的接入点同时匹配 app Release 行 与 golden digests(GitHub 为主;不可达时为 teechat.ai 签名镜像)。
不能证明什么: 提示词在 TEE 内 TLS 之外的机密性(那是 OPE / 机密对话路径,见文首)。
威胁模型
| 威胁 | 缓解 |
|---|---|
| 真实接入点前的 恶意反向代理 | 会话 SPKI 绑定:quote 必须指向 你这条 TLS 连接的证书。 |
| 重放 旧 quote | 新鲜 32 字节 nonce 写入 report_data;拒绝过期响应。 |
| Debug / 不可信 enclave 或 CVM | 硬件验证 + allowlist 策略 reject_debug。 |
| 真实 TEE 内跑了 错误二进制 | allowlist 锁定 launch+image digest(或 SGX MRENCLAVE)、code_hash、build_version,并钉 golden_version。 |
| 曾有效但已 过期的接入点 | 以 对端 SPKI + manifest epoch 为键缓存信任,TTL ≤ 1 小时;SPKI 变化、epoch bump 或 TTL 到期时再 challenge — 不要 每次补全都做。 |
不掌控客户端 TLS 套接字的 VIP 监控可用 --skip-session-spki,只检查「线上接入点在清单内」。严肃集成方应绑定 SPKI。
协议与绑定细节不在此展开 — 感兴趣的用户与安全专家请直接读开源仓库与下列文档。
延伸阅读
- teechat-openapi SECURITY.md
- Attestation challenge 报文格式
- 如何验证机密聊天(OPE / 应用内设置路径)
修订记录
- 避免把 OpenAPI 设置检查称作网页预览。
- 精简客户向核验指南:接入点用词;快速路径四向对比与桌面完整验证;删协议细节并指向源码;「通过」字段对齐 SNP/拆分信任。
- 客户向用词:将「OpenAPI 边缘」改为「OpenAPI 接入点」。
- 补充 Web 轻量 challenge 预览(等同 curl)、桌面字段详情面板,并厘清完整验证与仅取证路径。
- 为 Web 轻量预览加上 chat.teechat.ai 深链,并厘清预览与完整验证的区别。
- OpenAPI 验证改到「设置 → 推理」;更新深链。
- 在技术步骤前先说明 TeeChat OpenAPI 是什么,以及验证如何帮助保护数据。