検証可能なレスポンス

relay がモデルをすり替えていないか確認する方法

Wokey のそのまま転送する経路では、公式上流が返した生のバイトに対して AWS Nitro Enclave が発行した署名付きの証明をレスポンスに添付できます。Wokey を信頼する必要はなく、オープンソースの検証ツールを使ってご自身のマシンで確認できます。

レスポンスの内容だけでは何も証明できません

relay は JSON の model フィールドに何でも書けますし、回答の品質も主観的な判断にすぎません。あるレスポンスが公式上流の返したものとまったく同じであることを示すには、relay が偽造できず、あなたが独立して確認できる署名が必要です。

証明の生成方法

公式出口は、隔離された信頼実行環境である AWS Nitro Enclave 内で動作します。Enclave はリクエストごとに次の処理を行います。

  1. 1公式上流との TLS 接続を Enclave 内で終端し、イメージに組み込まれた CA バンドルで上流の証明書を検証します。
  2. 2レスポンスをストリーミングで返しながらハッシュを計算し、本文全体をバッファリングしません。
  3. 3起動時に生成され、Enclave の外に一切出ない Ed25519 鍵でステートメントに署名します。ステートメントには上流ホスト、パス、メソッド、ステータス、Content-Type、およびリクエスト本文とレスポンス本文それぞれの SHA-256 が含まれます。
  4. 4署名用公開鍵と Enclave イメージの測定値(PCR0)を AWS Nitro ルート証明書に結び付ける AWS Nitro attestation を添付します。

ローカルで確認できること

  • attestation が、AWS のドキュメントから自分で固定した Nitro ルート証明書までチェーンしていること。
  • PCR0 がオープンソースリポジトリで公開され、自分でビルドして再現できる値と一致すること。つまり Enclave はその公開ソースを実行しています。
  • 受け取ったバイトのハッシュがステートメント内の response_body_sha256 と一致すること。つまり relay は 1 バイトも変更していません。
  • ステートメント内の上流ホストが公式ホストであること。たとえば Claude のリクエストなら api.anthropic.com です。レスポンスの model フィールドは、公式上流が返した署名済みの生のバイトの一部です。

証明が付くレスポンス

前提条件:API ページで API キーの「公式検証」をオンにしてください。

リクエスト証明の受け渡し方法
Anthropic Messages ストリーミング(/v1/messages、stream: true)上流の SSE をそのまま転送し、末尾に event: tee.proof を追加
OpenAI Responses ストリーミング(/v1/responses、公式 Codex ルート)上流の SSE をそのまま転送し、末尾に event: tee.proof を追加
非ストリーミングの Messages / Responsesヘッダー x-wokey-tee-proof-mode: multipart を送ると multipart/mixed が返ります。1 つ目のパートが上流の生のバイト(Responses は上流の SSE)、2 つ目のパートが証明です

証明が付かないレスポンス

  • Chat Completions 経由で Claude を呼び出す場合など、形式の互換性のために Wokey が変換または再シリアライズしたレスポンス。変更後のバイトに署名すると誤解を招くため、これらのレスポンスには証明が付きません。
  • Studio を含む画像生成と画像編集は常に Enclave を経由せず、証明は生成されません。
  • Enclave が一時的に利用できない場合、リクエストは Enclave を使わない公式出口にフォールバックし、そのレスポンスには証明がありません。
  • レスポンスをそのまま転送できないルートで multipart の証明を要求すると、Wokey は偽の証明ではなく HTTP 422 tee_proof_multipart_requires_raw_passthrough を返します。

ルールは 1 つだけです:tee.proof のないレスポンスは未証明として扱ってください。

証明が示さないこと

  • 証明するのは完全性であり、機密性ではありません。Wokey の relay は転送中に平文を扱います(保存はしません)。運営者がトラフィックをまったく読めないことが必要な場合、この仕組みはその対象外です。
  • リクエスト本文のハッシュは、実際に上流へ送られた本文が対象です。ゲートウェイがリクエストを書き換えた場合(たとえば Responses リクエストでは一部のフィールドが補完されます)、手元の元の本文とは一致しないため、Responses の証明は現在レスポンスのみを証明します。
  • リトライなど、バイト単位で同一のリクエストの間では、古いレスポンスが再送(リプレイ)されたかどうかを検証ツールは区別できません。
  • 信頼の起点は AWS です。Nitro attestation には AWS が署名します。

実際に検証してみる

  1. 1

    キーの検証をオンにする

    API ページで API キーを作成し、「公式検証」をオンにします。

  2. 2

    ストリーミングレスポンスを保存する

    ストリーミングの Messages リクエストを送り、curl -o でレスポンス全体をそのままファイルに保存します。ファイルの末尾は event: tee.proof になっているはずです。Windows では PowerShell の > リダイレクトやメモ帳での再保存ではなく curl.exe -o を使ってください。これらは改行コードや文字コードを変えてしまいます。

    ストリーミングレスポンスを保存する
    curl -sN https://api.wokey.ai/v1/messages \
      -H "x-api-key: YOUR_API_KEY" \
      -H "anthropic-version: 2023-06-01" \
      -H "Content-Type: application/json" \
      -d '{"model":"claude-sonnet-5","max_tokens":256,"stream":true,"messages":[{"role":"user","content":"Hello"}]}' \
      -o captured-response
  3. 3

    オープンソースの検証ツールで確認する

    <PCR0> をリポジトリの README で公開されている正規の PCR0 に置き換えてから、検証ツールを実行します。ファイルの内容をブラウザ版の検証ツールに貼り付けることもでき、すべての確認はローカルで行われます。

    オープンソースの検証ツールで確認する
    git clone https://github.com/focuxdot/proof-of-observation
    cd proof-of-observation/verifier
    npm install
    npx tsx tee-verify-stream.ts ../../captured-response --pcr0 <PCR0>