@agentunion/fastaun-browser 0.2.19 → 0.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/_packed_docs/CHANGELOG.md +26 -0
  3. package/_packed_docs/agent.md/SCHEMA.md +173 -0
  4. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +61 -0
  5. package/_packed_docs/agent.md/examples/human-developer.md +60 -0
  6. package/_packed_docs/agent.md/examples/openclaw-lobster.md +52 -0
  7. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +43 -0
  8. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +205 -0
  9. package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +197 -0
  10. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +549 -0
  11. package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +810 -0
  12. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +262 -0
  13. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +180 -0
  14. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +164 -0
  15. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1135 -0
  16. package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +234 -0
  17. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +900 -0
  18. package/_packed_docs/protocol/08-AUN-E2EE.md +413 -0
  19. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +316 -0
  20. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +804 -0
  21. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +271 -0
  22. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +329 -0
  23. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +141 -0
  24. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -0
  25. package/_packed_docs/protocol/README.md +71 -0
  26. package/_packed_docs/protocol/agent.md/SCHEMA.md +118 -0
  27. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +61 -0
  28. package/_packed_docs/protocol/agent.md/examples/human-developer.md +60 -0
  29. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +52 -0
  30. package/_packed_docs/protocol/aun-docs-guide.md +49 -0
  31. package/_packed_docs/protocol/index.md +114 -0
  32. package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +205 -0
  33. package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +249 -0
  34. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +337 -0
  35. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +80 -0
  36. package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +704 -0
  37. package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +620 -0
  38. package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +605 -0
  39. package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +548 -0
  40. package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +513 -0
  41. package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +619 -0
  42. package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +492 -0
  43. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +402 -0
  44. package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +130 -0
  45. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +267 -0
  46. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +367 -0
  47. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +223 -0
  48. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +354 -0
  49. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +172 -0
  50. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +373 -0
  51. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +611 -0
  52. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1152 -0
  53. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +150 -0
  54. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +89 -0
  55. package/_packed_docs/sdk/09-custody-api-manual.md +445 -0
  56. package/_packed_docs/sdk/09-group-rpc-manual.md +1895 -0
  57. package/_packed_docs/sdk/09-message-rpc-manual.md +597 -0
  58. package/_packed_docs/sdk/09-meta-rpc-manual.md +142 -0
  59. package/_packed_docs/sdk/09-payload-reference.md +702 -0
  60. package/_packed_docs/sdk/09-storage-rpc-manual.md +408 -0
  61. package/_packed_docs/sdk/09-stream-rpc-manual.md +275 -0
  62. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +72 -0
  63. package/_packed_docs/sdk/INDEX.md +131 -0
  64. package/_packed_docs/sdk/README.md +307 -0
  65. package/dist/auth.d.ts +2 -1
  66. package/dist/auth.d.ts.map +1 -1
  67. package/dist/auth.js +13 -11
  68. package/dist/auth.js.map +1 -1
  69. package/dist/client.d.ts +38 -8
  70. package/dist/client.d.ts.map +1 -1
  71. package/dist/client.js +179 -97
  72. package/dist/client.js.map +1 -1
  73. package/dist/namespaces/auth.d.ts +1 -0
  74. package/dist/namespaces/auth.d.ts.map +1 -1
  75. package/dist/namespaces/auth.js +20 -6
  76. package/dist/namespaces/auth.js.map +1 -1
  77. package/dist/transport.d.ts +9 -1
  78. package/dist/transport.d.ts.map +1 -1
  79. package/dist/transport.js +24 -0
  80. package/dist/transport.js.map +1 -1
  81. package/package.json +40 -37
@@ -0,0 +1,549 @@
1
+ # 1. 身份与凭证协议 auth.*
2
+
3
+ > 本文档定义 `auth.*` 命名空间的完整规范,覆盖 AID 创建、双向认证、JWT token 生命周期、证书管理等所有身份与凭证相关方法。
4
+
5
+ ## 1.1 目标与角色边界
6
+
7
+ `auth.*` 命名空间的职责范围:
8
+
9
+ - **身份初始化**:AID 创建(`auth.create_aid`),为尚无身份的客户端提供 bootstrap 入口
10
+ - **双向认证**:两阶段挑战-响应(`auth.aid_login1` / `auth.aid_login2`),完成客户端与 Auth 服务的双向身份验证
11
+ - **Token 生命周期**:JWT 签发、刷新(`auth.refresh_token`)
12
+ - **证书生命周期**:下载(`auth.download_cert`)、续期(`auth.renew_cert`)、密钥轮转(`auth.rekey`)、额外曲线申请(`auth.request_cert`)
13
+
14
+ **不承担的职责**:
15
+
16
+ - 连接模式协商和会话管理 — 由 `auth.connect` 完成(见 [03-Gateway-连接模式](03-Gateway-连接模式.md))
17
+ - Peer / Relay 模式下的对等认证 — 由 `peer.*` 完成
18
+ - Gateway 路由与转发逻辑 — Gateway 仅负责将 `auth.*` 请求转发到 Auth 服务
19
+
20
+ **职责分工**:
21
+
22
+ | 角色 | 职责 |
23
+ |------|------|
24
+ | **Auth 服务** | 处理所有 `auth.*` 方法,签发证书和 JWT |
25
+ | **Gateway** | 仅路由转发 `auth.*` 请求到 Auth 服务,不参与认证逻辑 |
26
+ | **客户端** | 生成和保管私钥,发起认证请求,管理本地证书和 token |
27
+
28
+ ## 1.2 AID、证书、私钥、Token 关系
29
+
30
+ ```
31
+ 私钥 (客户端本地)
32
+
33
+ ├── 生成公钥 ──→ auth.create_aid ──→ AID + 证书
34
+ │ │
35
+ │ ├── AID = {name}.{issuer},全局唯一
36
+ │ └── 证书 = X.509 v3,Issuer CA 签发,ECDSA
37
+
38
+ └── 签名 nonce ──→ auth.aid_login1/2 ──→ JWT Token
39
+
40
+ └── Auth 服务签发,Gateway 模式使用
41
+ ```
42
+
43
+ 关键约束:
44
+
45
+ - **私钥**永不传输,客户端本地生成和存储
46
+ - **AID** 格式为 `{name}.{issuer}`,全局唯一标识符(详见 [02-证书与信任体系](02-证书与信任体系.md) §2.1)
47
+ - **证书**由 Issuer CA 签发,遵循四级证书链:Root CA → Registry CA → Issuer CA → Agent(详见 [02-证书与信任体系](02-证书与信任体系.md) §2.3)
48
+ - **JWT Token** 由 Auth 服务签发,仅在 Gateway 模式下使用,用于 `auth.connect` 会话初始化认证
49
+ - 创建 AID 时固定使用 P-256 曲线,额外曲线通过 `auth.request_cert` 申请
50
+
51
+ ## 1.3 auth.create_aid
52
+
53
+ 开放注册接口,可在未认证状态下调用。用于让尚无 AID 的客户端完成首次 bootstrap。
54
+
55
+ **请求参数**:
56
+
57
+ | 参数 | 类型 | 必需 | 说明 |
58
+ |------|------|:----:|------|
59
+ | `aid` | string | 是 | Agent Identifier,格式 `{name}.{issuer}` |
60
+ | `public_key` | string | 是 | Base64 编码的 SPKI 格式公钥,必须为 P-256 |
61
+
62
+ AID 命名规则:
63
+ - `name`:4-64 字节,仅允许 `[a-z0-9_-]`,首字符不允许为 `-`,不允许包含 `.`,不能以 `guest` 开头
64
+ - `issuer`:合法的可注册域名(如 `aid.pub`、`company.co.uk`)
65
+
66
+ **请求**:
67
+
68
+ ```json
69
+ {
70
+ "jsonrpc": "2.0",
71
+ "id": 1,
72
+ "method": "auth.create_aid",
73
+ "params": {
74
+ "aid": "alice.aid.pub",
75
+ "public_key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE..."
76
+ }
77
+ }
78
+ ```
79
+
80
+ **响应**:
81
+
82
+ ```json
83
+ {
84
+ "jsonrpc": "2.0",
85
+ "id": 1,
86
+ "result": {
87
+ "aid": "alice.aid.pub",
88
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
89
+ "ca_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
90
+ "curve": "P-256"
91
+ }
92
+ }
93
+ ```
94
+
95
+ **说明**:
96
+ - Gateway 将请求转发到 Auth 服务,Auth 服务调用 CA 签发证书
97
+ - 创建 AID 时固定签发 P-256 证书,确保最大兼容性
98
+ - 协议默认允许创建任意 `aid`;命名冲突、抢注、保留名、审批制等约束由具体网络运营策略决定
99
+ - 客户端需保存返回的证书和本地生成的私钥
100
+
101
+ ## 1.4 auth.aid_login1 / auth.aid_login2
102
+
103
+ 两阶段双向认证,客户端与 Auth 服务互相验证身份。
104
+
105
+ ### Phase 1:auth.aid_login1
106
+
107
+ 客户端发送 `client_nonce` 要求 Auth 服务证明身份,Auth 服务返回 `server_nonce` 要求客户端证明身份。
108
+
109
+ **请求参数**:
110
+
111
+ | 参数 | 类型 | 必需 | 说明 |
112
+ |------|------|:----:|------|
113
+ | `aid` | string | 是 | Agent Identifier |
114
+ | `cert` | string | 是 | 客户端 AID 证书(PEM 格式) |
115
+ | `client_nonce` | string | 是 | 客户端随机 nonce(UUID),有效期 1 分钟 |
116
+
117
+ > **注意**:`request_id` 由服务端在 Phase 1 响应中生成并返回,客户端在 Phase 2 中回传。客户端无需在 Phase 1 请求中提供 `request_id`。
118
+
119
+ **请求**:
120
+
121
+ ```json
122
+ {
123
+ "jsonrpc": "2.0",
124
+ "id": 2,
125
+ "method": "auth.aid_login1",
126
+ "params": {
127
+ "aid": "alice.aid.pub",
128
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
129
+ "client_nonce": "550e8400-e29b-41d4-a716-446655440000"
130
+ }
131
+ }
132
+ ```
133
+
134
+ **响应**:
135
+
136
+ ```json
137
+ {
138
+ "jsonrpc": "2.0",
139
+ "id": 2,
140
+ "result": {
141
+ "request_id": "req-a1b2c3d4e5f6",
142
+ "nonce": "server_challenge_nonce",
143
+ "server_time": 1735689600,
144
+ "client_nonce_signature": "ecdsa_signature_of_client_nonce",
145
+ "auth_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
146
+ "auth_curve": "P-256"
147
+ }
148
+ }
149
+ ```
150
+
151
+ **双向认证机制**:
152
+
153
+ Auth 服务侧(验证客户端):
154
+ 1. 解析客户端提交的 Agent 证书
155
+ 2. 提取证书中的 AIA 扩展,获取 Issuer CA URL
156
+ 3. 验证证书链签名到 Root CA
157
+ 4. 检查证书有效期和吊销状态
158
+ 5. 签名 `client_nonce`,连同 Auth 服务证书一起返回
159
+
160
+ 客户端侧(验证 Auth 服务):
161
+ 1. 解析 `auth_cert`,验证证书链到 Root CA
162
+ 2. 用 `auth_cert` 公钥验证 `client_nonce_signature`
163
+ 3. 验证通过,确认 Auth 服务身份真实
164
+
165
+ **Nonce 生命周期**:
166
+ - `nonce` 绑定 `aid` + `request_id`,一次性消费
167
+ - 被 `aid_login2`、`renew_cert` 或 `rekey` 中任一操作消费后立即失效
168
+ - 有效期 1 分钟,超时未消费自动失效
169
+
170
+ ### Phase 2:auth.aid_login2
171
+
172
+ 客户端签名 Auth 服务的 `nonce`,提交验证并获取 JWT token。
173
+
174
+ **请求参数**:
175
+
176
+ | 参数 | 类型 | 必需 | 说明 |
177
+ |------|------|:----:|------|
178
+ | `aid` | string | 是 | Agent Identifier |
179
+ | `request_id` | string | 是 | 与 login1 中的 request_id 一致 |
180
+ | `nonce` | string | 是 | 来自 login1 响应的服务端挑战 nonce |
181
+ | `client_time` | number | 是 | 客户端时间戳(Unix timestamp) |
182
+ | `signature` | string | 是 | 对 `nonce:client_time` 的 ECDSA 签名 |
183
+ | `cert` | string | 是 | 客户端 AID 证书(PEM 格式) |
184
+
185
+ **签名算法**:
186
+
187
+ ```
188
+ message = nonce + ":" + client_time
189
+ signature = ECDSA_sign(private_key, SHA256(message))
190
+ ```
191
+
192
+ **请求**:
193
+
194
+ ```json
195
+ {
196
+ "jsonrpc": "2.0",
197
+ "id": 3,
198
+ "method": "auth.aid_login2",
199
+ "params": {
200
+ "aid": "alice.aid.pub",
201
+ "request_id": "request-uuid-12345",
202
+ "nonce": "server_challenge_nonce",
203
+ "client_time": 1735689550,
204
+ "signature": "ecdsa_signature_of_nonce_and_time",
205
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
206
+ }
207
+ }
208
+ ```
209
+
210
+ **响应**:
211
+
212
+ ```json
213
+ {
214
+ "jsonrpc": "2.0",
215
+ "id": 3,
216
+ "result": {
217
+ "status": "ok",
218
+ "aid": "alice.aid.pub",
219
+ "token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...",
220
+ "expires_in": 3600,
221
+ "new_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
222
+ }
223
+ }
224
+ ```
225
+
226
+ **响应字段说明**:
227
+
228
+ | 字段 | 说明 |
229
+ |------|------|
230
+ | `status` | 认证状态,`ok` 表示成功 |
231
+ | `aid` | 认证成功的 AID |
232
+ | `token` | JWT token,推荐有效期 1 小时 |
233
+ | `expires_in` | Token 有效期(秒) |
234
+ | `new_cert` | 可选,仅当证书有效期过半时自动续期返回 |
235
+
236
+ **服务端验证流程**:
237
+ 1. 验证 `request_id` 和 `nonce` 与 login1 中一致且未过期
238
+ 2. 从 `cert` 中提取公钥,验证证书链
239
+ 3. 验证签名:`ECDSA_verify(public_key, SHA256(nonce + ":" + client_time), signature)`
240
+ 4. 签名验证通过后,签发 JWT token
241
+
242
+ **关键说明**:
243
+ - `login2` 返回 token 但**不改变连接状态**,客户端需调用 `auth.connect` 完成会话初始化(见 [03-Gateway-连接模式](03-Gateway-连接模式.md))
244
+ - `client_time` 仅用于审计日志中的时钟偏移检查,不影响认证结果
245
+ - 当 `new_cert` 存在时,客户端必须保存新证书替换旧证书,下次登录使用新证书
246
+
247
+ ## 1.5 auth.refresh_token
248
+
249
+ 刷新 JWT token。客户端显式提交 `refresh_token` 换取新的 `access_token` 和 `refresh_token`。
250
+
251
+ > **注意**:此方法不要求在已认证连接上调用,可通过独立的 HTTP/WebSocket 请求调用(refresh token grant 模式)。
252
+
253
+ **请求**:
254
+
255
+ ```json
256
+ {
257
+ "jsonrpc": "2.0",
258
+ "id": 4,
259
+ "method": "auth.refresh_token",
260
+ "params": {
261
+ "refresh_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9..."
262
+ }
263
+ }
264
+ ```
265
+
266
+ **响应**:
267
+
268
+ ```json
269
+ {
270
+ "jsonrpc": "2.0",
271
+ "id": 4,
272
+ "result": {
273
+ "success": true,
274
+ "access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...",
275
+ "refresh_token": "new_refresh_token...",
276
+ "expires_in": 3600
277
+ }
278
+ }
279
+ ```
280
+
281
+ **说明**:
282
+ - 调用时提交当前持有的 `refresh_token`
283
+ - 服务端验证后吊销旧 `refresh_token`,签发新的 `access_token` 和 `refresh_token`
284
+ - 旧 access_token 在其过期时间前仍然有效(JWT 标准行为),但客户端应立即切换到新 token
285
+ - 建议在 access_token 过期前 60 秒刷新
286
+
287
+ **刷新限制**:
288
+ - 刷新链总时长不超过 30 天,或最多刷新 720 次
289
+ - 达到限制后返回错误,客户端必须重新执行完整的两阶段认证
290
+ - 具体限制值由服务端实现决定
291
+
292
+ ## 1.6 证书生命周期方法
293
+
294
+ ### auth.download_cert
295
+
296
+ 按证书序列号下载证书,用于证书链验证。
297
+
298
+ **请求**:
299
+
300
+ ```json
301
+ {
302
+ "jsonrpc": "2.0",
303
+ "id": 5,
304
+ "method": "auth.download_cert",
305
+ "params": {
306
+ "cert_sn": "1234567890ABCDEF"
307
+ }
308
+ }
309
+ ```
310
+
311
+ **参数**:
312
+ - `cert_sn`:证书序列号(十六进制字符串)。特殊值 `"root"` 表示下载 Root CA 证书
313
+
314
+ **响应**:
315
+
316
+ ```json
317
+ {
318
+ "jsonrpc": "2.0",
319
+ "id": 5,
320
+ "result": {
321
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
322
+ "ca_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
323
+ "cert_chain": [
324
+ "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
325
+ ]
326
+ }
327
+ }
328
+ ```
329
+
330
+ ### auth.renew_cert
331
+
332
+ 证书过期续期,复用原公钥获取新证书。适用于客户端离线较长时间、证书已过期但私钥仍在的场景。
333
+
334
+ **前置条件**:先调用 `auth.aid_login1` 获取 nonce。
335
+
336
+ **请求参数**:
337
+
338
+ | 参数 | 类型 | 必需 | 说明 |
339
+ |------|------|:----:|------|
340
+ | `aid` | string | 是 | Agent Identifier |
341
+ | `old_cert` | string | 是 | 已过期的旧证书(PEM 格式) |
342
+ | `signature` | string | 是 | 用旧私钥对 nonce 的 ECDSA 签名 |
343
+ | `nonce` | string | 是 | 从 `auth.aid_login1` 获取的一次性 nonce |
344
+ | `request_id` | string | 是 | 与 `auth.aid_login1` 中相同 |
345
+
346
+ **请求**:
347
+
348
+ ```json
349
+ {
350
+ "jsonrpc": "2.0",
351
+ "id": 6,
352
+ "method": "auth.renew_cert",
353
+ "params": {
354
+ "aid": "alice.aid.pub",
355
+ "old_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
356
+ "signature": "BASE64_SIGNATURE",
357
+ "nonce": "uuid-nonce",
358
+ "request_id": "request-uuid-xxxxx"
359
+ }
360
+ }
361
+ ```
362
+
363
+ **响应**:
364
+
365
+ ```json
366
+ {
367
+ "jsonrpc": "2.0",
368
+ "id": 6,
369
+ "result": {
370
+ "status": "renewed",
371
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
372
+ "ca_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
373
+ }
374
+ }
375
+ ```
376
+
377
+ **安全约束**:
378
+ - 宽限期 ≤ 90 天,超过宽限期的证书无法续期,必须重新 `auth.create_aid`
379
+ - 旧证书必须未被吊销
380
+ - 新证书复用原公钥,无需重新生成密钥对
381
+ - nonce 消费后立即失效
382
+
383
+ ### auth.rekey
384
+
385
+ 密钥轮转,更换公私钥对并获取新证书。适用于私钥可能泄露、设备迁移或定期安全轮转。
386
+
387
+ **前置条件**:先调用 `auth.aid_login1` 获取 nonce。
388
+
389
+ **请求参数**:
390
+
391
+ | 参数 | 类型 | 必需 | 说明 |
392
+ |------|------|:----:|------|
393
+ | `aid` | string | 是 | Agent Identifier |
394
+ | `new_public_key` | string | 是 | 新公钥,SPKI Base64 格式 |
395
+ | `old_cert` | string | 是 | 当前证书(有效或宽限期内过期均可) |
396
+ | `signature` | string | 是 | 用旧私钥对 `nonce + new_public_key` 的 ECDSA 签名 |
397
+ | `nonce` | string | 是 | 从 `auth.aid_login1` 获取的一次性 nonce |
398
+ | `request_id` | string | 是 | 与 `auth.aid_login1` 中相同 |
399
+
400
+ **请求**:
401
+
402
+ ```json
403
+ {
404
+ "jsonrpc": "2.0",
405
+ "id": 7,
406
+ "method": "auth.rekey",
407
+ "params": {
408
+ "aid": "alice.aid.pub",
409
+ "new_public_key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...",
410
+ "old_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
411
+ "signature": "BASE64_SIGNATURE",
412
+ "nonce": "uuid-nonce",
413
+ "request_id": "request-uuid-xxxxx"
414
+ }
415
+ }
416
+ ```
417
+
418
+ **响应**:
419
+
420
+ ```json
421
+ {
422
+ "jsonrpc": "2.0",
423
+ "id": 7,
424
+ "result": {
425
+ "status": "rekeyed",
426
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
427
+ "ca_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
428
+ }
429
+ }
430
+ ```
431
+
432
+ **安全约束**:
433
+ - 签名内容包含新公钥(`nonce + new_public_key`),防止中间人替换公钥
434
+ - rekey 成功后旧证书**立即吊销**(加入 CRL)
435
+ - 旧证书如已过期,同样受宽限期限制(≤ 90 天)
436
+ - 客户端完成后应销毁旧私钥
437
+
438
+ ### auth.request_cert
439
+
440
+ 为已有 AID 申请不同曲线的额外证书。必须在已认证连接上调用。
441
+
442
+ **请求参数**:
443
+
444
+ | 参数 | 类型 | 必需 | 说明 |
445
+ |------|------|:----:|------|
446
+ | `aid` | string | 是 | Agent Identifier,必须与当前认证身份一致 |
447
+ | `public_key` | string | 是 | 目标曲线的 Base64 SPKI 格式公钥 |
448
+ | `curve` | string | 是 | 目标椭圆曲线,可选 `P-256`、`P-384` |
449
+
450
+ **请求**:
451
+
452
+ ```json
453
+ {
454
+ "jsonrpc": "2.0",
455
+ "id": 8,
456
+ "method": "auth.request_cert",
457
+ "params": {
458
+ "aid": "alice.aid.pub",
459
+ "public_key": "MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE...",
460
+ "curve": "P-384"
461
+ }
462
+ }
463
+ ```
464
+
465
+ **响应**:
466
+
467
+ ```json
468
+ {
469
+ "jsonrpc": "2.0",
470
+ "id": 8,
471
+ "result": {
472
+ "status": "issued",
473
+ "aid": "alice.aid.pub",
474
+ "cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
475
+ "ca_cert": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
476
+ "curve": "P-384"
477
+ }
478
+ }
479
+ ```
480
+
481
+ **说明**:
482
+ - 同一 AID 可持有多个曲线的证书,各证书独立管理(独立密钥对、独立有效期、独立续期)
483
+ - Auth 服务验证当前连接身份与请求的 `aid` 一致
484
+ - E2EE 协商时,客户端根据对方曲线选择匹配的证书
485
+ - 登录认证时可使用任一有效证书
486
+
487
+ ## 1.7 JWT Token 机制
488
+
489
+ ### 签发流程
490
+
491
+ ```
492
+ 1. 客户端完成两阶段认证(aid_login1 + aid_login2)
493
+ 2. Auth 服务验证签名和证书链
494
+ 3. 生成 JWT:
495
+ - Header: { "alg": "ES256", "typ": "JWT", "kid": "cert-serial-number" }
496
+ - Payload: {
497
+ "aid": "alice.aid.pub",
498
+ "iss": "auth.aid.pub",
499
+ "sub": "alice.aid.pub",
500
+ "aud": "aun",
501
+ "iat": 1735689600,
502
+ "exp": 1735693200
503
+ }
504
+ - Signature: ECDSA(Header + Payload, Auth_PrivateKey)
505
+ 4. 返回 token
506
+ ```
507
+
508
+ - Auth 服务密钥为 P-256 时使用 ES256,P-384 时使用 ES384
509
+ - `kid` 标识签发证书的序列号,支持证书轮换期间的双证书验证
510
+
511
+ ### 验证流程
512
+
513
+ 任何 AUN 服务均可独立验证 JWT(持有 Auth 服务公钥即可):
514
+
515
+ 1. 从 `auth.connect.params.auth.token` 获取 token
516
+ 2. Base64 解码 Header 和 Payload
517
+ 3. 用 Auth 服务公钥验证 ECDSA 签名
518
+ 4. 检查 `exp`(过期时间)、`iss`(签发者)、`aud`(固定 `"aun"`)、`aid`(格式正确)
519
+
520
+ ### 安全约束
521
+
522
+ - JWT 有效期不超过签发证书的有效期
523
+ - 证书轮换时,新旧双证书过渡期内两张证书签发的 token 均有效
524
+ - `kid` 字段标识签发证书,验证方按 `kid` 选择对应公钥
525
+ - Gateway 无法伪造 token(不持有 Auth 服务私钥)
526
+ - JWT 仅提供身份认证,不包含授权信息;资源访问控制由各服务自行实现
527
+
528
+ > 详细实现指南见 [附录M-JWT认证实现指南](附录M-JWT认证实现指南.md)。
529
+
530
+ ## 1.8 错误码
531
+
532
+ | 错误码 | 说明 |
533
+ |--------|------|
534
+ | `-32001` | Authentication failed — 认证失败 |
535
+ | `-32002` | Certificate invalid — 证书无效(过期、吊销、格式错误) |
536
+ | `-32003` | Signature verification failed — 签名验证失败 |
537
+ | `-32005` | Authentication expired — Token 过期或刷新链耗尽 |
538
+
539
+ > 通用 JSON-RPC 2.0 错误码(-32700/-32600/-32601/-32602/-32603)同样适用,见 [07-JSON-RPC](07-JSON-RPC.md)。
540
+
541
+ ## 1.9 安全说明
542
+
543
+ - **私钥永不传输**:所有签名操作在客户端本地完成
544
+ - **双向 nonce challenge**:Phase 1 同时实现客户端验证 Auth 服务和 Auth 服务验证客户端,防止中间人和重放攻击
545
+ - **证书链验证到 Root CA**:每次认证都验证完整证书链(Agent → Issuer CA → Registry CA → Root CA)
546
+ - **JWT 非对称签名**:使用 ECDSA 签名,单一信任根(Auth 服务),所有验证方只需持有公钥
547
+ - **开放注册策略由运营方决定**:协议不强制限制注册,运营方可根据业务需求实施审批、限流等策略
548
+
549
+ > 完整威胁模型与防护措施见 [09-安全考虑](09-安全考虑.md)。证书层级与信任模型详见 [02-证书与信任体系](02-证书与信任体系.md)。连接模式与认证流程总览见 [03-Gateway-连接模式](03-Gateway-连接模式.md)。