@agentunion/fastaun 0.2.14 → 0.2.15
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/dist/client.d.ts +4 -0
- package/dist/client.js +137 -35
- package/dist/client.js.map +1 -1
- package/dist/e2ee-group.d.ts +23 -2
- package/dist/e2ee-group.js +194 -23
- package/dist/e2ee-group.js.map +1 -1
- package/dist/e2ee.d.ts +20 -1
- package/dist/e2ee.js +258 -35
- package/dist/e2ee.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/file.d.ts +10 -0
- package/dist/keystore/file.js +73 -0
- package/dist/keystore/file.js.map +1 -1
- package/dist/keystore/index.d.ts +12 -0
- package/dist/namespaces/auth.d.ts +19 -0
- package/dist/namespaces/auth.js +185 -0
- package/dist/namespaces/auth.js.map +1 -1
- package/dist/namespaces/meta.d.ts +75 -0
- package/dist/namespaces/meta.js +464 -0
- package/dist/namespaces/meta.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meta 命名空间 — 心跳、状态和信任根管理。
|
|
3
|
+
*
|
|
4
|
+
* 与 Python SDK MetaNamespace 完全对齐。
|
|
5
|
+
*/
|
|
6
|
+
import * as crypto from 'node:crypto';
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { URL } from 'node:url';
|
|
10
|
+
import { ValidationError } from '../errors.js';
|
|
11
|
+
const AUTHORITY_ENDPOINT = 'https://trust.aun.network/.well-known/aun/trust-roots.json';
|
|
12
|
+
const MAX_CLOCK_SKEW = 300; // 秒
|
|
13
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
14
|
+
export class MetaNamespace {
|
|
15
|
+
_client;
|
|
16
|
+
constructor(client) {
|
|
17
|
+
this._client = client;
|
|
18
|
+
}
|
|
19
|
+
get _internal() {
|
|
20
|
+
return this._client;
|
|
21
|
+
}
|
|
22
|
+
// ── RPC 直通 ──────────────────────────────────────────────────
|
|
23
|
+
async ping(params) {
|
|
24
|
+
return await this._client.call('meta.ping', params ?? {});
|
|
25
|
+
}
|
|
26
|
+
async status(params) {
|
|
27
|
+
return await this._client.call('meta.status', params ?? {});
|
|
28
|
+
}
|
|
29
|
+
async trustRoots(params) {
|
|
30
|
+
return await this._client.call('meta.trust_roots', params ?? {});
|
|
31
|
+
}
|
|
32
|
+
// ── 信任根下载 ────────────────────────────────────────────────
|
|
33
|
+
async downloadTrustRoots(opts) {
|
|
34
|
+
const target = this._resolveTrustRootsUrl(opts?.url, opts?.issuer, opts?.gateway_url);
|
|
35
|
+
if (!target.toLowerCase().startsWith('https://') && !target.toLowerCase().startsWith('http://')) {
|
|
36
|
+
throw new ValidationError('trust roots url must be http(s)');
|
|
37
|
+
}
|
|
38
|
+
const timeoutMs = (opts?.timeout ?? 10) * 1000;
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(target, {
|
|
43
|
+
headers: { Accept: 'application/json' },
|
|
44
|
+
signal: controller.signal,
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new ValidationError(`trust roots download failed: HTTP ${response.status}`);
|
|
48
|
+
}
|
|
49
|
+
const payload = await response.json();
|
|
50
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
51
|
+
throw new ValidationError('trust roots endpoint returned non-object JSON');
|
|
52
|
+
}
|
|
53
|
+
return payload;
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async downloadIssuerRootCert(issuer, opts) {
|
|
60
|
+
const normalizedIssuer = MetaNamespace._validateIssuer(issuer);
|
|
61
|
+
const target = opts?.url?.trim() || this._issuerRootCertUrl(normalizedIssuer);
|
|
62
|
+
if (!target.toLowerCase().startsWith('https://') && !target.toLowerCase().startsWith('http://')) {
|
|
63
|
+
throw new ValidationError('issuer root certificate url must be http(s)');
|
|
64
|
+
}
|
|
65
|
+
const timeoutMs = (opts?.timeout ?? 10) * 1000;
|
|
66
|
+
const controller = new AbortController();
|
|
67
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
68
|
+
try {
|
|
69
|
+
const response = await fetch(target, {
|
|
70
|
+
headers: { Accept: 'application/x-pem-file,text/plain' },
|
|
71
|
+
signal: controller.signal,
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new ValidationError(`issuer root cert download failed: HTTP ${response.status}`);
|
|
75
|
+
}
|
|
76
|
+
const certPem = (await response.text()).trim();
|
|
77
|
+
MetaNamespace._loadRootCertificate(certPem, normalizedIssuer);
|
|
78
|
+
return certPem + '\n';
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ── 信任根验证 ────────────────────────────────────────────────
|
|
85
|
+
verifyTrustRoots(trustList, opts) {
|
|
86
|
+
if (!trustList || typeof trustList !== 'object') {
|
|
87
|
+
throw new ValidationError('trust roots list must be a JSON object');
|
|
88
|
+
}
|
|
89
|
+
const signature = String(trustList.authority_signature ?? '').trim();
|
|
90
|
+
if (!signature && !opts?.allow_unsigned) {
|
|
91
|
+
throw new ValidationError('trust roots list missing authority_signature');
|
|
92
|
+
}
|
|
93
|
+
MetaNamespace._validateListMetadata(trustList);
|
|
94
|
+
if (signature) {
|
|
95
|
+
const publicKey = this._loadAuthorityPublicKey(opts?.authority_cert_pem, opts?.authority_public_key_pem, trustList);
|
|
96
|
+
const signedPayload = MetaNamespace._canonicalSignedPayload(trustList);
|
|
97
|
+
const sigBytes = MetaNamespace._decodeSignature(signature);
|
|
98
|
+
const ok = crypto.verify(null, signedPayload, publicKey, sigBytes);
|
|
99
|
+
if (!ok) {
|
|
100
|
+
throw new ValidationError('trust roots authority_signature verification failed');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const roots = MetaNamespace._extractRootEntries(trustList);
|
|
104
|
+
const imported = [];
|
|
105
|
+
const skipped = [];
|
|
106
|
+
const now = Date.now() / 1000;
|
|
107
|
+
for (const item of roots) {
|
|
108
|
+
const status = String(item.status ?? 'active').trim().toLowerCase();
|
|
109
|
+
const certPem = String(item.certificate ?? item.cert_pem ?? '').trim();
|
|
110
|
+
const rootId = String(item.id ?? item.agentid ?? '').trim();
|
|
111
|
+
if (status !== 'active') {
|
|
112
|
+
skipped.push({ id: rootId, reason: `status=${status}` });
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
MetaNamespace._loadRootCertificate(certPem, rootId || 'root');
|
|
116
|
+
const fingerprint = MetaNamespace._certFingerprint(certPem);
|
|
117
|
+
const expectedFp = MetaNamespace._normalizeFingerprint(item.fingerprint_sha256);
|
|
118
|
+
if (expectedFp.length !== 64) {
|
|
119
|
+
throw new ValidationError(`root certificate missing or invalid fingerprint_sha256: ${rootId || fingerprint}`);
|
|
120
|
+
}
|
|
121
|
+
if (expectedFp !== fingerprint) {
|
|
122
|
+
throw new ValidationError(`root certificate fingerprint mismatch: ${rootId || fingerprint}`);
|
|
123
|
+
}
|
|
124
|
+
imported.push({ id: rootId || fingerprint, cert_pem: certPem, fingerprint_sha256: fingerprint });
|
|
125
|
+
}
|
|
126
|
+
if (imported.length === 0) {
|
|
127
|
+
throw new ValidationError('trust roots list contains no active root certificates');
|
|
128
|
+
}
|
|
129
|
+
return { imported, skipped, count: imported.length };
|
|
130
|
+
}
|
|
131
|
+
// ── 信任根导入 ────────────────────────────────────────────────
|
|
132
|
+
importTrustRoots(trustList, opts) {
|
|
133
|
+
const verified = this.verifyTrustRoots(trustList, opts);
|
|
134
|
+
this._enforceMonotonicVersion(trustList);
|
|
135
|
+
const ks = this._internal._keystore;
|
|
136
|
+
const bundlePath = ks.saveTrustRoots
|
|
137
|
+
? ks.saveTrustRoots(trustList, verified.imported)
|
|
138
|
+
: this._defaultSaveTrustRoots(trustList, verified.imported);
|
|
139
|
+
const auth = this._internal._auth;
|
|
140
|
+
const reloaded = auth.reloadTrustedRoots?.() ?? auth.reload_trusted_roots?.() ?? 0;
|
|
141
|
+
return {
|
|
142
|
+
imported: verified.count,
|
|
143
|
+
skipped: verified.skipped,
|
|
144
|
+
bundle_path: String(bundlePath),
|
|
145
|
+
reloaded_roots: reloaded,
|
|
146
|
+
fingerprints: verified.imported.map((i) => i.fingerprint_sha256),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
async refreshTrustRoots(opts) {
|
|
150
|
+
const sourceUrl = this._resolveTrustRootsUrl(opts?.url, opts?.issuer, opts?.gateway_url);
|
|
151
|
+
const trustList = await this.downloadTrustRoots({ url: sourceUrl, timeout: opts?.timeout });
|
|
152
|
+
const result = this.importTrustRoots(trustList, {
|
|
153
|
+
authority_cert_pem: opts?.authority_cert_pem,
|
|
154
|
+
authority_public_key_pem: opts?.authority_public_key_pem,
|
|
155
|
+
allow_unsigned: opts?.allow_unsigned,
|
|
156
|
+
});
|
|
157
|
+
result.source_url = sourceUrl;
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
async updateIssuerRootCert(issuer, opts) {
|
|
161
|
+
const normalizedIssuer = MetaNamespace._validateIssuer(issuer);
|
|
162
|
+
const sourceUrl = opts?.url?.trim() || this._issuerRootCertUrl(normalizedIssuer);
|
|
163
|
+
let rootPem = opts?.cert_pem?.trim() ? opts.cert_pem.trim() + '\n' : '';
|
|
164
|
+
if (!rootPem) {
|
|
165
|
+
rootPem = await this.downloadIssuerRootCert(normalizedIssuer, { url: sourceUrl, timeout: opts?.timeout });
|
|
166
|
+
}
|
|
167
|
+
MetaNamespace._loadRootCertificate(rootPem, normalizedIssuer);
|
|
168
|
+
const fingerprint = MetaNamespace._certFingerprint(rootPem);
|
|
169
|
+
let effectiveTrustList = opts?.trust_list ?? this._loadLocalTrustList();
|
|
170
|
+
let trustSource = 'local';
|
|
171
|
+
if (!effectiveTrustList) {
|
|
172
|
+
effectiveTrustList = await this.downloadTrustRoots({ issuer: normalizedIssuer, timeout: opts?.timeout });
|
|
173
|
+
trustSource = this._issuerTrustRootUrl(normalizedIssuer);
|
|
174
|
+
}
|
|
175
|
+
const verified = this.verifyTrustRoots(effectiveTrustList, {
|
|
176
|
+
authority_cert_pem: opts?.authority_cert_pem,
|
|
177
|
+
authority_public_key_pem: opts?.authority_public_key_pem,
|
|
178
|
+
allow_unsigned: opts?.allow_unsigned,
|
|
179
|
+
});
|
|
180
|
+
this._enforceMonotonicVersion(effectiveTrustList);
|
|
181
|
+
const trustedFingerprints = new Set(verified.imported.map((i) => i.fingerprint_sha256));
|
|
182
|
+
if (!trustedFingerprints.has(fingerprint)) {
|
|
183
|
+
throw new ValidationError('issuer root certificate is not in trusted root list');
|
|
184
|
+
}
|
|
185
|
+
const ks = this._internal._keystore;
|
|
186
|
+
let certPath;
|
|
187
|
+
let bundlePath;
|
|
188
|
+
if (ks.saveIssuerRootCert) {
|
|
189
|
+
[certPath, bundlePath] = ks.saveIssuerRootCert(normalizedIssuer, rootPem, fingerprint);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
[certPath, bundlePath] = this._defaultSaveIssuerRootCert(normalizedIssuer, rootPem, fingerprint);
|
|
193
|
+
}
|
|
194
|
+
const auth = this._internal._auth;
|
|
195
|
+
const reloaded = auth.reloadTrustedRoots?.() ?? auth.reload_trusted_roots?.() ?? 0;
|
|
196
|
+
return {
|
|
197
|
+
issuer: normalizedIssuer,
|
|
198
|
+
fingerprint_sha256: fingerprint,
|
|
199
|
+
cert_path: certPath,
|
|
200
|
+
bundle_path: bundlePath,
|
|
201
|
+
reloaded_roots: reloaded,
|
|
202
|
+
source_url: sourceUrl,
|
|
203
|
+
trust_source: trustSource,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ── URL 解析 ──────────────────────────────────────────────────
|
|
207
|
+
_resolveTrustRootsUrl(url, issuer, gatewayUrl) {
|
|
208
|
+
const target = (url ?? '').trim();
|
|
209
|
+
if (target)
|
|
210
|
+
return target;
|
|
211
|
+
if (issuer)
|
|
212
|
+
return this._issuerTrustRootUrl(issuer);
|
|
213
|
+
const gw = (gatewayUrl ?? this._internal._gatewayUrl ?? '').trim();
|
|
214
|
+
return gw ? this._gatewayTrustRootsUrl(gw) : AUTHORITY_ENDPOINT;
|
|
215
|
+
}
|
|
216
|
+
_issuerTrustRootUrl(issuer) {
|
|
217
|
+
const authority = this._pkiAuthority(issuer);
|
|
218
|
+
return `https://${authority}/trust-root.json`;
|
|
219
|
+
}
|
|
220
|
+
_issuerRootCertUrl(issuer) {
|
|
221
|
+
const authority = this._pkiAuthority(issuer);
|
|
222
|
+
return `https://${authority}/root.crt`;
|
|
223
|
+
}
|
|
224
|
+
_pkiAuthority(issuer) {
|
|
225
|
+
const normalized = MetaNamespace._validateIssuer(issuer);
|
|
226
|
+
const port = this._internal._configModel.discoveryPort;
|
|
227
|
+
const portSuffix = port && !normalized.includes(':') ? `:${port}` : '';
|
|
228
|
+
return `pki.${normalized}${portSuffix}`;
|
|
229
|
+
}
|
|
230
|
+
_gatewayTrustRootsUrl(gatewayUrl) {
|
|
231
|
+
let parsed;
|
|
232
|
+
try {
|
|
233
|
+
parsed = new URL(gatewayUrl);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
throw new ValidationError('gateway_url must include scheme and host');
|
|
237
|
+
}
|
|
238
|
+
if (!parsed.host) {
|
|
239
|
+
throw new ValidationError('gateway_url must include scheme and host');
|
|
240
|
+
}
|
|
241
|
+
const scheme = ['wss:', 'https:'].includes(parsed.protocol) ? 'https' : 'http';
|
|
242
|
+
return `${scheme}://${parsed.host}/pki/trust-roots.json`;
|
|
243
|
+
}
|
|
244
|
+
// ── 内部辅助 ──────────────────────────────────────────────────
|
|
245
|
+
static _validateIssuer(issuer) {
|
|
246
|
+
const value = (issuer ?? '').trim().toLowerCase();
|
|
247
|
+
if (!value || value.includes('://') || value.includes('/') || value.includes('\\') || value.startsWith('.')) {
|
|
248
|
+
throw new ValidationError('issuer must be a domain name');
|
|
249
|
+
}
|
|
250
|
+
return value;
|
|
251
|
+
}
|
|
252
|
+
static _validateListMetadata(trustList) {
|
|
253
|
+
const version = trustList.version;
|
|
254
|
+
if (typeof version !== 'number' || !Number.isInteger(version) || version < 0) {
|
|
255
|
+
throw new ValidationError('trust roots list version must be a non-negative integer');
|
|
256
|
+
}
|
|
257
|
+
const issuedAt = MetaNamespace._parseTimestamp(trustList.issued_at, 'issued_at');
|
|
258
|
+
const nextUpdate = MetaNamespace._parseTimestamp(trustList.next_update, 'next_update');
|
|
259
|
+
if (nextUpdate < issuedAt) {
|
|
260
|
+
throw new ValidationError('trust roots list next_update must not be earlier than issued_at');
|
|
261
|
+
}
|
|
262
|
+
if (issuedAt > Date.now() + MAX_CLOCK_SKEW * 1000) {
|
|
263
|
+
throw new ValidationError('trust roots list issued_at is too far in the future');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
static _parseTimestamp(value, field) {
|
|
267
|
+
const text = String(value ?? '').trim();
|
|
268
|
+
if (!text)
|
|
269
|
+
throw new ValidationError(`trust roots list missing ${field}`);
|
|
270
|
+
const ts = new Date(text).getTime();
|
|
271
|
+
if (isNaN(ts))
|
|
272
|
+
throw new ValidationError(`trust roots list ${field} must be ISO-8601`);
|
|
273
|
+
return ts;
|
|
274
|
+
}
|
|
275
|
+
static _canonicalSignedPayload(trustList) {
|
|
276
|
+
const payload = { ...trustList };
|
|
277
|
+
delete payload.authority_signature;
|
|
278
|
+
// 规范 JSON:排序 key,无空格
|
|
279
|
+
const sorted = JSON.stringify(payload, Object.keys(payload).sort(), 0)
|
|
280
|
+
.replace(/\n/g, '');
|
|
281
|
+
// 使用稳定排序的 JSON
|
|
282
|
+
return Buffer.from(MetaNamespace._stableStringify(payload), 'utf-8');
|
|
283
|
+
}
|
|
284
|
+
static _stableStringify(obj) {
|
|
285
|
+
if (obj === null || obj === undefined)
|
|
286
|
+
return JSON.stringify(obj);
|
|
287
|
+
if (typeof obj !== 'object')
|
|
288
|
+
return JSON.stringify(obj);
|
|
289
|
+
if (Array.isArray(obj)) {
|
|
290
|
+
return '[' + obj.map(v => MetaNamespace._stableStringify(v)).join(',') + ']';
|
|
291
|
+
}
|
|
292
|
+
const keys = Object.keys(obj).sort();
|
|
293
|
+
const pairs = keys.map(k => JSON.stringify(k) + ':' + MetaNamespace._stableStringify(obj[k]));
|
|
294
|
+
return '{' + pairs.join(',') + '}';
|
|
295
|
+
}
|
|
296
|
+
static _decodeSignature(signature) {
|
|
297
|
+
let value = signature.trim();
|
|
298
|
+
if (value.startsWith('base64:')) {
|
|
299
|
+
value = value.slice(7);
|
|
300
|
+
}
|
|
301
|
+
// 补齐 padding,处理 URL-safe base64
|
|
302
|
+
const normalized = value.replace(/-/g, '+').replace(/_/g, '/');
|
|
303
|
+
const padding = '='.repeat((4 - (normalized.length % 4)) % 4);
|
|
304
|
+
return Buffer.from(normalized + padding, 'base64');
|
|
305
|
+
}
|
|
306
|
+
static _extractRootEntries(trustList) {
|
|
307
|
+
const roots = trustList.root_cas;
|
|
308
|
+
if (Array.isArray(roots)) {
|
|
309
|
+
return roots.filter(item => item && typeof item === 'object');
|
|
310
|
+
}
|
|
311
|
+
const legacy = trustList.roots;
|
|
312
|
+
if (Array.isArray(legacy)) {
|
|
313
|
+
return legacy
|
|
314
|
+
.filter(item => item && typeof item === 'object')
|
|
315
|
+
.map((item) => ({
|
|
316
|
+
id: item.agentid ?? item.id ?? item.cert_sn,
|
|
317
|
+
certificate: item.cert_pem ?? item.certificate,
|
|
318
|
+
fingerprint_sha256: item.fingerprint_sha256,
|
|
319
|
+
status: item.status ?? 'active',
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
throw new ValidationError('trust roots list missing root_cas');
|
|
323
|
+
}
|
|
324
|
+
static _normalizeFingerprint(value) {
|
|
325
|
+
let text = String(value ?? '').trim().toLowerCase();
|
|
326
|
+
if (text.startsWith('sha256:'))
|
|
327
|
+
text = text.slice(7);
|
|
328
|
+
return text.replace(/[^0-9a-f]/g, '');
|
|
329
|
+
}
|
|
330
|
+
static _certFingerprint(certPem) {
|
|
331
|
+
const b64 = certPem.replace(/-----[^-]+-----/g, '').replace(/\s+/g, '');
|
|
332
|
+
const der = Buffer.from(b64, 'base64');
|
|
333
|
+
return crypto.createHash('sha256').update(der).digest('hex');
|
|
334
|
+
}
|
|
335
|
+
static _loadRootCertificate(certPem, rootId) {
|
|
336
|
+
if (!certPem.includes('BEGIN CERTIFICATE')) {
|
|
337
|
+
throw new ValidationError(`root certificate missing PEM data: ${rootId}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
_loadAuthorityPublicKey(authorityCertPem, authorityPublicKeyPem, trustList) {
|
|
341
|
+
if (authorityPublicKeyPem) {
|
|
342
|
+
try {
|
|
343
|
+
return crypto.createPublicKey(authorityPublicKeyPem);
|
|
344
|
+
}
|
|
345
|
+
catch (e) {
|
|
346
|
+
throw new ValidationError('invalid authority public key PEM');
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
const candidateCert = authorityCertPem
|
|
350
|
+
|| String(trustList?.authority_cert_pem ?? '')
|
|
351
|
+
|| this._loadLocalAuthorityCert();
|
|
352
|
+
if (!candidateCert) {
|
|
353
|
+
throw new ValidationError('authority certificate/public key is required to verify trust roots');
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
const x509 = new crypto.X509Certificate(candidateCert);
|
|
357
|
+
return x509.publicKey;
|
|
358
|
+
}
|
|
359
|
+
catch (e) {
|
|
360
|
+
throw new ValidationError('invalid authority certificate PEM');
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
_loadLocalAuthorityCert() {
|
|
364
|
+
const ks = this._internal._keystore;
|
|
365
|
+
const candidates = [
|
|
366
|
+
ks.trustRootDir ? join(ks.trustRootDir(), '..', 'authority', 'authority.crt') : null,
|
|
367
|
+
join(__dirname, '..', 'certs', 'authority.crt'),
|
|
368
|
+
].filter(Boolean);
|
|
369
|
+
for (const path of candidates) {
|
|
370
|
+
try {
|
|
371
|
+
if (existsSync(path))
|
|
372
|
+
return readFileSync(path, 'utf-8');
|
|
373
|
+
}
|
|
374
|
+
catch { /* ignore */ }
|
|
375
|
+
}
|
|
376
|
+
return '';
|
|
377
|
+
}
|
|
378
|
+
_enforceMonotonicVersion(trustList) {
|
|
379
|
+
const version = trustList.version;
|
|
380
|
+
if (typeof version !== 'number')
|
|
381
|
+
return;
|
|
382
|
+
const ks = this._internal._keystore;
|
|
383
|
+
const trustRootDir = ks.trustRootDir ? ks.trustRootDir() : this._defaultTrustRootDir();
|
|
384
|
+
const jsonPath = join(trustRootDir, 'trust-roots.json');
|
|
385
|
+
if (!existsSync(jsonPath))
|
|
386
|
+
return;
|
|
387
|
+
try {
|
|
388
|
+
const current = JSON.parse(readFileSync(jsonPath, 'utf-8'));
|
|
389
|
+
const currentVersion = current?.version;
|
|
390
|
+
if (typeof currentVersion === 'number' && version < currentVersion) {
|
|
391
|
+
throw new ValidationError('trust roots list version rollback is not allowed');
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch (e) {
|
|
395
|
+
if (e instanceof ValidationError)
|
|
396
|
+
throw e;
|
|
397
|
+
// 文件损坏等情况忽略
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
_loadLocalTrustList() {
|
|
401
|
+
const ks = this._internal._keystore;
|
|
402
|
+
const trustRootDir = ks.trustRootDir ? ks.trustRootDir() : this._defaultTrustRootDir();
|
|
403
|
+
const jsonPath = join(trustRootDir, 'trust-roots.json');
|
|
404
|
+
if (!existsSync(jsonPath))
|
|
405
|
+
return null;
|
|
406
|
+
try {
|
|
407
|
+
const payload = JSON.parse(readFileSync(jsonPath, 'utf-8'));
|
|
408
|
+
if (!payload || typeof payload !== 'object') {
|
|
409
|
+
throw new ValidationError('local trust roots list must be a JSON object');
|
|
410
|
+
}
|
|
411
|
+
return payload;
|
|
412
|
+
}
|
|
413
|
+
catch (e) {
|
|
414
|
+
if (e instanceof ValidationError)
|
|
415
|
+
throw e;
|
|
416
|
+
throw new ValidationError('local trust roots list is invalid');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// ── 默认存储实现(当 keystore 未提供 trust-root 方法时) ──────
|
|
420
|
+
_defaultTrustRootDir() {
|
|
421
|
+
const ks = this._internal._keystore;
|
|
422
|
+
const root = ks._rootPath ?? ks._root ?? '';
|
|
423
|
+
return join(root, 'CA', 'root');
|
|
424
|
+
}
|
|
425
|
+
_defaultSaveTrustRoots(trustList, imported) {
|
|
426
|
+
const dir = this._defaultTrustRootDir();
|
|
427
|
+
mkdirSync(dir, { recursive: true });
|
|
428
|
+
// 保存每个根证书
|
|
429
|
+
for (const item of imported) {
|
|
430
|
+
const safeId = (item.id || item.fingerprint_sha256).replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
431
|
+
writeFileSync(join(dir, `${safeId}.crt`), item.cert_pem, 'utf-8');
|
|
432
|
+
}
|
|
433
|
+
// 生成合并 bundle
|
|
434
|
+
const bundlePath = join(dir, 'trust-roots.pem');
|
|
435
|
+
const bundle = imported.map((i) => i.cert_pem.trim()).join('\n') + '\n';
|
|
436
|
+
writeFileSync(bundlePath, bundle, 'utf-8');
|
|
437
|
+
// 保存元数据
|
|
438
|
+
writeFileSync(join(dir, 'trust-roots.json'), JSON.stringify(trustList, null, 2), 'utf-8');
|
|
439
|
+
return bundlePath;
|
|
440
|
+
}
|
|
441
|
+
_defaultSaveIssuerRootCert(issuer, certPem, fingerprint) {
|
|
442
|
+
const dir = this._defaultTrustRootDir();
|
|
443
|
+
const issuersDir = join(dir, 'issuers');
|
|
444
|
+
mkdirSync(issuersDir, { recursive: true });
|
|
445
|
+
const safeIssuer = issuer.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
446
|
+
const certPath = join(issuersDir, `${safeIssuer}.root.crt`);
|
|
447
|
+
writeFileSync(certPath, certPem, 'utf-8');
|
|
448
|
+
// 合并进 bundle(去重)
|
|
449
|
+
const bundlePath = join(dir, 'trust-roots.pem');
|
|
450
|
+
let existingPems = [];
|
|
451
|
+
if (existsSync(bundlePath)) {
|
|
452
|
+
const existing = readFileSync(bundlePath, 'utf-8');
|
|
453
|
+
existingPems = existing.split(/(?=-----BEGIN CERTIFICATE-----)/).filter(p => p.trim());
|
|
454
|
+
}
|
|
455
|
+
// 去重:按指纹
|
|
456
|
+
const existingFingerprints = new Set(existingPems.map(p => MetaNamespace._certFingerprint(p.trim())));
|
|
457
|
+
if (!existingFingerprints.has(fingerprint)) {
|
|
458
|
+
existingPems.push(certPem.trim());
|
|
459
|
+
}
|
|
460
|
+
writeFileSync(bundlePath, existingPems.join('\n') + '\n', 'utf-8');
|
|
461
|
+
return [certPath, bundlePath];
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/namespaces/meta.ts"],"names":[],"mappings":"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"}
|