Files
qinglong/docs/adr/ADR-0251-worker-management-revocation-trust-domain-separation.md
T

68 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-0251Worker 管理吊销证据的双 PKI 信任域分离
- 状态:Accepted
- 日期:2026-08-01
- 关联 RFCQL-RFC-0001 D-231、D-232、D-233、D-234
- 关联 ADRADR-0247、ADR-0248、ADR-0249、ADR-0250
- 取代范围:ADR-0248/D-232 中“同 endpoint/CA”的模糊约束,以及 PKI evidence v1
## 背景
D-232 v1 从 production client config 的 `caFile` 读取管理 API 服务端 TLS CA,同时要求该 CA 直接签发 old/new
客户端证书。这把两个独立方向的认证错误合并为一个 PKI:
- client → managerclient config 的 server trust bundle 验证管理 API 服务端证书;
- manager → clientmanager 的 client trust bundle/CRL 验证客户端证书及吊销状态。
实际生产部署通常由 ingress/server PKI 和 operator/client PKI 分别管理。D-234 已显式要求服务端 trust 与客户端
issuer 分离;继续接受 D-232 v1 会拒绝正确拓扑,也会让后续统一 release gate 无法可靠绑定两类事实。
## 决策
1. D-232 报告和 before-state 升级为 schema/fixture v2v1 不再构成兼容发布证据。离线 auditor 必须拒绝 v1
防止旧报告在修复后继续被提升为有效双 PKI 证明。
2. old/new production client config 仍必须使用同一 HTTPS endpoint、servername、server trust bundle 和 inspect
command,但 `caFile` 只验证服务端 TLS。server trust bundle 必须是严格 UTF-8、只含 1–16 张唯一、当前有效
`ca=true` 的 PEM CA;报告保留原始 bundle digest 和有序 authority fingerprint 集合。
3. runner 新增 exact `--client-issuer-ca` 输入。它必须只含一张当前有效 CA;old/new 两张 client certificate 都
必须由它签发并验证通过,且证书仍需匹配各自 private key、非 CA、具备 clientAuth EKU、处于有效期。
4. OpenSSL 以 RFC2253 规范化 client issuer CA subject 与 CRL issuerCRL issuer digest 必须精确等于显式 CA
subject digest。before/after 必须继续使用同一 issuer CA bundle/certificate/subjectCRL number、lastUpdate
和原始摘要按原 D-232 规则单调前进。
5. v2 transport 只报告 server trust bundle/authority digestv2 PKI section 独立报告 client issuer bundle、CA
fingerprint、subject digest 和 CRL facts。`serverTrustSeparatedFromClientIssuer` 表示两条链独立验证,不要求
它们的 certificate 必须不同,但禁止通过同一个隐式字段证明两种方向。
6. D-232 继续只证明同一 client issuer 下的单证书吊销;跨 CA old→overlap→new 必须使用 D-234。runner 不读取
Secret、不修改 Deployment/PKI/RBAC,不新增 package、依赖、migration 或常驻资源。
## 失败与迁移
- 缺少 `--client-issuer-ca`、文件含多张/非 CA/过期/重复/附加文本:在 Kubernetes/client 请求前失败关闭;
- old/new 任一证书不由显式 CA 签发,或 CRL issuer 不匹配该 CA:不创建 before/final 输出;
- server trust 或 client issuer 在 before/after 漂移:拒绝拼接两个阶段;
- 已保存的 v1 报告可作为历史原始记录保留,但不能通过 v2 auditor,也不能进入 D-235 统一 release evidence
- 若组织确实使用同一根 CA,仍必须通过两个独立输入和两组摘要明确证明两个方向,不能省略 issuer 输入。
## 被拒绝的替代方案
### 保留 v1 并把字段改名
拒绝。只改名仍会让 client leaf 由 server trust CA 验证,无法支持双 PKI,也会让旧报告与新语义不可区分。
### 从客户端证书的 issuer 文本推断 CA
拒绝。issuer DN 不是签名证明,可能发生同名 CA;必须提供具体 CA certificate 并执行 `checkIssued` 与签名验证。
### 要求 D-234 替代所有 D-232 吊销证据
拒绝。CA rollover 与同 issuer 单证书 revocation 是两个正交控制;前者不能证明 CRL number 单调和被吊销 leaf
统一拒绝,后者也不能证明 trust overlap 与 CA 安全退休。
## 验证
- D-232 v2 runner/auditor 9/9:原两阶段/CRL/rollout/RBAC/报告/CLI 覆盖全部保留;
- 新增错误 issuer 负向测试,在任何 client access 前失败;
- 新增真实 OpenSSL 双 PKI 测试:server trust CA-A、client issuer CA-Bclient config 与 issuer signature 均验证
成功,两个 fingerprint 明确不同;
- `node --check` 与 D-232 定向测试通过;workspace package、第三方依赖和 Profile 闭包不变。