@agentunion/fastaun-browser 0.2.19 → 0.3.0
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.
- package/CHANGELOG.md +50 -0
- package/_packed_docs/CHANGELOG.md +50 -0
- package/_packed_docs/agent.md/SCHEMA.md +173 -0
- package/_packed_docs/agent.md/examples/codeagent-claudecode.md +61 -0
- package/_packed_docs/agent.md/examples/human-developer.md +60 -0
- package/_packed_docs/agent.md/examples/openclaw-lobster.md +52 -0
- package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +43 -0
- package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +205 -0
- 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
- 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
- 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
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +262 -0
- package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +180 -0
- package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +164 -0
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1135 -0
- 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
- package/_packed_docs/protocol/08-AUN-E2EE-Group.md +900 -0
- package/_packed_docs/protocol/08-AUN-E2EE.md +413 -0
- package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +316 -0
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +804 -0
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +271 -0
- package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +329 -0
- package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +141 -0
- 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
- package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -0
- package/_packed_docs/protocol/README.md +71 -0
- package/_packed_docs/protocol/agent.md/SCHEMA.md +118 -0
- package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +61 -0
- package/_packed_docs/protocol/agent.md/examples/human-developer.md +60 -0
- package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +52 -0
- package/_packed_docs/protocol/aun-docs-guide.md +49 -0
- package/_packed_docs/protocol/index.md +124 -0
- 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
- 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
- package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +337 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
- package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +223 -0
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +354 -0
- package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +172 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +396 -0
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +611 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1203 -0
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +150 -0
- package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +89 -0
- package/_packed_docs/sdk/09-custody-api-manual.md +445 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +1895 -0
- package/_packed_docs/sdk/09-message-rpc-manual.md +597 -0
- package/_packed_docs/sdk/09-meta-rpc-manual.md +142 -0
- package/_packed_docs/sdk/09-payload-reference.md +702 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +408 -0
- package/_packed_docs/sdk/09-stream-rpc-manual.md +275 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +72 -0
- package/_packed_docs/sdk/INDEX.md +131 -0
- package/_packed_docs/sdk/README.md +307 -0
- package/dist/auth.d.ts +2 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +33 -14
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +14300 -0
- package/dist/client.d.ts +200 -178
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3096 -4019
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +0 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -4
- package/dist/config.js.map +1 -1
- package/dist/crypto.d.ts +8 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +114 -1
- package/dist/crypto.js.map +1 -1
- package/dist/e2ee.d.ts +5 -210
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +4 -1379
- package/dist/e2ee.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/namespaces/auth.d.ts +1 -0
- package/dist/namespaces/auth.d.ts.map +1 -1
- package/dist/namespaces/auth.js +23 -8
- package/dist/namespaces/auth.js.map +1 -1
- package/dist/protected-headers.d.ts +14 -0
- package/dist/protected-headers.d.ts.map +1 -0
- package/dist/protected-headers.js +47 -0
- package/dist/protected-headers.js.map +1 -0
- package/dist/seq-tracker.d.ts +7 -2
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +31 -10
- package/dist/seq-tracker.js.map +1 -1
- package/dist/transport.d.ts +9 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +24 -0
- package/dist/transport.js.map +1 -1
- package/dist/v2/crypto/aead.d.ts +26 -0
- package/dist/v2/crypto/aead.d.ts.map +1 -0
- package/dist/v2/crypto/aead.js +63 -0
- package/dist/v2/crypto/aead.js.map +1 -0
- package/dist/v2/crypto/canonical.d.ts +21 -0
- package/dist/v2/crypto/canonical.d.ts.map +1 -0
- package/dist/v2/crypto/canonical.js +111 -0
- package/dist/v2/crypto/canonical.js.map +1 -0
- package/dist/v2/crypto/dh-path.d.ts +21 -0
- package/dist/v2/crypto/dh-path.d.ts.map +1 -0
- package/dist/v2/crypto/dh-path.js +50 -0
- package/dist/v2/crypto/dh-path.js.map +1 -0
- package/dist/v2/crypto/ecdh.d.ts +19 -0
- package/dist/v2/crypto/ecdh.d.ts.map +1 -0
- package/dist/v2/crypto/ecdh.js +101 -0
- package/dist/v2/crypto/ecdh.js.map +1 -0
- package/dist/v2/crypto/ecdsa.d.ts +16 -0
- package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
- package/dist/v2/crypto/ecdsa.js +52 -0
- package/dist/v2/crypto/ecdsa.js.map +1 -0
- package/dist/v2/crypto/hkdf.d.ts +21 -0
- package/dist/v2/crypto/hkdf.d.ts.map +1 -0
- package/dist/v2/crypto/hkdf.js +32 -0
- package/dist/v2/crypto/hkdf.js.map +1 -0
- package/dist/v2/crypto/index.d.ts +9 -0
- package/dist/v2/crypto/index.d.ts.map +1 -0
- package/dist/v2/crypto/index.js +8 -0
- package/dist/v2/crypto/index.js.map +1 -0
- package/dist/v2/crypto/recipients.d.ts +43 -0
- package/dist/v2/crypto/recipients.d.ts.map +1 -0
- package/dist/v2/crypto/recipients.js +188 -0
- package/dist/v2/crypto/recipients.js.map +1 -0
- package/dist/v2/e2ee/decrypt.d.ts +13 -0
- package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
- package/dist/v2/e2ee/decrypt.js +176 -0
- package/dist/v2/e2ee/decrypt.js.map +1 -0
- package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
- package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
- package/dist/v2/e2ee/encrypt-group.js +196 -0
- package/dist/v2/e2ee/encrypt-group.js.map +1 -0
- package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
- package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
- package/dist/v2/e2ee/encrypt-p2p.js +240 -0
- package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
- package/dist/v2/e2ee/index.d.ts +9 -0
- package/dist/v2/e2ee/index.d.ts.map +1 -0
- package/dist/v2/e2ee/index.js +9 -0
- package/dist/v2/e2ee/index.js.map +1 -0
- package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
- package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
- package/dist/v2/e2ee/metadata-auth.js +60 -0
- package/dist/v2/e2ee/metadata-auth.js.map +1 -0
- package/dist/v2/e2ee/types.d.ts +57 -0
- package/dist/v2/e2ee/types.d.ts.map +1 -0
- package/dist/v2/e2ee/types.js +7 -0
- package/dist/v2/e2ee/types.js.map +1 -0
- package/dist/v2/session/index.d.ts +4 -0
- package/dist/v2/session/index.d.ts.map +1 -0
- package/dist/v2/session/index.js +3 -0
- package/dist/v2/session/index.js.map +1 -0
- package/dist/v2/session/keystore.d.ts +48 -0
- package/dist/v2/session/keystore.d.ts.map +1 -0
- package/dist/v2/session/keystore.js +184 -0
- package/dist/v2/session/keystore.js.map +1 -0
- package/dist/v2/session/session.d.ts +98 -0
- package/dist/v2/session/session.d.ts.map +1 -0
- package/dist/v2/session/session.js +270 -0
- package/dist/v2/session/session.js.map +1 -0
- package/dist/v2/state/commitment.d.ts +10 -0
- package/dist/v2/state/commitment.d.ts.map +1 -0
- package/dist/v2/state/commitment.js +86 -0
- package/dist/v2/state/commitment.js.map +1 -0
- package/dist/v2/state/index.d.ts +2 -0
- package/dist/v2/state/index.d.ts.map +1 -0
- package/dist/v2/state/index.js +2 -0
- package/dist/v2/state/index.js.map +1 -0
- package/package.json +43 -37
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
# Issuer CA 证书申请流程
|
|
2
|
+
|
|
3
|
+
## F.1 概述
|
|
4
|
+
|
|
5
|
+
### F.1.1 四级证书体系
|
|
6
|
+
|
|
7
|
+
AUN 采用四级证书体系,通过 `pathlen` 约束严格限定每级 CA 的签发范围:
|
|
8
|
+
|
|
9
|
+
| 层级 | 证书 | pathlen | 可签发对象 | 部署方式 |
|
|
10
|
+
|:----:|------|:-------:|-----------|---------|
|
|
11
|
+
| Level 0 | Root CA | 2 | Registry CA | 离线 HSM,30+ 年 |
|
|
12
|
+
| Level 1 | Registry CA | 1 | Issuer CA | 在线服务,5-10 年 |
|
|
13
|
+
| Level 2 | Issuer CA | 0 | Agent 终端证书 | 在线(Auth 服务),10 年 |
|
|
14
|
+
| Level 3 | Agent 证书 | — | 不可签发 | 终端实体,1-3 年 |
|
|
15
|
+
|
|
16
|
+
### F.1.2 Registry CA 的角色
|
|
17
|
+
|
|
18
|
+
**Registry CA** 是 Root CA 签发的在线中间 CA,专门负责 Issuer CA 证书的自动化签发:
|
|
19
|
+
|
|
20
|
+
- **在线服务**:Registry CA 私钥部署在在线 HSM 中,可自动签发证书
|
|
21
|
+
- **职责单一**:只签发 Issuer CA 证书(pathlen:1 强制约束),不签发 Agent 证书
|
|
22
|
+
- **自动化验证**:域名所有权验证和泛域名解析验证全程自动化
|
|
23
|
+
- **Root CA 隔离**:Root CA 私钥始终离线,只在签发 Registry CA 时使用
|
|
24
|
+
|
|
25
|
+
### F.1.3 多根证书体系下的 Registry CA
|
|
26
|
+
|
|
27
|
+
每个 Root CA 运营商独立签发自己的 Registry CA:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
Root CA A (离线) → Registry CA A (在线) → Issuer CA → Agent
|
|
31
|
+
Root CA B (离线) → Registry CA B (在线) → Issuer CA → Agent
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
- Issuer 申请者向**任意一个** Registry CA 提交申请即可
|
|
35
|
+
- 不需要多个 Root CA 的签名,一个 Registry CA 签发即可
|
|
36
|
+
- 客户端验证时,只要证书链能追溯到**任意一个受信 Root CA**,即为有效
|
|
37
|
+
|
|
38
|
+
### F.1.4 Issuer CA 申请条件
|
|
39
|
+
|
|
40
|
+
申请 Issuer CA 证书的组织必须满足:
|
|
41
|
+
|
|
42
|
+
1. **域名所有权**:必须是 Issuer 域名的合法持有者
|
|
43
|
+
2. **HTTPS 服务**:域名必须部署 HTTPS 服务,能在 `/.well-known/` 下放置验证文件
|
|
44
|
+
3. **泛域名解析**:必须配置泛域名解析 `*.{issuer}` 指向其服务
|
|
45
|
+
|
|
46
|
+
## F.2 系统架构
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
50
|
+
│ Issuer CA 签发系统架构 │
|
|
51
|
+
├─────────────────────────────────────────────────────────────┤
|
|
52
|
+
│ │
|
|
53
|
+
│ 申请者 │
|
|
54
|
+
│ │ │
|
|
55
|
+
│ │ HTTPS API │
|
|
56
|
+
│ ↓ │
|
|
57
|
+
│ Registry CA 服务 (在线) │
|
|
58
|
+
│ ├─ 接收申请,验证 CSR 格式 │
|
|
59
|
+
│ ├─ 生成签名验证文件,返回给申请者 │
|
|
60
|
+
│ ├─ 验证 .well-known 文件可访问且内容正确 │
|
|
61
|
+
│ ├─ 验证泛域名解析 │
|
|
62
|
+
│ ├─ 全部通过 → HSM 在线签名,签发 Issuer CA 证书 │
|
|
63
|
+
│ ├─ 提交 CT 日志 │
|
|
64
|
+
│ └─ 返回证书给申请者 │
|
|
65
|
+
│ │
|
|
66
|
+
└─────────────────────────────────────────────────────────────┘
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## F.3 Issuer CA 证书申请流程
|
|
70
|
+
|
|
71
|
+
### F.3.1 整体流程
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
申请者 Registry CA 服务 (在线)
|
|
75
|
+
│ │
|
|
76
|
+
│ 1. 生成密钥对 │
|
|
77
|
+
│ 2. 创建 CSR │
|
|
78
|
+
│ 3. 提交申请 ──────────────────────────>│
|
|
79
|
+
│ │ 4. 验证 CSR 格式
|
|
80
|
+
│ │ 5. 生成签名验证文件
|
|
81
|
+
│<──── 返回 verification_file ───────────│
|
|
82
|
+
│ │
|
|
83
|
+
│ 6. 放置验证文件到 │
|
|
84
|
+
│ https://{issuer}/.well-known/ │
|
|
85
|
+
│ aun-issuer-verification.json │
|
|
86
|
+
│ │
|
|
87
|
+
│ 7. 通知验证就绪 ─────────────────────>│
|
|
88
|
+
│ │ 8. HTTPS 获取验证文件 ✓
|
|
89
|
+
│ │ 9. 验证文件签名和内容 ✓
|
|
90
|
+
│ │ 10. 泛域名解析验证 ✓
|
|
91
|
+
│ │ 11. HSM 在线签名
|
|
92
|
+
│ │ 12. 提交 CT 日志
|
|
93
|
+
│<──────── 返回证书 + 证书链 ────────────│
|
|
94
|
+
│ │
|
|
95
|
+
│ 13. 部署证书 │
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**全程自动化,无需人工审核,分钟级完成。**
|
|
99
|
+
|
|
100
|
+
### F.3.2 详细步骤
|
|
101
|
+
|
|
102
|
+
#### 步骤 1-2:申请者生成密钥对和 CSR
|
|
103
|
+
|
|
104
|
+
申请者在本地安全环境中生成 Issuer CA 密钥对(推荐 P-384):
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# 生成 P-384 私钥
|
|
108
|
+
openssl ecparam -name secp384r1 -genkey -noout -out issuer-ca.key
|
|
109
|
+
|
|
110
|
+
# 创建 CSR(证书签名请求)
|
|
111
|
+
openssl req -new -key issuer-ca.key -out issuer-ca.csr \
|
|
112
|
+
-subj "/CN=aid.pub/O=YourOrganization/C=US" \
|
|
113
|
+
-addext "basicConstraints=critical,CA:TRUE,pathlen:0" \
|
|
114
|
+
-addext "keyUsage=critical,keyCertSign,cRLSign"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**CSR 必须包含**:
|
|
118
|
+
- `CN`(Common Name):Issuer 域名(如 `aid.pub`)
|
|
119
|
+
- `basicConstraints`:`CA:TRUE, pathlen:0`(只能签发终端证书,不能签发下级 CA)
|
|
120
|
+
- `keyUsage`:`keyCertSign, cRLSign`
|
|
121
|
+
|
|
122
|
+
#### 步骤 3-5:提交申请,获取验证文件
|
|
123
|
+
|
|
124
|
+
申请者通过 Registry CA 的 HTTPS API 提交申请:
|
|
125
|
+
|
|
126
|
+
**请求**:
|
|
127
|
+
```http
|
|
128
|
+
POST https://registry.aun.network/api/v1/issuer-ca/apply
|
|
129
|
+
Content-Type: application/json
|
|
130
|
+
|
|
131
|
+
{
|
|
132
|
+
"issuer": "aid.pub",
|
|
133
|
+
"csr": "-----BEGIN CERTIFICATE REQUEST-----\n...\n-----END CERTIFICATE REQUEST-----",
|
|
134
|
+
"contact_email": "admin@aid.pub",
|
|
135
|
+
"organization": "YourOrganization"
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**响应**:
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
143
|
+
"status": "pending_verification",
|
|
144
|
+
"verification_file": {
|
|
145
|
+
"content": {
|
|
146
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
147
|
+
"issuer": "aid.pub",
|
|
148
|
+
"challenge": "e5f6g7h8i9j0k1l2m3n4o5p6",
|
|
149
|
+
"issued_at": "2026-03-16T10:00:00Z",
|
|
150
|
+
"expires_at": "2026-03-17T10:00:00Z",
|
|
151
|
+
"registry_ca": "AUN Registry CA A"
|
|
152
|
+
},
|
|
153
|
+
"signature": "MEUCIQDx..."
|
|
154
|
+
},
|
|
155
|
+
"placement_url": "https://aid.pub/.well-known/aun-issuer-verification.json",
|
|
156
|
+
"created_at": "2026-03-16T10:00:00Z",
|
|
157
|
+
"expires_at": "2026-03-17T10:00:00Z"
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
Registry CA 对 CSR 执行以下验证:
|
|
161
|
+
- CSR 格式合法(X.509 标准)
|
|
162
|
+
- CN 是合法域名
|
|
163
|
+
- `basicConstraints` 包含 `CA:TRUE, pathlen:0`
|
|
164
|
+
- `keyUsage` 包含 `keyCertSign, cRLSign`
|
|
165
|
+
- 密钥算法为 ECDSA P-384(推荐)或 P-256
|
|
166
|
+
|
|
167
|
+
验证通过后,Registry CA 生成一个**签名验证文件**(JSON 格式,包含 Registry CA 的签名),返回给申请者。
|
|
168
|
+
|
|
169
|
+
#### 步骤 6:放置验证文件
|
|
170
|
+
|
|
171
|
+
申请者将收到的验证文件原样放置到域名的 `.well-known` 路径下:
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
https://aid.pub/.well-known/aun-issuer-verification.json
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
文件内容即为 Registry CA 返回的 `verification_file` 字段(包含 `content` 和 `signature`)。
|
|
178
|
+
|
|
179
|
+
**要求**:
|
|
180
|
+
- 必须通过 HTTPS 访问(有效的 TLS 证书)
|
|
181
|
+
- 返回 `Content-Type: application/json`
|
|
182
|
+
- 文件内容必须与 Registry CA 返回的完全一致(不可修改)
|
|
183
|
+
|
|
184
|
+
#### 步骤 7:通知验证就绪
|
|
185
|
+
|
|
186
|
+
申请者放置好文件后,通知 Registry CA 开始验证:
|
|
187
|
+
|
|
188
|
+
**请求**:
|
|
189
|
+
```http
|
|
190
|
+
POST https://registry.aun.network/api/v1/issuer-ca/verify
|
|
191
|
+
Content-Type: application/json
|
|
192
|
+
|
|
193
|
+
{
|
|
194
|
+
"application_id": "app-2026-03-16-a1b2c3d4"
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
#### 步骤 8-10:自动验证
|
|
199
|
+
|
|
200
|
+
Registry CA 自动执行三项验证:
|
|
201
|
+
|
|
202
|
+
**8. HTTPS 文件验证**
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
Registry CA 发起 HTTPS 请求:
|
|
206
|
+
GET https://aid.pub/.well-known/aun-issuer-verification.json
|
|
207
|
+
|
|
208
|
+
验证:
|
|
209
|
+
✓ HTTPS 可访问(TLS 证书有效)
|
|
210
|
+
✓ 返回内容与签发的验证文件一致
|
|
211
|
+
✓ 签名验证通过(防篡改)
|
|
212
|
+
✓ 文件未过期(expires_at 未到)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**9. 验证文件签名验证**
|
|
216
|
+
|
|
217
|
+
Registry CA 验证返回的文件中 `signature` 是否为自己签发的有效签名,确保文件未被篡改。
|
|
218
|
+
|
|
219
|
+
**10. 泛域名解析验证**
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# Registry CA 测试多个随机子域名
|
|
223
|
+
dig test-{random1}.aid.pub
|
|
224
|
+
dig test-{random2}.aid.pub
|
|
225
|
+
dig test-{random3}.aid.pub
|
|
226
|
+
|
|
227
|
+
# 验证规则:
|
|
228
|
+
# ✓ 至少 3 个随机子域名全部能解析
|
|
229
|
+
# ✓ 所有子域名解析到相同的 IP 段(允许负载均衡)
|
|
230
|
+
# ✓ 可选:验证 HTTPS 服务返回有效响应
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
#### 步骤 11:HSM 在线签名
|
|
234
|
+
|
|
235
|
+
三项验证全部通过后,Registry CA 使用在线 HSM 自动签发 Issuer CA 证书:
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
证书配置:
|
|
239
|
+
- Issuer: Registry CA (CN=AUN Registry CA A)
|
|
240
|
+
- Subject: CN=aid.pub
|
|
241
|
+
- Serial Number: 唯一序列号
|
|
242
|
+
- Validity: 10 年
|
|
243
|
+
- Extensions:
|
|
244
|
+
- basicConstraints: critical, CA:TRUE, pathlen:0
|
|
245
|
+
- keyUsage: critical, keyCertSign, cRLSign
|
|
246
|
+
- subjectKeyIdentifier: <hash of Issuer CA public key>
|
|
247
|
+
- authorityKeyIdentifier: <hash of Registry CA public key>
|
|
248
|
+
- AIA: http://aid.pub/ca/cert
|
|
249
|
+
- CRL Distribution Points: http://registry.aun.network/crl
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**签名操作审计日志**:
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"operation": "sign_issuer_ca",
|
|
256
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
257
|
+
"issuer": "aid.pub",
|
|
258
|
+
"registry_ca": "AUN Registry CA A",
|
|
259
|
+
"timestamp": "2026-03-16T10:05:00Z",
|
|
260
|
+
"hsm_serial": "HSM-67890",
|
|
261
|
+
"certificate_serial": "0x2a3b4c5d6e7f",
|
|
262
|
+
"verification_result": {
|
|
263
|
+
"https_file": "passed",
|
|
264
|
+
"file_signature": "passed",
|
|
265
|
+
"wildcard_dns": "passed"
|
|
266
|
+
},
|
|
267
|
+
"validity": {
|
|
268
|
+
"not_before": "2026-03-16T10:05:00Z",
|
|
269
|
+
"not_after": "2036-03-16T10:05:00Z"
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
#### 步骤 12:提交 CT 日志
|
|
274
|
+
|
|
275
|
+
证书签发后,Registry CA 将 Issuer CA 证书信息写入透明日志(CT):
|
|
276
|
+
|
|
277
|
+
- 提交日志条目到 CT 日志服务(包含 Issuer CA 证书、签发 Registry CA、验证结果摘要)
|
|
278
|
+
- 获取签名日志证明(SCT)
|
|
279
|
+
- SCT 作为独立证明随证书一同返回给申请者
|
|
280
|
+
- Issuer 获得 Issuer CA 证书后,必须通过 `https://ct.{issuer}` 提供公开 CT 查询入口
|
|
281
|
+
|
|
282
|
+
#### 步骤 13:返回证书
|
|
283
|
+
|
|
284
|
+
验证和签名全部完成后,Registry CA 返回证书:
|
|
285
|
+
|
|
286
|
+
**响应**:
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
290
|
+
"status": "approved",
|
|
291
|
+
"issuer": "aid.pub",
|
|
292
|
+
"certificate": "-----BEGIN CERTIFICATE-----\n...(Issuer CA)...\n-----END CERTIFICATE-----",
|
|
293
|
+
"certificate_chain": [
|
|
294
|
+
"-----BEGIN CERTIFICATE-----\n...(Issuer CA)...\n-----END CERTIFICATE-----",
|
|
295
|
+
"-----BEGIN CERTIFICATE-----\n...(Registry CA)...\n-----END CERTIFICATE-----",
|
|
296
|
+
"-----BEGIN CERTIFICATE-----\n...(Root CA)...\n-----END CERTIFICATE-----"
|
|
297
|
+
],
|
|
298
|
+
"serial_number": "0x2a3b4c5d6e7f",
|
|
299
|
+
"not_before": "2026-03-16T10:05:00Z",
|
|
300
|
+
"not_after": "2036-03-16T10:05:00Z",
|
|
301
|
+
"sct": {
|
|
302
|
+
"log_id": "sha256:<日志服务公钥哈希>",
|
|
303
|
+
"timestamp": 1710576300000,
|
|
304
|
+
"signature": "MEUCIQDx..."
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
#### 步骤 14:申请者部署证书
|
|
310
|
+
|
|
311
|
+
申请者收到证书后:
|
|
312
|
+
1. 验证证书链的完整性(Issuer CA ← Registry CA ← Root CA)
|
|
313
|
+
2. 将 Issuer CA 私钥安全存储(推荐 HSM)
|
|
314
|
+
3. 部署 Auth 服务,配置 Issuer CA 证书和私钥
|
|
315
|
+
4. 配置 `https://{issuer}/ca/cert` 返回完整证书链
|
|
316
|
+
5. 确保 `https://ct.{issuer}` 的 CT 公开只读查询端点可访问
|
|
317
|
+
6. 可选:删除 `.well-known/aun-issuer-verification.json` 验证文件
|
|
318
|
+
7. 测试证书签发和 CT 查询功能
|
|
319
|
+
|
|
320
|
+
## F.4 Registry CA API 规范
|
|
321
|
+
|
|
322
|
+
### F.4.1 提交申请
|
|
323
|
+
|
|
324
|
+
```http
|
|
325
|
+
POST /api/v1/issuer-ca/apply
|
|
326
|
+
Content-Type: application/json
|
|
327
|
+
|
|
328
|
+
{
|
|
329
|
+
"issuer": "aid.pub",
|
|
330
|
+
"csr": "-----BEGIN CERTIFICATE REQUEST-----\n...\n-----END CERTIFICATE REQUEST-----",
|
|
331
|
+
"contact_email": "admin@aid.pub",
|
|
332
|
+
"organization": "YourOrganization"
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
Response 201:
|
|
336
|
+
{
|
|
337
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
338
|
+
"status": "pending_verification",
|
|
339
|
+
"verification_file": {...},
|
|
340
|
+
"placement_url": "https://aid.pub/.well-known/aun-issuer-verification.json",
|
|
341
|
+
"created_at": "2026-03-16T10:00:00Z",
|
|
342
|
+
"expires_at": "2026-03-17T10:00:00Z"
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### F.4.2 通知验证就绪
|
|
347
|
+
|
|
348
|
+
```http
|
|
349
|
+
POST /api/v1/issuer-ca/verify
|
|
350
|
+
Content-Type: application/json
|
|
351
|
+
|
|
352
|
+
{
|
|
353
|
+
"application_id": "app-2026-03-16-a1b2c3d4"
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
Response 200 (验证通过,直接返回证书):
|
|
357
|
+
{
|
|
358
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
359
|
+
"status": "approved",
|
|
360
|
+
"certificate": "...",
|
|
361
|
+
"certificate_chain": [...],
|
|
362
|
+
"serial_number": "...",
|
|
363
|
+
"sct": {...}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
Response 200 (验证失败):
|
|
367
|
+
{
|
|
368
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
369
|
+
"status": "verification_failed",
|
|
370
|
+
"errors": [
|
|
371
|
+
{"check": "https_file", "message": "无法访问 https://aid.pub/.well-known/aun-issuer-verification.json"},
|
|
372
|
+
{"check": "wildcard_dns", "message": "test-abc123.aid.pub 无法解析"}
|
|
373
|
+
]
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### F.4.3 查询申请状态
|
|
378
|
+
|
|
379
|
+
```http
|
|
380
|
+
GET /api/v1/issuer-ca/status/{application_id}
|
|
381
|
+
|
|
382
|
+
Response 200:
|
|
383
|
+
{
|
|
384
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
385
|
+
"status": "approved",
|
|
386
|
+
"issuer": "aid.pub",
|
|
387
|
+
"created_at": "2026-03-16T10:00:00Z",
|
|
388
|
+
"issued_at": "2026-03-16T10:05:00Z"
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**状态值**:
|
|
393
|
+
- `pending_verification`: 等待申请者放置验证文件并触发验证
|
|
394
|
+
- `verification_failed`: 验证失败(可重试)
|
|
395
|
+
- `approved`: 已签发,证书可用
|
|
396
|
+
- `expired`: 申请已过期(24 小时内未完成验证)
|
|
397
|
+
|
|
398
|
+
### F.4.4 列出申请历史
|
|
399
|
+
|
|
400
|
+
```http
|
|
401
|
+
GET /api/v1/issuer-ca/applications?issuer=aid.pub
|
|
402
|
+
|
|
403
|
+
Response 200:
|
|
404
|
+
{
|
|
405
|
+
"applications": [
|
|
406
|
+
{
|
|
407
|
+
"application_id": "app-2026-03-16-a1b2c3d4",
|
|
408
|
+
"issuer": "aid.pub",
|
|
409
|
+
"status": "approved",
|
|
410
|
+
"created_at": "2026-03-16T10:00:00Z",
|
|
411
|
+
"issued_at": "2026-03-16T10:05:00Z"
|
|
412
|
+
}
|
|
413
|
+
]
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
## F.5 安全考虑
|
|
417
|
+
|
|
418
|
+
### F.5.1 Registry CA 安全
|
|
419
|
+
|
|
420
|
+
- **HSM 保护**:Registry CA 私钥存储在在线 HSM 中(FIPS 140-2 Level 3+)
|
|
421
|
+
- **签发范围限制**:pathlen:1 在密码学层面限制只能签发 Issuer CA(pathlen:0),无法签发 Agent 证书
|
|
422
|
+
- **速率限制**:限制同一域名的申请频率(如每 24 小时最多 5 次)
|
|
423
|
+
- **审计日志**:所有签发操作记录完整审计日志
|
|
424
|
+
- **监控告警**:异常签发行为(如短时间大量签发)触发告警
|
|
425
|
+
|
|
426
|
+
### F.5.2 验证安全
|
|
427
|
+
|
|
428
|
+
- **防重放攻击**:验证文件包含 `application_id` 和 `expires_at`,一次性使用,有效期 24 小时
|
|
429
|
+
- **防伪造**:验证文件包含 Registry CA 的签名,申请者无法伪造或篡改
|
|
430
|
+
- **防 DNS 劫持**:泛域名验证使用随机子域名,降低定向劫持风险
|
|
431
|
+
- **HTTPS 强制**:验证文件必须通过 HTTPS 访问,防止中间人攻击
|
|
432
|
+
|
|
433
|
+
### F.5.3 申请者安全责任
|
|
434
|
+
|
|
435
|
+
- **私钥保护**:Issuer CA 私钥必须安全存储,推荐使用 HSM
|
|
436
|
+
- **证书续期**:在证书过期前及时续期(建议提前 3 个月)
|
|
437
|
+
- **吊销机制**:私钥泄露时立即申请吊销证书
|
|
438
|
+
- **访问控制**:严格控制 Auth 服务的访问权限
|
|
439
|
+
|
|
440
|
+
## F.6 证书续期流程
|
|
441
|
+
|
|
442
|
+
Issuer CA 证书到期前(建议提前 3 个月),申请者需要续期:
|
|
443
|
+
|
|
444
|
+
```
|
|
445
|
+
续期流程:
|
|
446
|
+
1. 申请者生成新的密钥对和 CSR(推荐轮换密钥)
|
|
447
|
+
2. 提交续期申请到 Registry CA(附带旧证书序列号)
|
|
448
|
+
3. Registry CA 验证旧证书有效且未吊销
|
|
449
|
+
4. Registry CA 重新验证 .well-known 文件和泛域名解析
|
|
450
|
+
5. 验证通过 → Registry CA 自动签发新证书
|
|
451
|
+
6. 提交 CT 日志
|
|
452
|
+
7. 申请者部署新证书,进入双证书过渡期
|
|
453
|
+
8. 旧证书到期后退役
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**续期简化**:续期时 Registry CA 可跳过组织信息审查,只需重新验证域名控制权。
|
|
457
|
+
|
|
458
|
+
## F.7 证书吊销流程
|
|
459
|
+
|
|
460
|
+
如果 Issuer CA 私钥泄露或需要紧急吊销:
|
|
461
|
+
|
|
462
|
+
```
|
|
463
|
+
吊销流程:
|
|
464
|
+
1. 申请者或 Registry CA 运营方发起吊销请求
|
|
465
|
+
2. 验证申请者身份(通过旧证书签名或人工验证)
|
|
466
|
+
3. Registry CA 将证书加入 CRL(证书吊销列表)
|
|
467
|
+
4. 提交吊销记录到 CT 日志,获取 SCT
|
|
468
|
+
5. 通知相关 Gateway 更新证书状态
|
|
469
|
+
6. 该 Issuer CA 下的所有 Agent 证书立即失效
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
**紧急吊销**:Registry CA 运营方可在无需申请者确认的情况下紧急吊销(如发现恶意签发),事后通知申请者。
|
|
473
|
+
|
|
474
|
+
## F.8 Registry CA 的签发与管理
|
|
475
|
+
|
|
476
|
+
### F.8.1 Registry CA 证书签发
|
|
477
|
+
|
|
478
|
+
Registry CA 由 Root CA 离线签发,流程与 Root CA 准入类似:
|
|
479
|
+
|
|
480
|
+
```
|
|
481
|
+
Registry CA 签发流程:
|
|
482
|
+
1. Root CA 运营商在离线 HSM 环境中生成 Registry CA 密钥对
|
|
483
|
+
2. 创建 Registry CA 证书:
|
|
484
|
+
- Issuer: Root CA
|
|
485
|
+
- Subject: CN=AUN Registry CA {name}
|
|
486
|
+
- basicConstraints: CA:TRUE, pathlen:1
|
|
487
|
+
- keyUsage: keyCertSign, cRLSign
|
|
488
|
+
- Validity: 10 年
|
|
489
|
+
3. 多人授权(3/5 多签)
|
|
490
|
+
4. HSM 签名
|
|
491
|
+
5. 部署 Registry CA 在线服务
|
|
492
|
+
6. 提交 CT 日志
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### F.8.2 Registry CA 安全要求
|
|
496
|
+
|
|
497
|
+
| 项目 | 要求 |
|
|
498
|
+
|------|------|
|
|
499
|
+
| HSM | FIPS 140-2 Level 3+ |
|
|
500
|
+
| 可用性 | 99.9%(7x24 小时) |
|
|
501
|
+
| CRL 更新 | 每 1-6 小时 |
|
|
502
|
+
| OCSP 响应 | < 2 秒 |
|
|
503
|
+
| 审计日志 | 所有签发操作完整记录 |
|
|
504
|
+
| 监控 | 异常签发行为实时告警 |
|
|
505
|
+
|
|
506
|
+
## F.9 Issuer CT 服务要求
|
|
507
|
+
|
|
508
|
+
### F.9.1 服务边界
|
|
509
|
+
|
|
510
|
+
Issuer 获得 Issuer CA 证书后,必须提供 Issuer 维度的 CT 查询服务。CA 服务只负责写入 CT 和提供内部只读查询能力,不得直接暴露公网 HTTP。`ct.{issuer}` 是稳定公开访问面,只能提供公开只读查询路径,公开 URL 和响应格式必须保持兼容。
|
|
511
|
+
|
|
512
|
+
### F.9.2 Issuer 本地 CA 写入范围
|
|
513
|
+
|
|
514
|
+
Issuer CA 的下列写操作成功后,必须追加 CT 条目:
|
|
515
|
+
|
|
516
|
+
| 操作 | CT operation | 记录内容 |
|
|
517
|
+
|------|--------------|----------|
|
|
518
|
+
| 终端证书签发 | `agent_cert_issue` | AID、证书序列号、证书 SHA-256、公钥 SHA-256、曲线、签发时间 |
|
|
519
|
+
| 内置服务证书签发 | `agent_cert_issue` | 服务 AID、证书序列号、证书 SHA-256、公钥 SHA-256、曲线、签发时间 |
|
|
520
|
+
| 证书续期 | `agent_cert_renew` | AID、新旧证书序列号、新证书 SHA-256、曲线 |
|
|
521
|
+
| 证书换钥 | `agent_cert_rekey` | AID、新旧证书序列号、新公钥 SHA-256、新证书 SHA-256、曲线 |
|
|
522
|
+
| 证书吊销 | `agent_cert_revoke` | AID、证书序列号、吊销原因、吊销时间 |
|
|
523
|
+
|
|
524
|
+
CT 条目只包含公开字段,不得写入私钥、私钥摘要、手机号、客户端 IP 或内部操作者标识。内部审计日志可以另行记录,但不能通过 `ct.{issuer}` 暴露。
|
|
525
|
+
|
|
526
|
+
### F.9.3 公开查询端点
|
|
527
|
+
|
|
528
|
+
Issuer CT 服务必须提供以下公开 HTTP 端点,不要求鉴权:
|
|
529
|
+
|
|
530
|
+
| 方法 | URL | 说明 |
|
|
531
|
+
|------|-----|------|
|
|
532
|
+
| GET | `https://ct.{issuer}/sth` | 最新签名树头 |
|
|
533
|
+
| GET | `https://ct.{issuer}/entries?start=0&limit=100` | 分页查询公开 CT 条目 |
|
|
534
|
+
| GET | `https://ct.{issuer}/entries/{log_id}` | 查询单条 CT 条目 |
|
|
535
|
+
| GET | `https://ct.{issuer}/certs/{serial}` | 按证书序列号查询 CT 条目 |
|
|
536
|
+
| GET | `https://ct.{issuer}/proof/{tree_size}/{log_id}` | 查询 Merkle inclusion proof |
|
|
537
|
+
|
|
538
|
+
这些端点是公开 HTTP 能力,不属于 SDK RPC。SDK 不提供专用 CT namespace 或 `AUNClient.ct` 功能。
|
|
539
|
+
|
|
540
|
+
## F.10 与现有 PKI 标准的对比
|
|
541
|
+
|
|
542
|
+
| 标准 | AUN 对应 | 相似点 | 差异点 |
|
|
543
|
+
|------|---------|--------|--------|
|
|
544
|
+
| Let's Encrypt ACME | Registry CA 自动签发 | 自动化域名验证、在线签发 | AUN 签发的是 CA 证书而非终端证书 |
|
|
545
|
+
| CA/Browser Forum | Issuer CA 申请 | 域名所有权验证 | AUN 增加泛域名解析要求 |
|
|
546
|
+
| WebPKI Root → Intermediate → EE | Root → Registry → Issuer → Agent | 多级 CA 层级 | AUN 多一级(Registry CA) |
|
|
547
|
+
|
|
548
|
+
AUN 的 Registry CA 在线签发模式借鉴了 ACME 协议的自动化理念,在保证 Root CA 离线安全的前提下,将 Issuer CA 签发时间从数周缩短到分钟级。
|