第 7 讲:Agent Identity / Workload Identity 与 Attestation

Codex 源码解析 · 第 7 讲

Codex 源码解析系列 第 7 讲:Agent Identity / Workload Identity 与 Attestation 基于 OpenAI Codex 源码 · 2026-10-01 💡 本讲一句话: Codex 以托管 agent 身份无人值守运行时,"我是谁"不能再靠人的登录态——这一讲拆三条机器身份路径:Agent Identity 用 Ed25519 密钥对给每个请求现签断言(传输中无长效 token)、Workload Identity 拿企业 JWT assertion 换 ≤1h 的 access_token 并单飞缓存、Attestation 在 100ms 内向宿主进程要一个即时证明头。读完你会明白:机器凭证怎么出生、为什么不能重放、各自在哪里被验证。 一、为什么 Codex 需要"机器身份" 第 6 讲的登录流程解决的是 人 的身份:浏览器 OAuth、PKCE、keyring 存 token。但 Codex 还有另一类运行场景——托管 agent(app-server 背后跑的任务)、企业 CI/CD 里的批量执行、跨云工作负载。这些场景里没有人坐在终端前点"登录",凭证必须来自 机器 :要么服务端给这个 agent 发身份,要么企业的身份系统把 JWT assertion 塞进文件让 Codex 去换 token。 源码里这是三条独立但互补的路径,分布在五个位置: 🔹 agent-identity/src/lib.rs (1000 行):密钥生成、两级注册、逐请求签名、JWKS 验签——机器身份核心库 🔹 login/src/auth/agent_identity.rs (601 行):bootstrap 编排 + 重试分类,把核心库接进登录体系 🔹 workload-identity/src/{lib,exchange,assertion}.rs (约 500 行):assertion → token 交换 + 单飞缓存 🔹 login/src/auth/workload_identity.rs (486 行):环境变量探测、主体锁定、进程级会话注册表 🔹 core/src/attestation.rs (26 行)+ app-server/src/attestation.rs (220 行):attestation trait 与 app-server 实现 先看 Agent Identity 的起点——密钥从哪来。 二、一把 Ed25519 密钥对,三种用途 generate_agent_key_material() ( agent-identity/src/lib.rs 第 425-446 行)是整条身份链的源头。注意它不是直接生成 32 字节种子,而是先采 64 字节随机数再经 SHA-512 派生: 📄 codex-rs/agent-identity/src/lib.rs (第 425-446 行) pub fn generate_agent_key_material() -> Result<GeneratedAgentKeyMaterial> { // 生成 agent 身份密钥对:私钥本地保管,公钥上报服务端 let mut seed_material = [0u8; AGENT_IDENTITY_KEY_SEED_BYTES]; // 先准备 64 字节随机种子(常量=64),比 Ed25519 需要的 32 字节多一倍 OsRng.try_fill_bytes(&mut seed_material) // 用操作系统 CSPRNG 填充;身份密钥绝不允许降级到弱随机源 .context("failed to generate agent identity private key seed material")?; // 失败直接报错,错误信息写明意图便于排查 let mut digest = Sha512::new(); // SHA-512 输出 64 字节:一次派生同时喂饱 Ed25519 种子和 Curve25519 密钥 digest.update(AGENT_IDENTITY_KEY_DERIVATION_CONTEXT); // 混入固定上下文串 "codex-a…

阅读全文:Codex 源码解析 第 7 讲