6.8 KiB
QingLong 3.0 Worker 管理客户端 CA 轮换
本流程只适用于 Cluster Profile 的 Worker credential management 客户端信任根。它不轮换服务端证书, 不改变 Worker-purpose OIDC、Project Policy 或双人审批,也不允许用客户端证书替代 User authority。
固定边界
ca.crt必须是严格 UTF-8,只含 1–16 张唯一、当前有效且 Basic Constraints 为 CA 的 PEM 证书;client.crl必须只含 1–16 份唯一、OpenSSL 可加载的 PEM CRL;生产 PKI operator 必须为 overlap 中每个 issuer 发布当前 CRL,并在真实请求门中分别验证;- 两个文件都只在新进程启动时读取。禁止原地 watcher、动态 TLS context、第二 listener 或 sidecar;
- 每一阶段都必须同时计算 CA/CRL 原始 bundle 的 SHA-256,更新 Pod-template 两个摘要注解,并完成
maxUnavailable=0rollout;只更新 Secret 而不推进 Deployment generation 不算生效; - 证据 collector 保持只读,PKI/Deployment operator 才能更新 Secret 和 Deployment。
阶段 1:old
- 盘点全部仍可能调用管理面的 old client identity,并确认 old CRL 当前有效;
- Secret 只投影 old CA 与 old CRL;摘要注解分别绑定这两个文件;
- 完整 rollout 后,从两个新 Pod 分别证明 old client 业务请求 200,未知 CA 请求 401,健康探针无证书 200;
- 保存 Deployment generation、Secret revision、Pod 世代与低敏请求结果,不保存私钥、JWT 或 Secret 内容。
阶段 2:overlap
- 在外部 PKI 中签发 new CA 和 new client identity;先分发 new client 私钥,后扩大服务端 trust;
ca.crt精确变为old CA + new CA,client.crl同时包含 old/new issuer 的当前 CRL;- 更新两个 bundle 摘要注解并完成完整 rollout,确认旧 Pod 全部退役;
- 在每个新 Pod 上分别证明 old client 200、new client 200、未知 CA 401;继续运行 D-229 身份、D-230 durable audit 与 D-232 CRL 证据所需的 inspect 检查;
- 只有所有合法 caller 都已观测 new client 成功,且 overlap 达到组织规定的最小传播窗口,才允许退休 old。
阶段 3:new
- 停止签发 old CA,吊销或禁用残留 old identity,并先发布最终 old CRL;
ca.crt精确收敛为 new CA,client.crl收敛为 new issuer 的当前 CRL;- 更新两个摘要注解并完成完整 rollout,确认 overlap Pod 全部退役;
- 在每个新 Pod 上证明 old client 401
client_certificate_required、new client 200、健康探针 200; - 保留 old CA/CRL 与变更证据到审计保留期结束,但不得再把 old CA 加回运行时 trust。
D-234 三阶段证据命令
三个阶段必须由同一只读 collector、同一外部 OIDC operator subject、同一 endpoint/server trust 和同一
worker-credential.inspect command 采集。--client-ca-bundle 是服务端用来验证客户端证书的 CA 集合;client
config 内的 caFile 是客户端用来验证管理 API 服务端证书的 trust bundle,两者互相独立,不要求同一 issuer。
所有输入都必须是 canonical absolute path。assertion、client config、private key、Kubeconfig 和阶段/最终报告使用
owner-private 文件;输出路径必须尚不存在,runner 以 0600 no-replace 创建。先在阶段 1 执行:
QL3_WORKER_CREDENTIAL_MANAGEMENT_CA_ROLLOVER_EVIDENCE=1 \
pnpm evidence:worker-management-ca-rollover:ql3 -- \
--phase=old \
--old-config=/secure/ql3/old-client.json \
--new-config=/secure/ql3/new-client.json \
--assertion=/secure/ql3/operator.jwt \
--command=/secure/ql3/inspect-command.json \
--kubernetes=/secure/ql3/evidence.kubeconfig \
--client-ca-bundle=/secure/ql3/old-client-ca.pem \
--client-crl-bundle=/secure/ql3/old-client-crl.pem \
--output=/secure/ql3/old-state.json
完成 exact old+new rollout 后执行阶段 2;--previous 摘要绑定 old-state,不能复制或改写其 JSON:
QL3_WORKER_CREDENTIAL_MANAGEMENT_CA_ROLLOVER_EVIDENCE=1 \
pnpm evidence:worker-management-ca-rollover:ql3 -- \
--phase=overlap \
--old-config=/secure/ql3/old-client.json \
--new-config=/secure/ql3/new-client.json \
--assertion=/secure/ql3/operator.jwt \
--command=/secure/ql3/inspect-command.json \
--kubernetes=/secure/ql3/evidence.kubeconfig \
--client-ca-bundle=/secure/ql3/overlap-client-ca.pem \
--client-crl-bundle=/secure/ql3/overlap-client-crl.pem \
--previous=/secure/ql3/old-state.json \
--output=/secure/ql3/overlap-state.json
完成 new-only rollout 后执行阶段 3。D-229 ceremony 与 D-230 durable audit 报告必须来自本次受审变更,durable report 必须已经摘要绑定 ceremony report:
QL3_WORKER_CREDENTIAL_MANAGEMENT_CA_ROLLOVER_EVIDENCE=1 \
pnpm evidence:worker-management-ca-rollover:ql3 -- \
--phase=new \
--old-config=/secure/ql3/old-client.json \
--new-config=/secure/ql3/new-client.json \
--assertion=/secure/ql3/operator.jwt \
--command=/secure/ql3/inspect-command.json \
--kubernetes=/secure/ql3/evidence.kubeconfig \
--client-ca-bundle=/secure/ql3/new-client-ca.pem \
--client-crl-bundle=/secure/ql3/new-client-crl.pem \
--old=/secure/ql3/old-state.json \
--previous=/secure/ql3/overlap-state.json \
--ceremony-report=/secure/ql3/live-ceremony.json \
--durable-audit-report=/secure/ql3/durable-audit.json \
--output=/secure/ql3/ca-rollover-evidence.json
最终报告必须再由不需要集群凭据的离线门重判:
pnpm audit:worker-management-ca-rollover:ql3 -- \
--report=/secure/ql3/ca-rollover-evidence.json
兼容输出必须同时包含 "compatible":true,最终报告的 gates.passed 必须为 true。D-232 同 CA 单证书 CRL
吊销证据仍可按组织策略独立运行,但不是把 old/new 两个 CA 合并成同 issuer 的前置条件。
失败与回退
- 新 Pod 因 PEM、有效期、CA 用途、重复或 CRL 解析失败而不能 Ready:停止 rollout,保留仍 Ready 的旧 Pod, 修复候选 bundle 后推进新的 generation;
- overlap 中 new client 失败:保持 old+new,不得退休 old;检查 client key/certificate、EKU、issuer CRL 与 NetworkPolicy,修复后重新完整 rollout;
- new-only 阶段出现未迁移 caller:只能经新的受审变更回到 exact overlap,并重新计算两个摘要、完整 rollout; 禁止只重启单 Pod或把旧 CA 临时塞入某个副本;
- 紧急 old CA compromise 时可缩短 overlap,但仍必须先使 new client 可用、发布 CRL、推进完整 generation, 并运行 D-232 的旧证书拒绝证据。可用性压力不能把未知结果解释成成功退休。
该流程不增加 workspace package、第三方依赖、migration、controller、timer、watcher、listener、Pool 或连接; Edge、Standalone 与 Worker Profile 不装配该能力,低配部署没有稳态成本。