relay가 모델을 바꿔치기했는지 확인하는 방법
Wokey의 원본 그대로 전달하는 경로에서는 공식 업스트림이 반환한 원본 바이트에 대해 AWS Nitro Enclave가 발급한 서명된 증명이 응답에 포함될 수 있습니다. Wokey를 신뢰할 필요 없이 오픈 소스 검증기로 직접 내 컴퓨터에서 확인할 수 있습니다.
응답 내용만으로는 아무것도 증명할 수 없습니다
relay는 JSON의 model 필드에 무엇이든 쓸 수 있고, 답변 품질도 주관적인 판단일 뿐입니다. 어떤 응답이 공식 업스트림이 반환한 것과 정확히 같다는 것을 보이려면 relay가 위조할 수 없고 사용자가 독립적으로 확인할 수 있는 서명이 필요합니다.
증명이 만들어지는 방식
공식 출구는 격리된 신뢰 실행 환경인 AWS Nitro Enclave 안에서 실행됩니다. Enclave는 요청마다 다음을 수행합니다.
- 1공식 업스트림과의 TLS 연결을 Enclave 안에서 종료하고, 이미지에 내장된 CA 번들로 업스트림 인증서를 검증합니다.
- 2응답을 스트리밍으로 전달하면서 해시를 계산하며, 전체 본문을 버퍼링하지 않습니다.
- 3부팅 시 생성되어 Enclave 밖으로 절대 나가지 않는 Ed25519 키로 명세서에 서명합니다. 명세서에는 업스트림 호스트, 경로, 메서드, 상태 코드, Content-Type, 그리고 요청 본문과 응답 본문 각각의 SHA-256이 담깁니다.
- 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가 반환됩니다. 첫 번째 파트는 업스트림 원본 바이트(Responses는 업스트림 SSE), 두 번째 파트는 증명입니다 |
증명이 포함되지 않는 응답
- Chat Completions로 Claude를 호출하는 경우처럼 Wokey가 형식 호환을 위해 변환하거나 다시 직렬화한 응답. 변경된 바이트에 서명하면 오해를 부르므로 이런 응답에는 증명이 절대 포함되지 않습니다.
- Studio를 포함한 이미지 생성과 이미지 편집은 항상 Enclave를 거치지 않으며 증명을 만들지 않습니다.
- Enclave를 일시적으로 사용할 수 없으면 요청은 Enclave 없는 공식 출구로 전환되고, 그 응답에는 증명이 없습니다.
- 응답을 그대로 전달할 수 없는 경로에서 multipart 증명을 요청하면 Wokey는 가짜 증명 대신 HTTP 422 tee_proof_multipart_requires_raw_passthrough를 반환합니다.
규칙은 하나입니다. tee.proof가 없는 응답은 모두 증명되지 않은 것으로 간주하세요.
증명이 보여 주지 않는 것
- 증명하는 것은 무결성이지 기밀성이 아닙니다. Wokey relay는 전달 중에 평문을 다룹니다(저장하지는 않습니다). 운영자가 트래픽을 전혀 읽을 수 없어야 한다면 이 메커니즘은 그 경우를 다루지 않습니다.
- 요청 본문 해시는 실제로 업스트림에 전송된 본문을 대상으로 합니다. 게이트웨이가 요청을 다시 쓰면(예: Responses 요청은 일부 필드가 채워짐) 로컬의 원래 본문과 일치하지 않으므로, 현재 Responses 증명은 응답만 증명합니다.
- 재시도처럼 바이트 단위로 동일한 요청 사이에서는 오래된 응답이 재전송(리플레이)되었는지 검증기가 구분할 수 없습니다.
- 신뢰의 기반은 AWS이며, Nitro attestation은 AWS가 서명합니다.
직접 검증해 보기
- 1
키 검증 켜기
API 페이지에서 API 키를 만들고 “공식 검증”을 켜세요.
- 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
오픈 소스 검증기로 확인하기
<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>