23 · mTLS(cell 与 flow 调度器)
状态:cell 集群与 flow 调度器(
ain-sched)的 NDJSON/TCP 传输都支持双向 TLS。
23.1 信任模型
Coordinator (client cert) ── TLS 1.3 ──▶ Cell worker (server cert)
│ │
└──────── both verify CA ───────────┘
- 双方各有一张由同一 CA 签发的证书;worker 用
WebPkiClientVerifier要求 coordinator 出示 client cert。 - coordinator 校验 worker 证书的 hostname/IP SAN。
- 共享 token 与 per-cell HMAC capability 仍然保留:TLS 保护传输, capability 保护“谁能操作哪个 cell”。
- 证书只用于传输层;Agent 不能访问私钥。
23.2 CLI
生成开发证书(仅本地):
cargo run -q -p ain-cluster --example gen-certs -- /tmp/ain-tls
worker:
ain cell serve --bind 0.0.0.0:7200 --id n1 \
--tls-cert /etc/ain/server-cert.pem \
--tls-key /etc/ain/server-key.pem \
--tls-ca /etc/ain/ca.pem
coordinator:
ain cluster demo \
--nodes n1@node1:7200,n2@node2:7200 \
--tls-cert /etc/ain/client-cert.pem \
--tls-key /etc/ain/client-key.pem \
--tls-ca /etc/ain/ca.pem
flow 调度器同理:
ain node serve --bind 0.0.0.0:7100 --id n1 \
--tls-cert /etc/ain/server-cert.pem \
--tls-key /etc/ain/server-key.pem \
--tls-ca /etc/ain/ca.pem
ain flow distribute examples/research.flow \
--nodes node1:7100,node2:7100 --repeat 100 \
--tls-cert /etc/ain/client-cert.pem \
--tls-key /etc/ain/client-key.pem \
--tls-ca /etc/ain/ca.pem
完整 smoke test:
./scripts/tls-demo.sh
它会跑 3 节点 mTLS pipeline、100 个 LLM cells,并确认明文客户端被拒绝。
23.3 证书要求
| 项 | 要求 |
|---|---|
| CA | 同一 CA 签发 server/client;CA 证书放入 --tls-ca |
| server cert | SAN 必须包含 coordinator 连接使用的 DNS 名或 IP(如 node1、10.0.0.11) |
| client cert | 任意 subject;worker 只校验链与 CA |
| 私钥 | PKCS#8 / PKCS#1 / SEC1 PEM;文件权限 0600 |
| 轮换 | 当前需重启 worker/coordinator;未实现在线热轮换 |
| 撤销 | 未实现 CRL/OCSP;轮换 CA 需重新分发 |
gen-certs 生成的是自签开发材料,不要用于生产。
23.4 失败模式
| 场景 | 结果 |
|---|---|
| 明文客户端连 TLS worker | 握手失败,coordinator 返回 transport: 错误 |
| 客户端无证书 | worker 拒绝握手 |
| 客户端 CA 不匹配 | coordinator 校验 server 失败 |
| server SAN 不匹配地址 | coordinator 校验失败 |
| 证书过期 | 握手失败(依赖系统时间) |
| 中间人 | 无 CA 私钥无法签发可验证证书 |
TLS 错误目前映射为 ClusterError::Transport(node, message);CLI 退出码 1。
生产应把详细错误写入结构化日志,而不是只打印到 stderr。
23.5 代码
crates/ain-tls:TlsIdentity::{from_paths, from_pem, client_config, server_config};rustls + ring provider,被 cluster/sched 共用。crates/ain-cluster/src/wire.rs:call/call_tls,统一 NDJSON exchange。crates/ain-cluster/src/worker.rs:accept 后ServerConnection+StreamOwned;accepted socket 显式设回 blocking。crates/ain-cluster/src/cluster.rs:Cluster::with_tls,所有 RPC 走wire::call_tls;ain-sched的Coordinator/WorkerConfig同样支持。crates/ain-cluster/examples/gen-certs.rs:rcgen 开发证书。- 测试:
mtls_cell_cluster_round_trip、mtls_flow_scheduler_round_trip(成功、明文拒绝、错误 CA 拒绝)。
23.6 未完成
- 证书热轮换、CRL/OCSP、SPIFFE/工作负载身份。
- 私钥 KMS/HSM 托管。
- TLS 会话恢复/连接池(当前每个 RPC 新建 TLS 连接,开销明显)。
- 审计中记录证书 subject/fingerprint。