已合并
docs: 补充HTTP/SSE内部链路mTLS证书认证设计与接口文档 #533
docs: 补充HTTP/SSE内部链路mTLS证书认证设计与接口文档 #533
已合并
Wal1et创建于 25 天前
共 10 个文件变更+708-15
Mapplications/agent_runtime/docs/api/config-plane-api.md+3-1文件内容审核中,请稍后刷新重试
Mapplications/agent_runtime/docs/design/Agent-Runtime-HLD.md+2-2文件内容审核中,请稍后刷新重试
Mapplications/agent_runtime/docs/feature/README.md+1-0文件内容审核中,请稍后刷新重试
@@ -10,13 +10,16 @@
10|---|---|---|10|---|---|---|
11| 本文件 | 架构一页纸 + 键前缀总览 + 测试/部署入口 | 先读 |11| 本文件 | 架构一页纸 + 键前缀总览 + 测试/部署入口 | 先读 |
12| [service-core.md](service-core.md) | 组装(main)/CLI/配置(`AGENT_RUNTIME_*`)/错误码契约/字段分类/工具/部署 | 改装配、配置、错误契约、部署时 |12| [service-core.md](service-core.md) | 组装(main)/CLI/配置(`AGENT_RUNTIME_*`)/错误码契约/字段分类/工具/部署 | 改装配、配置、错误契约、部署时 |
13+| [link-mtls.md](link-mtls.md) | HTTP/SSE 链路 mTLS:模式、profile、请求守卫、数据库与 AgentServer Pod 注入 | 改内部链路认证、证书材料或部署集成时 |
13| [session-manager.md](session-manager.md) | SM:route/touch/config_sync/config_refresh/cleanup 编排、6 个 Lua、SM 键表 | 改会话编排/配置层时 |14| [session-manager.md](session-manager.md) | SM:route/touch/config_sync/config_refresh/cleanup 编排、6 个 Lua、SM 键表 | 改会话编排/配置层时 |
14| [resource-manager.md](resource-manager.md) | RM:acquire/后台任务/K8s 适配、6 个 Lua、RM 键表 | 改 Pod 池/扩缩容/清理时 |15| [resource-manager.md](resource-manager.md) | RM:acquire/后台任务/K8s 适配、6 个 Lua、RM 键表 | 改 Pod 池/扩缩容/清理时 |
15| [evaluation.md](evaluation.md) | 自评估:采样/评估两 job、`{agent_runtime:eval}` 键表、规则清单、LLM 降级矩阵 | 改自评估/趋势/报告时 |16| [evaluation.md](evaluation.md) | 自评估:采样/评估两 job、`{agent_runtime:eval}` 键表、规则清单、LLM 降级矩阵 | 改自评估/趋势/报告时 |
16| [e2e-test-cases.md](e2e-test-cases.md) | 全部 e2e 用例的场景/输入/预期输出 | 写或跑 e2e 时 |17| [e2e-test-cases.md](e2e-test-cases.md) | 全部 e2e 用例的场景/输入/预期输出 | 写或跑 e2e 时 |
17| [load-test.md](load-test.md) | 压测/浸泡工具 `scripts/load_test.py`:6 场景矩阵、判定层(客户端/可视化/ERROR 日志/巡检)、使用指南与已知容量语义 | 跑压测/浸泡、给工具加场景或判定时 |18| [load-test.md](load-test.md) | 压测/浸泡工具 `scripts/load_test.py`:6 场景矩阵、判定层(客户端/可视化/ERROR 日志/巡检)、使用指南与已知容量语义 | 跑压测/浸泡、给工具加场景或判定时 |
18| `../api/config-plane-api.md` | 配置面对外接口文档(config_sync/config_refresh/visualization:字段表+curl+真实返回示例) | 给调用方(Claw Manager/运维/可视化前端)交付接口契约时 |19| `../api/config-plane-api.md` | 配置面对外接口文档(config_sync/config_refresh/visualization:字段表+curl+真实返回示例) | 给调用方(Claw Manager/运维/可视化前端)交付接口契约时 |
20+| `../api/link-mtls-contract.md` | HTTPS/mTLS、证书角色、绑定 Header、Manager 绑定接口契约 | 对接 Gateway、Manager 或 AgentServer 时 |
19| `../design/Agent-Runtime-HLD.md` | 架构总览/接口契约/场景 A–N/Redis 键表(语义权威) | 语义不确定时 |21| `../design/Agent-Runtime-HLD.md` | 架构总览/接口契约/场景 A–N/Redis 键表(语义权威) | 语义不确定时 |
22+| `../design/http-sse-link-mtls-design.md` | 内部链路 mTLS 的身份、信任、持久化和多实例设计 | 理解安全边界和跨组件关系时 |
20| `../design/session-manager-design.md` | SM 详细设计(6 个 Lua 全文) | 深挖 SM 设计动机 |23| `../design/session-manager-design.md` | SM 详细设计(6 个 Lua 全文) | 深挖 SM 设计动机 |
21| `../design/resource-manager-design.md` | RM 详细设计(6 个 Lua 全文) | 深挖 RM 设计动机 |24| `../design/resource-manager-design.md` | RM 详细设计(6 个 Lua 全文) | 深挖 RM 设计动机 |
22 25 
@@ -6,3 +6,4 @@
6- [3. Agent部署](3.%20Agent部署.md)6- [3. Agent部署](3.%20Agent部署.md)
7- [4. Agent接入](4.%20Agent接入.md)7- [4. Agent接入](4.%20Agent接入.md)
8- [5. 安全模块](5.%20安全模块.md)8- [5. 安全模块](5.%20安全模块.md)
9+- [内部链路 mTLS 接入](内部链路mTLS接入.md)
@@ -17,7 +17,7 @@ JIUWENSWARM_LINK_MTLS_MODE=enforce
17 17 
18`observe` 只预检本地材料,不切换协议、不代表已经开启认证;不能用 `true`、`false` 或 `on` 代替枚举值。18`observe` 只预检本地材料,不切换协议、不代表已经开启认证;不能用 `true`、`false` 或 `on` 代替枚举值。
19 19 
20-由部署工具为各组件生成并注入角色材料,无须另填 CA/CERT/KEY 路径、绑定 ID、epoch 或手写 profile。详细安装步骤、客户管理服务示例、数据结构与运维限制见配套 JiuwenSwarm 仓库的 `docs/zh/HTTP-SSE链路mTLS部署配置.md`。20+由部署工具为各组件生成并注入角色材料,无须另填 CA/CERT/KEY 路径、绑定 ID、epoch 或手写 profile。详细安装步骤、客户管理服务示例和数据结构见配套 JiuwenSwarm 仓库的 `docs/zh/HTTP-SSE链路mTLS部署配置.md`。
21 21 
22无内置 Manager 交付采用 `APPLY_PATCH=true` 和 `up gateway web runtime`;部署工具使用 manager 角色证书下发初始配置。客户自己的管理服务也是 manager 角色,不要求部署 Manager Server、Manager Web 或 Identity Center。22无内置 Manager 交付采用 `APPLY_PATCH=true` 和 `up gateway web runtime`;部署工具使用 manager 角色证书下发初始配置。客户自己的管理服务也是 manager 角色,不要求部署 Manager Server、Manager Web 或 Identity Center。
23 23 
@@ -27,23 +27,21 @@ Manager 的服务证书不绑定某一个 `instance_info.jiuwenclaw_id`。Manage
27 27 
28自动登记和显式绑定均只接受无凭据、无路径、无查询参数的精确 Gateway/Runtime 地址,并要求地址与该 `instance_info` 记录一致,避免把相似 URL 或其他实例的地址误认成当前部署。多实例请求先按业务 `jiuwenclaw_id` 选择绑定记录,再把该记录的 mTLS 绑定 Header、目标地址、目标 CA 和目标叶证书指纹作为同一个目标对象使用;不能把一个实例的 Header 与另一个实例的 TLS 目标混用。业务 ID 不放入 mTLS Header。28自动登记和显式绑定均只接受无凭据、无路径、无查询参数的精确 Gateway/Runtime 地址,并要求地址与该 `instance_info` 记录一致,避免把相似 URL 或其他实例的地址误认成当前部署。多实例请求先按业务 `jiuwenclaw_id` 选择绑定记录,再把该记录的 mTLS 绑定 Header、目标地址、目标 CA 和目标叶证书指纹作为同一个目标对象使用;不能把一个实例的 Header 与另一个实例的 TLS 目标混用。业务 ID 不放入 mTLS Header。
29 29 
30-既有 ID 和 mTLS ID 不混用:`jiuwenclaw_id` 仍是 Manager 业务实例主键,`GATEWAY_INSTANCE_ID` 仍服务于 Gateway 主备/Redis,Runtime `instance_id` 仍是进程或副本身份。新机制只新增内部 `mtls_deployment_id`、`mtls_binding_id` 和 `mtls_binding_epoch`。`mtls_deployment_id` 由部署工具首次随机生成并持久化,不作为客户配置或请求 Header。30+`jiuwenclaw_id` 是 Manager 业务实例主键,`GATEWAY_INSTANCE_ID` 服务于 Gateway 主备和 Redis,Runtime `instance_id` 表示进程或副本。mTLS 使用内部的 `mtls_deployment_id`、`mtls_binding_id` 和 `mtls_binding_epoch`;`mtls_deployment_id` 由部署工具首次随机生成并持久化。
31 31 
32## 运行与数据原理32## 运行与数据原理
33 33 
34- Runtime 的内部 API 在 enforce 下要求 HTTPS/mTLS;会话 route、touch、cleanup、config_refresh 接受绑定的 gateway 角色,管理配置接口接受 manager 角色。34- Runtime 的内部 API 在 enforce 下要求 HTTPS/mTLS;会话 route、touch、cleanup、config_refresh 接受绑定的 gateway 角色,管理配置接口接受 manager 角色。
35-- 除 TLS CA/SAN 验证外,还核验对端角色指纹、`mtls_binding_id` 和 `mtls_binding_epoch`。Manager 的 `jiuwenclaw_id` 保留在原有业务 API 中,不作为证书身份;请求头不能替代实际 TLS 对端证书。35+- 除 TLS CA/SAN 验证外,还核验实际 TLS 对端证书的角色指纹、`mtls_binding_id` 和 `mtls_binding_epoch`。Manager 的 `jiuwenclaw_id` 保留在原有业务 API 中,用于选择当前实例绑定。
36- Runtime 创建 AgentServer 时,向其主容器注入 AgentServer 专用 Secret,使用 headless Service 下的 Pod DNS;不向 JiuwenBox 注入证书。不要求为动态 Pod IP 逐个签发证书。36- Runtime 创建 AgentServer 时,向其主容器注入 AgentServer 专用 Secret,使用 headless Service 下的 Pod DNS;不向 JiuwenBox 注入证书。不要求为动态 Pod IP 逐个签发证书。
37-- 同一绑定的 AgentServer 可共享 AgentServer 角色证书,不代表每个 Pod 具有独立证书身份。Gateway、Runtime、manager 使用各自独立的私钥。37+- 同一绑定的 AgentServer 使用 AgentServer 角色证书;Gateway、Runtime、manager 使用各自独立的私钥。
38- Gateway 数据库的 `link_binding_state` 保存可恢复的完整角色材料,Runtime 同名表只保存公开状态及 AgentServer Secret 引用。实际运行依赖角色专属的 Secret/文件,不是直接把整套数据库材料交给每个服务。38- Gateway 数据库的 `link_binding_state` 保存可恢复的完整角色材料,Runtime 同名表只保存公开状态及 AgentServer Secret 引用。实际运行依赖角色专属的 Secret/文件,不是直接把整套数据库材料交给每个服务。
39-- 首次随机签发十年证书,普通重部署复用已入库材料,不重签、不延长有效期;不一致、已撤销、过期或材料残缺时停止,不回退明文。39+- 首次随机签发十年证书并写入数据库;部署时校验数据库、Secret 和 profile 的材料及绑定版本一致性。
40 40 
41-## 交付与安全约束41+## 部署与运行要求
42 42 
431. Gateway、Runtime、AgentServer、部署工具及 Runtime foundation 需要使用配套版本。镜像构建应包含 `foundation[link-mtls]` 所声明的 HTTP/TLS 依赖;不能仅给旧镜像增加环境变量即视为功能可用。431. Gateway、Runtime、AgentServer、部署工具及 Runtime foundation 需要使用配套版本。镜像构建应包含 `foundation[link-mtls]` 所声明的 HTTP/TLS 依赖;不能仅给旧镜像增加环境变量即视为功能可用。
44-2. 不新增独立证书管理 Pod、在线 CA 或 Runtime 续期任务;非 root/权限适配场景可在现有 Pod 中使用仅复制材料的初始化/同步辅助容器。44+2. 数据库保存部署证书材料,Kubernetes Secret 保存各工作负载的角色材料;需按私钥数据保护数据库账号、备份、部署权限和 Secret RBAC。
45-3. 私钥材料可从 Gateway 数据库恢复,需保护数据库账号、备份、部署权限和 Secret RBAC;应用未额外加密材料列,Secret Base64 也不是加密。45+3. 受管地址在 `enforce` 下解析为 HTTPS;外部地址使用显式 HTTPS 并通过 CA、SAN 和目标指纹验证。
46-4. 没有自动续期、跨组件一键换证/撤销/重绑定或旧材料自动导入。修改本地 profile、单个 Secret、某一数据库字段不构成完整集群维护流程。46+4. 多实例 Manager 发起配置请求时,按 `jiuwenclaw_id` 同时选择绑定 Header、信任包、目标地址和目标叶证书指纹。
47-5. 受管地址在 enforce 下解析为 HTTPS;外部地址须显式 HTTPS 且通过验证。此机制不会改写模型 API、用户登录或外部 A2A 的协议。47+5. 服务在启动时读取 mTLS 模式和 profile;部署配置更新通过对应工作负载的重新部署生效。
48-6. 从已启用的部署回退到 off 需协调全部相关组件及存量 AgentServer;仅修改 `.env` 不会立即改变运行中的服务。
49-7. 多实例 Manager 发起配置写请求时必须按 `jiuwenclaw_id` 同时选择绑定 Header、信任包和目标叶证书指纹;只信任全局 CA、却不核对该实例登记的目标指纹,不属于完整绑定校验。