ΓDocsInteractiveNet

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。

在 GitHub 编辑本文