适用于: IoT Edge 1.1
重要
IoT Edge 1.1 终止支持日期为 2022 年 12 月 13 日。 有关此产品、服务、技术或 API 支持方式的信息,请查看 Microsoft产品生命周期 。 有关更新到最新版本的 IoT Edge 的详细信息,请参阅 更新 IoT Edge。
本文提供有关使用 X.509 证书自动预配一个或多个 Linux IoT Edge 设备的详尽说明。 可以使用 Azure IoT 中心设备预配服务 (DPS)自动预配 Azure IoT Edge 设备。 如果不熟悉自动预配过程,请在继续之前查看 预配概述 。
任务如下:
- 生成证书和密钥。
- 为单个设备创建单个注册,或为一组设备创建组注册。
- 安装 IoT Edge 运行时并将设备注册到 IoT 中心。
将 X.509 证书用作一种证明机制是扩大生产规模和简化设备设置的极佳途径。 X.509 证书通常排列在证书信任链中。 从自签名证书或受信任的根证书开始,证书链中的每个证书为下一级证书签名。 此模式创建了从设备上安装的根证书到每个中间证书,再到最终的下游设备证书的委托信任链。
小提示
如果你的设备具有硬件安全模块 (HSM),例如 TPM 2.0,那么我们建议将 X.509 密钥安全地存储在 HSM 中。 详细了解如何使用 iotedge-tpm2cloud 示例实现此蓝图中描述的大规模零接触预配。
先决条件
云资源
- 一个活动的 IoT 中心
- 在 Azure 中,一个与您的 IoT 中心链接的 IoT 中心设备预配服务实例
- 如果您没有设备预配服务实例,可以按照 IoT 中心设备预配服务快速入门中的 创建新的 IoT 中心设备预配服务 和 链接 IoT 中心和设备预配服务 部分的说明进行操作。
- 运行设备预配服务后,从概述页复制“ID 范围”的值。 配置 IoT Edge 运行时时,需要使用此值。
设备要求
一个充当 IoT Edge 设备的物理设备或虚拟 Linux 设备。
生成设备标识证书
设备标识证书是通过证书信任链连接到顶级 X.509 证书颁发机构 (CA) 证书的下游设备证书。 设备标识证书的公用名 (CN) 必须设置为你希望该设备在 IoT 中心内使用的设备 ID。
设备标识证书仅用于预配 IoT Edge 设备,以及通过 Azure IoT 中心对设备进行身份验证。 设备标识证书不是签名证书,这与 CA 证书不同,后者是 IoT Edge 设备向模块或下游设备提供的用于验证的证书。 有关详细信息,请参阅 Azure IoT Edge 证书使用情况详细信息。
创建设备标识证书后,应会获得两个文件:一个包含证书公共部分的 .cer 或 .pem 文件,一个包含证书私钥的 .cer 或 .pem 文件。 如果你打算在 DPS 中使用组注册,则还需要提供同一证书信任链中某个中间证书或根 CA 证书的公共部分。
若要使用 X.509 设置自动预配,需要以下文件:
- 设备标识证书及其私钥证书。 如果创建单个注册,则设备标识证书会上传到 DPS。 私钥会传递到 IoT Edge 运行时。
- 完整链证书,其中应至少包含设备标识和中间证书。 完整链证书会传递到 IoT Edge 运行时。
- 证书信任链中的中间或根 CA 证书。 如果创建组注册,则此证书会上传到 DPS。
注释
目前 libiothsm 存在一个限制,无法使用在 2038 年 1 月 1 日或之后到期的证书。
使用测试证书(可选)
如果你没有可用于创建新标识证书的证书颁发机构,但想要尝试此方案,可以使用 Azure IoT Edge Git 存储库中包含的脚本来生成测试证书。 这些证书仅用于开发测试,不得在生产环境中使用。
若要创建测试证书,请按照 “创建演示证书”中的步骤测试 IoT Edge 设备功能。 请完成其中的两个必要部分来设置证书生成脚本,并创建根 CA 证书。 然后,遵循相应的步骤创建设备标识证书。 完成后,应会获得以下证书链和密钥对:
<WRKDIR>/certs/iot-edge-device-identity-<name>-full-chain.cert.pem
<WRKDIR>/private/iot-edge-device-identity-<name>.key.pem
需要在 IoT Edge 设备上使用这两个证书。 如果要在 DPS 中使用单个注册,则将上传 .cert.pem 文件。 若要在 DPS 中使用组注册,则还需要上传同一证书信任链中的某个中间证书或根 CA 证书。 如果使用演示证书,请将 <WRKDIR>/certs/azure-iot-test-only.root.ca.cert.pem
证书用于组注册。
创建 DPS 注册
使用生成的证书和密钥在 DPS 中为一个或多个 IoT Edge 设备创建注册。
如果要预配单个 IoT Edge 设备,请创建一个独立注册。 如果需要预配多个设备,请按照创建 DPS 组注册的步骤进行操作。
在 DPS 中创建注册时,可以声明“初始设备孪生状态”。 在设备孪生中可以设置标记,以便按解决方案中所需的任何指标(例如区域、环境、位置或设备类型)将设备分组。 这些标记用于创建 自动部署。
有关设备预配服务中的注册的详细信息,请参阅 如何管理设备注册。
创建 DPS 个人注册
单独注册采用设备标识证书的公共部分,并将其与设备上的证书进行匹配。
小提示
本文中的步骤适用于 Azure 门户,但你也可使用 Azure CLI 创建单个注册。 有关详细信息,请参阅 az iot dps enrollment。 作为 CLI 命令的一部分,使用 edge-enabled 标志指定注册适用于单个 IoT Edge设备。
在 Azure 门户中,导航到您的 IoT 中心设备预配服务实例。
在“设置”下,选择“管理注册”。
选择“添加个人注册”,然后完成以下步骤以配置注册:
机制:选择 X.509。
主证书 .pem 或.cer文件:从设备标识证书上传公共文件。 如果使用脚本生成了测试证书,请选择以下文件:
<WRKDIR>\certs\iot-edge-device-identity-<name>.cert.pem
IoT 中心设备 ID:根据需要为设备提供 ID。 可以使用设备 ID 将单个设备指定为模块部署的目标。 如果未提供设备 ID,将使用 X.509 证书中的公用名 (CN)。
IoT Edge 设备:选择 True 以声明注册适用于 IoT Edge 设备。
选择给此设备可分配的 IoT 中心:选择您要连接设备的已链接 IoT 中心。 可以选择多个中心,设备将根据所选的分配策略分配到其中的一个中心。
初始设备孪生状态:如果您需要,可以在设备孪生上添加一个标签值。 可以使用标记将设备组指定为自动部署的目标。 例如:
{ "tags": { "environment": "test" }, "properties": { "desired": {} } }
选择“ 保存”。
在“管理注册”页面中,您可以查看刚创建注册的“注册 ID”。 请将其记下,因为配置设备时可能会用到它。
既然此设备已存在注册,IoT Edge 运行时在安装期间可以自动预配设备。
安装 IoT Edge
在本部分中,为 IoT Edge 准备 Linux VM 或物理设备。 然后安装 IoT Edge。
运行以下命令以添加包存储库,然后将 Microsoft 包签名密钥添加到你的受信任密钥列表中。
重要
2022 年 6 月 30 日,Raspberry Pi OS Stretch 将在第 1 层 OS 支持列表中停用。 为避免潜在的安全漏洞,请将主机 OS 更新为 Bullseye。
安装可通过几个命令来完成。 打开终端并运行以下命令:
20.04:
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
18.04:
wget https://packages.microsoft.com/config/ubuntu/18.04/multiarch/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
注释
Azure IoT Edge 软件包受制于每个包(usr/share/doc/{package-name}
或 LICENSE
目录)中的许可条款。 请在使用包之前阅读许可条款。 安装和使用包即表示你接受这些条款。 如果你不同意许可条款,请不要使用该包。
安装容器引擎
Azure IoT Edge依赖于与 OCI 兼容的容器运行时。 对于生产方案,建议使用 Moby 引擎。 Moby 引擎是 IoT Edge 正式支持的唯一容器引擎。 Docker CE/EE 容器映像与 Moby 运行时兼容。
安装 Moby 引擎。
sudo apt-get update; \
sudo apt-get install moby-engine
成功安装 Moby 引擎后,将其配置为使用 local
日志记录驱动程序作为日志记录 机制。 若要了解有关日志记录配置的详细信息,请参阅 生产部署清单。
在
/etc/docker/daemon.json
创建或打开 Docker 守护程序的配置文件。将默认日志记录驱动程序设置为
local
日志记录驱动程序,如以下示例所示。{ "log-driver": "local" }
重启容器引擎以使更改生效。
sudo systemctl restart docker
小提示
如果在安装 Moby 容器引擎时出现错误,请验证 Linux 内核的 Moby 兼容性。 有些嵌入式设备制造商发布的设备映像包含的自定义 Linux 内核没有支持容器引擎兼容性所需要的功能。 运行以下命令,该命令使用 Moby 提供的 check-config 脚本 来检查内核配置:
curl -ssl https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh -o check-config.sh chmod +x check-config.sh ./check-config.sh
在该脚本的输出中,检查
Generally Necessary
和Network Drivers
下的所有项是否都已启用。 如果缺少某些功能,请启用它们,方法是通过源重新构建内核,然后选择关联的模块,将其包括在相应的内核 .config 中。同样,如果使用内核配置生成器(例如defconfig
或menuconfig
),请找到并启用相应的功能,然后以相应方式重新构建内核。 部署新修改的内核后,再次运行 check-config 脚本,验证是否已成功启用所有必要的功能。
安装 IoT Edge 运行时
IoT Edge 安全守护程序在 IoT Edge 设备上提供和维护安全标准。 守护程序在每次启动时启动,并通过启动 IoT Edge 运行时的其余部分来初始化设备。
本部分中的步骤表示在具有 Internet 连接的设备上安装最新版本的典型过程。 如果需要安装特定版本(如预发行版本)或在脱机时需要安装,请按照本文后面的 脱机或特定版本安装 步骤作。
安装 IoT Edge 版本 1.1.* 以及 libiothsm-std 包:
sudo apt-get update; \
sudo apt-get install iotedge
注释
IoT Edge 版本 1.1 是 IoT Edge 的长期支持分支。 如果运行的是较旧版本,建议安装或更新到最新修补程序,因为不再支持旧版本。
为设备预配其云标识
在设备上安装运行时后,请使用供设备用来连接到设备预配服务和 IoT 中心的信息来配置该设备。
准备好以下信息:
- DPS 的“ID 范围”值。 可以从 Azure 门户中 DPS 实例的概述页检索此值。
- 设备上的设备标识证书链文件。
- 设备上的设备标识密钥文件。
在 IoT Edge 设备上打开配置文件。
sudo nano /etc/iotedge/config.yaml
找到该文件的预配配置部分。 取消注释用于DPS X.509证书预配的行,并确保将所有其他预配的行注释掉。
provisioning:
行不应有前面的空格,嵌套项应缩进两个空格。# DPS X.509 provisioning configuration provisioning: source: "dps" global_endpoint: "https://global.azure-devices-provisioning.net" scope_id: "SCOPE_ID_HERE" attestation: method: "x509" # registration_id: "OPTIONAL_REGISTRATION_ID_LEAVE_COMMENTED_OUT_TO_REGISTER_WITH_CN_OF_IDENTITY_CERT" identity_cert: "REQUIRED_URI_TO_DEVICE_IDENTITY_CERTIFICATE_HERE" identity_pk: "REQUIRED_URI_TO_DEVICE_IDENTITY_PRIVATE_KEY_HERE" # always_reprovision_on_startup: true # dynamic_reprovisioning: false
将
scope_id
、identity_cert
和identity_pk
的值更新为你的 DPS 和设备信息。将 X.509 证书和密钥信息添加到 config.yaml 文件时,路径应作为文件 URI 提供。 例如:
file:///<path>/identity_certificate_chain.pem
file:///<path>/identity_key.pem
可选择为设备提供
registration_id
,该值需要与标识证书的公用名(CN)匹配。 如果将该行注释掉,则将自动应用 CN。(可选)使用
always_reprovision_on_startup
或dynamic_reprovisioning
行配置设备的重新预配行为。 如果设备设置为在启动时重新配置,它将始终首先尝试使用 DPS 进行配置,然后在失败时回退到备用配置。 如果设备设置为动态重新预配自身,则检测到重新预配事件时,IoT Edge(和所有模块)将重启并重新预配,就像设备从一个 IoT 中心移动到另一个 IoT 中心一样。 具体来说,IoT Edge 会检查 SDK 中的bad_credential
或device_disabled
错误,以识别重新预配事件。 若要手动触发此事件,请在 IoT 中心禁用设备。 有关详细信息,请参阅 IoT 中心设备重新预配概念。保存并关闭 config.yaml 文件。
重启 IoT Edge 运行环境,以便应用在设备上所做的所有配置更改。
sudo systemctl restart iotedge
验证是否成功安装
如果运行时成功启动,则可以进入 IoT 中心,开始将 IoT Edge 模块部署到你的设备。
您可以验证您在设备预配服务中创建的单个注册是否已被使用。 在 Azure 门户中导航到你的设备预配服务实例。 打开您创建的个人注册详细信息。 请注意,注册状态为“已分配”,并且设备 ID 已列出。
在设备上使用以下命令验证是否已成功安装并启动 IoT Edge。
检查 IoT Edge 服务的状态。
systemctl status iotedge
检查服务日志。
journalctl -u iotedge --no-pager --no-full
列出正在运行的模块。
iotedge list
后续步骤
使用设备预配服务注册过程可以在预配新设备的同时,设置设备 ID 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。 了解如何使用 Azure 门户或使用 Azure CLI 大规模部署和监视 IoT Edge 模块。