
Flower 联邦学习中的 SuperNode 认证实战基于 TLS 与 ECDSA 密钥的 Deployment Engine 安全部署指南【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower导读本指南以 Flower 官方示例supernode-authentication为核心系统讲解如何基于 Flower 的 Deployment Engine部署引擎搭建一个启用身份认证的长运行时联邦学习系统由 SuperLink 充当长期运行的服务端、多个 SuperNode 充当长期运行的客户端通过 TLS 保证通信加密、通过 ECDSA 公私钥对实现客户端SuperNode身份认证最终以 PyTorch CIFAR-10 上的简单 CNN 图像分类任务验证完整流程。读完本文你将掌握证书与密钥的生成原理、Flower 配置文件中 SuperLink 连接的定义方法、SuperNode 的预注册与上线、以及flwr run启动联邦训练 run 的完整命令链路。示例概览与整体架构本示例位于 examples/supernode-authentication其目标是在启用认证的前提下训练一个用于 CIFAR-10 图像分类的简单 CNNPyTorch 实现。整体流程由四个阶段构成项目准备安装 Flower、拉取示例应用并安装依赖凭据生成通过generate_creds.py生成 TLS 证书CA、服务端证书与 SuperNode 认证密钥基础设施启动启动启用了认证的 SuperLink注册并连接多个 SuperNode发起联邦训练通过flwr run .发起一次联邦学习 run。从项目结构看示例的核心代码组织如下与flwr new flwrlabs/supernode-authentication生成的结构一致supernode-authentication ├── authexample │ ├── __init__.py │ ├── client_app.py # 定义 ClientApp训练/评估逻辑 │ ├── server_app.py # 定义 ServerAppFedAvg 聚合策略 │ └── task.py # 定义模型、训练与数据加载 ├── pyproject.toml # 项目元数据、依赖与应用配置 ├── generate_creds.py # 生成证书和密钥 ├── prepare_dataset.py # 为每个 SuperNode 生成数据集分片 └── README.md该示例的 frontmattertags: [advanced, vision, fds]、dataset: [CIFAR-10]、framework: [torch, torchvision]也表明它属于进阶advanced用例涉及视觉任务与 Flower Datasetsfds。项目准备安装 Flower 并拉取示例首先安装 Flower 框架pip install flwr然后通过 Flower CLI 拉取官方示例应用flwr new flwrlabs/supernode-authentication该命令会在当前目录创建一个名为supernode-authentication的新目录内含上文展示的完整项目骨架。从仓库内已有的副本看示例依赖声明于 examples/supernode-authentication/pyproject.tomldependencies [ flwr1.36.0, flwr-datasets[vision]0.6.1, torch2.10.0, torchvision0.25.0, cryptography44.0.1, ]其中cryptography库用于证书与密钥的生成解析flwr-datasets[vision]负责 CIFAR-10 的下载与切分。安装依赖与项目本身进入项目目录后以可编辑模式安装pyproject.toml中声明的全部依赖以及authexample包pip install -e .提示依赖安装完成后Flower 的 ClientApp 与 ServerApp 入口由 pyproject.toml 中的[tool.flwr.app.components]声明分别指向authexample.server_app:app与authexample.client_app:app。生成 TLS 证书与认证密钥generate_creds.py是安全通信与身份认证的凭据生成器它产生两类产物TLS 证书用于建立加密连接CA 自签名证书、由 CA 签发的服务端证书SuperNode 公私钥对用于 SuperNode 的身份认证默认生成 2 对。# 生成证书和密钥默认创建 2 对 SuperNode 密钥 python generate_creds.py # 或指定 SuperNode 密钥对的数量 python generate_creds.py --supernodes {your_number_of_supernodes}[!NOTE] 该脚本仅供开发环境使用不适用于生产部署。证书与密钥的生成原理从 generate_creds.py 源码可以看清凭据生成的具体实现CA 证书使用 RSA 4096 位私钥rsa.generate_private_key(public_exponent65537, key_size4096)生成自签名 CA 证书证书内置BasicConstraints(caTrue)扩展有效期由VALIDITY_DAYS 365控制输出为certificates/ca.key与certificates/ca.crt。服务端证书同样使用 RSA 4096 位私钥由 CA 签名并携带Subject Alternative NameSAN扩展包含SERVER_SAN_DNS [localhost]与SERVER_SAN_IPS [127.0.0.1, ::1]输出为certificates/server.key与certificates/server.pem。SuperNode 认证密钥使用ECDSA P-384 曲线ec.generate_private_key(ec.SECP384R1())以 OpenSSH 格式序列化输出分别生成私钥keys/supernode_credentials_{i}与公钥keys/supernode_credentials_{i}.pub私钥文件权限被设为0600。[!TIP] 证书细节有效期、组织信息、或向SERVER_SAN_IPS添加服务器公网 IP均可通过编辑generate_creds.py顶部的全局变量进行调整。例如要让服务端证书覆盖真实公网 IP取消注释SERVER_SAN_IPS中的xy.xy.xy.xy并填入实际地址即可。在 Flower 框架层面SuperNode 的私钥解析使用cryptography的load_ssh_private_key加载 OpenSSH 格式私钥见 framework/py/flwr/supernode/cli/flower_supernode.py而flwr supernode register命令则通过public_key_to_bytes与uses_nist_ec_curve校验公钥文件是否为 NIST EC 曲线如 P-384公钥见 framework/py/flwr/cli/supernode/register.py——这也是脚本选择 P-384 曲线的根本原因。在 Flower 配置文件中定义 SuperLink 连接Flower CLI 与 SuperLink 的交互如注册 SuperNode、发起 run通过本机的 Flower 配置文件完成。首先定位配置文件flwr config list# 示例输出 Flower Config file: /path/to/your/.flwr/config.toml SuperLink connections: supergrid local (default)创建一个名为my-connection的 SuperLink 连接[superlink.my-connection] address 127.0.0.1:9093 # SuperLink 的 Control API 地址 root-certificates /abs/path/to/certificates/ca.crt其中address指向 SuperLink 的Control API默认 9093 端口root-certificates指向刚生成的 CA 证书绝对路径Flower CLI 将用它校验与 SuperLink 之间的 TLS 连接。将该连接设为默认连接编辑config.toml顶部区域再次执行flwr config list即可看到Flower Config file: /path/to/your/.flwr/config.toml SuperLink connections: supergrid local my-connection (default)此后所有需要连接 SuperLink 的 CLI 命令flwr supernode register、flwr run等都会自动使用该连接。启动长期运行的服务端SuperLink启用 SuperNode 认证非常简单只需为flower-superlink传入--enable-supernode-auth标志。本示例同时启用了 SuperLink、SuperNode 与 Flower CLI 之间的 TLS 加密通信flower-superlink \ --ssl-ca-certfile certificates/ca.crt \ --ssl-certfile certificates/server.pem \ --ssl-keyfile certificates/server.key \ --enable-supernode-auth三个 SSL 参数分别对应 generate_creds.py 生成的 CA 证书、服务端证书与服务端私钥。--enable-supernode-auth会要求所有接入的 SuperNode 提供其身份证明。此时服务端处于空闲等待状态接下来需要连接 SuperNode。准备各 SuperNode 的数据分片[!NOTE] 典型场景下每个 SuperNode 运行在拥有各自数据集的独立机构/组织中。本示例人为创建 N 份数据分片并保存到新建的datasets/目录随后通过--node-config参数将每个 SuperNode 指向其应加载的数据分片。执行以下命令完成 CIFAR-10 的下载、切分与落盘python prepare_dataset.py从 prepare_dataset.py 源码可见其核心逻辑是使用flwr_datasets的FederatedDataset加载uoft-cs/cifar10配合IidPartitioner(num_partitions...)将训练集均匀切分为 N 份每份再以 20% 比例划分出测试集test_size0.2, seed42最终分别保存为datasets/cifar10_part_{i}目录。脚本还支持传入可选位置参数自定义分片数量python prepare_dataset.py 3 # 生成 3 份分片需配合 --supernodes 3 生成 3 对密钥预注册 SuperNode在连接 SuperNode 之前需要先向 SuperLink注册它们。注册的本质是把希望被 SuperLink 授权的 SuperNode 的公钥发送给 SuperLink使 SuperLink 在握手阶段能够识别并信任这些客户端身份。注册第一个 SuperNode发送其公钥flwr supernode register keys/supernode_credentials_1.pub # 输出类似于 # ✅ SuperNode 16019329408659850374 registered successfully.注册第二个 SuperNodeflwr supernode register keys/supernode_credentials_2.pub # 输出类似于 # ✅ SuperNode 8392976743692794070 registered successfully.从框架源码看flwr supernode register通过 Control API 的 gRPC/HTTP 客户端ControlHttpClient发送RegisterNodeRequest并将公钥解析为字节后随请求提交见 framework/py/flwr/cli/supernode/register.py。注册成功后会返回一个全局唯一的 Node ID上例中的大整数。也可以随时用 Flower CLI 查看 SuperNode 状态flwr supernode list Listing all nodes... ┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Node ID ┃ Owner ┃ Status ┃ Elapsed ┃ Status Changed ┃ ┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩ │ 16019329408659850374 │ none │ created │ │ N/A │ ├──────────────────────┼────────────┼─────────┼──────────┼──────────────────────┤ │ 8392976743692794070 │ none │ created │ │ N/A │ └──────────────────────┴────────────┴─────────┴──────────┴──────────────────────┘刚注册的节点状态为created已登记但尚未上线SuperNode 真正连接后状态会变为online。连接 SuperNode启动长期运行的客户端启动第一个 SuperNode在一个新的终端窗口中启动第一个长期运行的 Flower 客户端flower-supernode \ --root-certificates certificates/ca.crt \ --auth-supernode-private-key keys/supernode_credentials_1 \ --superlink 127.0.0.1:9092 \ --node-config dataset-pathdatasets/cifar10_part_1 \ --host 127.0.0.1 \ --port 9094启动第二个 SuperNode在另一个新的终端窗口中启动第二个长期运行的 Flower 客户端flower-supernode \ --root-certificates certificates/ca.crt \ --auth-supernode-private-key keys/supernode_credentials_2 \ --superlink 127.0.0.1:9092 \ --node-config dataset-pathdatasets/cifar10_part_2 \ --host 127.0.0.1 \ --port 9095关键参数说明参数作用--root-certificatesSuperNode 用于校验 SuperLink 身份的 CA 证书--auth-supernode-private-key该 SuperNode 的 ECDSA 私钥用于向 SuperLink 证明身份--superlinkSuperLink 的Fleet API地址9092 端口区别于 Control API 的 9093--node-config以键值对形式注入该节点专属配置此处指向该节点应加载的数据分片--host/--port该 SuperNode 自身监听的地址与端口两个 SuperNode 连接成功后再次执行flwr supernode list可以看到状态已变为online并带有在线时长与状态变更时间flwr supernode list Listing all nodes... ┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Node ID ┃ Owner ┃ Status ┃ Elapsed ┃ Status Changed ┃ ┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩ │ 16019329408659850374 │ none │ online │ 00:00:30 │ 2025-10-13 13:40:47Z │ ├──────────────────────┼────────────┼─────────┼──────────┼──────────────────────┤ │ 8392976743692794070 │ none │ online │ 00:00:22 │ 2025-10-13 13:52:21Z │ └──────────────────────┴────────────┴─────────┴──────────┴──────────────────────┘如果当初用--supernodes生成了多于 2 对的客户端凭据可继续打开新的终端窗口重复上述命令添加更多客户端只需为每个 SuperNode 指定正确的私有密钥文件即可。--node-config如何传递给 ClientApp[!TIP] 启动 SuperNode 时传入的--node-config可以通过context参数在 ClientApp 中读取即context.node_config。本示例中 ClientApp 正是利用它定位数据集后开始训练app.train() def train(msg: Message, context: Context): # 从 node_config 读取数据集位置 dataset_path context.node_config[dataset-path] # 然后加载数据集并训练对应地authexample/client_app.py 中正是通过context.node_config[dataset-path]读取datasets/cifar10_part_*路径再结合context.run_config中来自 pyproject.toml 的超参数local-epochs、learning-rate、batch-size完成本地训练与评估。此外ClientApp 通过context.run_config读取运行配置通过msg.content[arrays].to_torch_state_dict()反序列化服务器下发的模型参数ArrayRecord并以Message(content..., reply_tomsg)的形式将RecordDict包含ArrayRecord模型权重与MetricRecord指标返回给服务器。运行 Flower App发起联邦训练SuperLink 与两个 SuperNode 都已在线后即可发起 run。flwr run .会在当前目录读取 pyproject.toml 中的应用定义与配置并通过默认的my-connection连接将 ServerApp 调度到 SuperLink 上执行flwr run . --stream--stream为可选标志用于将运行在 SuperLink 上的 ServerApp 日志实时流式输出到本地终端。run 的默认超参数由 pyproject.toml 的[tool.flwr.app.config]定义num-server-rounds 3 fraction-evaluate 0.5 local-epochs 1 learning-rate 0.1 batch-size 32即默认执行 3 轮联邦聚合、每轮对 50% 的参与节点做评估、每个客户端本地训练 1 个 epoch、学习率 0.1、批大小 32。这些值可通过flwr run的命令行参数覆盖。服务端与客户端的实现细节ServerAppauthexample/server_app.py从context.run_config读取num-server-rounds与fraction-evaluate初始化一个Net()的全局模型权重ArrayRecord构造FedAvg策略并调用strategy.start(gridgrid, initial_arraysarrays, num_roundsnum_rounds)执行聚合训练结束后将最终模型权重保存为final_model.pt。模型与训练逻辑authexample/task.py采用经典的 LeNet 风格 CNN两个Conv2d卷积层 两个MaxPool2d池化层 三个全连接层输出 10 类数据加载使用 Hugging Facedatasets的load_from_disk读取磁盘上的分片应用ToTensor与Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))变换后构造DataLoader训练使用CrossEntropyLoss与带动量 0.9 的 SGD。安全机制小结三层防护如何协同将本示例的完整链路放在一起可以看到 Flower Deployment Engine 下的安全体系由三层构成传输层加密TLSSuperLink 通过--ssl-ca-certfile、--ssl-certfile、--ssl-keyfile提供加密端点SuperNode 与 Flower CLI 各自通过--root-certificates/root-certificates校验服务端身份防止中间人攻击。节点身份认证SuperNode Authenticationgenerate_creds.py生成 ECDSA P-384 公私钥对公钥通过flwr supernode register预注册到 SuperLink私钥由 SuperNode 在连接时出示SuperLink 据此授权接入。--enable-supernode-auth是服务端开启该机制的开关。运行级隔离node_config 注入每个 SuperNode 通过--node-config只暴露自己负责的数据分片ClientApp 通过context.node_config读取实现数据不出参与方本地。这种长期运行的 SuperLink 认证 SuperNode 按需发起的 run模式正是 Flower 联邦学习在生产环境中以跨机构方式协作的标准形态也是本示例在 examples/supernode-authentication 目录中想要演示的核心能力。【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考