使用对称密钥证明创建和预配 IoT Edge 设备

适用于: “是”图标 IoT Edge 1.1 其他版本: IoT Edge 1.2

适用于: “是”图标 IoT Edge 1.2 其他版本: IoT Edge 1.1

可以使用设备预配服务自动预配 Azure IoT Edge 设备,就像预配未启用 Edge 的设备一样。 如果你不熟悉自动预配过程,请在继续操作之前查看预配概述。

本文介绍如何通过以下步骤,在 IoT Edge 设备上使用对称密钥证明创建设备预配服务的个人或组注册:

  • 创建 IoT 中心设备预配服务 (DPS) 的实例。
  • 创建个人注册或组注册。
  • 安装 IoT Edge 运行时并连接到 IoT 中心。

提示

为了简单起见,请尝试使用 Azure IoT Edge 配置工具。 此命令行工具目前以公共预览版提供,可在设备上安装 IoT Edge,并使用 DPS 和对称密钥证明来预配它。

对称密钥证明是一种通过设备预配服务实例对设备进行身份验证的简单方法。 此证明方法表示不熟悉设备预配或不具备严格安全要求的开发人员的“Hello world”体验。 使用 TPMX.509 证书的设备证明更加安全,且应该用于更严格的安全要求。

先决条件

  • 一个有效的 IoT 中心
  • 一个物理设备或虚拟设备

设置 IoT 中心设备预配服务

在 Azure 中创建 IoT 中心设备预配服务的新实例,并将其链接到 IoT 中心。 可以遵照设置 IoT 中心 DPS 中的说明操作。

运行设备预配服务后,从概述页复制“ID 范围”的值。 配置 IoT Edge 运行时时,需要使用此值。

选择唯一设备注册 ID

必须定义唯一注册 ID 来标识每个设备。 可以使用 MAC 地址、序列号或设备中的任何唯一信息。 例如,可以使用 MAC 地址和序列号的组合,构成以下注册 ID 字符串:sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6。 有效字符为小写字母数字和短划线 (-)。

选项 1:创建 DPS 个人注册

创建个人注册,通过 DPS 预配单个设备。

在 DPS 中创建注册时,可以声明“初始设备孪生状态”。 在设备孪生中可以设置标记,以便按解决方案中所需的任何指标(例如区域、环境、位置或设备类型)将设备分组。 这些标记用于创建自动部署

提示

本文中的步骤适用于Azure 门户,但你也可使用 Azure CLI 创建个人注册。 作为 CLI 命令的一部分,使用 edge-enabled 标志指定注册适用于单个 IoT Edge设备。

  1. Azure 门户中,导航到 IoT 中心设备预配服务的实例。

  2. 在“设置”下,选择“管理注册”。

  3. 选择“添加个人注册”,然后完成以下步骤以配置注册:

    1. 对于“机制”,请选择“对称密钥”。

    2. 为设备提供一个唯一的注册 ID。

    3. (可选)为设备提供一个 IoT 中心设备 ID。 可以使用设备 ID 将单个设备指定为模块部署的目标。 如果未提供设备 ID,则会使用注册 ID。

    4. 选择“True”,声明该注册适用于 IoT Edge 设备。

    5. (可选)向“初始设备孪生状态”添加一个标记值。 可以使用标记将设备组指定为模块部署的目标。 例如:

      {
         "tags": {
            "environment": "test"
         },
         "properties": {
            "desired": {}
         }
      }
      
    6. 选择“保存” 。

  4. 复制个人注册的“主密钥”值,以便在安装 IoT Edge 运行时的情况下使用。

既然此设备已存在注册,IoT Edge 运行时在安装期间可以自动预配设备。

选项 2:创建 DPS 注册组

使用设备的注册 ID 在 DPS 中创建单个注册。

在 DPS 中创建注册时,可以声明“初始设备孪生状态”。 在设备孪生中可以设置标记,以便按解决方案中所需的任何指标(例如区域、环境、位置或设备类型)将设备分组。 这些标记用于创建自动部署

提示

本文中的步骤适用于Azure 门户,但你也可使用 Azure CLI 创建个人注册。 作为 CLI 命令的一部分,使用 edge-enabled 标志指定注册适用于一组 IoT Edge设备。 对于组注册,所有设备必须是 IoT Edge 设备,或者都不是 IoT Edge 设备。

  1. Azure 门户中,导航到 IoT 中心设备预配服务的实例。

  2. 在“设置”下,选择“管理注册”。

  3. 选择“添加个人注册”,然后完成以下步骤以配置注册:

    1. 提供组名称。

    2. 选择“对称密钥”作为证明类型。

    3. 选择“True”,声明该注册适用于 IoT Edge 设备。 对于组注册,所有设备必须是 IoT Edge 设备,或者都不是 IoT Edge 设备。

    4. (可选)向“初始设备孪生状态”添加一个标记值。 可以使用标记将设备组指定为模块部署的目标。 例如:

      {
         "tags": {
            "environment": "test"
         },
         "properties": {
            "desired": {}
         }
      }
      
    5. 选择“保存” 。

  4. 复制注册组的“主密钥”值,以便在创建用于组注册的设备密钥时使用。

现在注册组已经存在,IoT Edge 运行时在安装期间可以自动预配设备。

派生一个设备密钥

在组注册过程中预配的每个设备都需要一个派生的设备密钥,用于在预配期间向注册执行对称密钥证明。

若要生成设备密钥,请使用从 DPS 注册组复制的密钥来计算设备的唯一注册 ID 的 HMAC-SHA256,并将结果转换为 Base64 格式。

不要在设备代码中包含注册的主密钥或辅助密钥。

在 Linux 上派生密钥

在 Linux 上,可以使用 openssl 生成派生的设备密钥,如以下示例中所示。

将“键” 值替换为前面记录的“主键” 。

请将 REG_ID 值替换为设备的注册 ID。

KEY=PASTE_YOUR_ENROLLMENT_KEY_HERE
REG_ID=PASTE_YOUR_REGISTRATION_ID_HERE

keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc=

在 Windows 上派生密钥

在 Windows 上,可以使用 PowerShell 生成派生的设备密钥,如以下示例中所示。

将“键” 值替换为前面记录的“主键” 。

请将 REG_ID 值替换为设备的注册 ID。

$KEY='PASTE_YOUR_ENROLLMENT_KEY_HERE'
$REG_ID='PASTE_YOUR_REGISTRATION_ID_HERE'

$hmacsha256 = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha256.key = [Convert]::FromBase64String($KEY)
$sig = $hmacsha256.ComputeHash([Text.Encoding]::ASCII.GetBytes($REG_ID))
$derivedkey = [Convert]::ToBase64String($sig)
echo "`n$derivedkey`n"
Jsm0lyGpjaVYVP2g3FnmnmG9dI/9qU24wNoykUmermc=

安装 IoT Edge 运行时

IoT Edge 运行时部署在所有 IoT Edge 设备上。 该运行时的组件在容器中运行,允许你将其他容器部署到设备,以便在边缘上运行代码。

根据你的操作系统,按照相应步骤安装 Azure IoT Edge:

在设备上安装 IoT Edge 后,请返回到本文来预配此设备。

按照安装 Azure IoT Edge 运行时中的步骤操作,然后返回到本文来预配设备。

用预配信息配置设备

在设备上安装运行时后,请借助它用于连接到设备预配服务和 IoT 中心的信息来配置设备。

准备好以下信息:

  • DPS 的“ID 范围”值
  • 为设备创建的“注册 ID”
  • 个人注册的主密钥,或者使用组注册时设备的派生密钥。
  1. 在 IoT Edge 设备上打开配置文件。

    sudo nano /etc/iotedge/config.yaml
    
  2. 找到该文件的预配配置部分。 取消注释 DPS 对称密钥预配的行,并确保注释掉任何其他预配行。

    provisioning: 行前面应无空格,并且嵌套项应该缩进两个空格。

    # DPS TPM provisioning configuration
    provisioning:
      source: "dps"
      global_endpoint: "https://global.azure-devices-provisioning.net"
      scope_id: "PASTE_YOUR_SCOPE_ID_HERE"
      attestation:
        method: "symmetric_key"
        registration_id: "PASTE_YOUR_REGISTRATION_ID_HERE"
        symmetric_key: "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE"
    # always_reprovision_on_startup: true
    # dynamic_reprovisioning: false
    
  3. scope_idregistration_idsymmetric_key 的值更新为你的 DPS 和设备信息。

  4. (可选)使用 always_reprovision_on_startupdynamic_reprovisioning 行来配置设备的重新预配行为。 如果设备设置为在启动时重新预配,它将始终尝试先使用 DPS 进行预配,如果失败,则回退到预配备份。 如果设备设置为动态重新预配自身,则 IoT Edge 将重启,并在检测到重新预配事件时重新预配。 有关详细信息,请参阅 IoT 中心设备重新预配概念

  5. 重启 IoT Edge 运行时,使之拾取你在设备上所做的所有配置更改。

    sudo systemctl restart iotedge
    
  1. 基于在安装 IoT Edge 的过程中提供的模板文件为你的设备创建配置文件。

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    
  2. 在 IoT Edge 设备上打开配置文件。

    sudo nano /etc/aziot/config.toml
    
  3. 找到文件的 Provisioning 节。 取消注释 DPS 对称密钥预配的行,并确保注释掉任何其他预配行。

    # DPS provisioning with symmetric key
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "PASTE_YOUR_SCOPE_ID_HERE"
    
    [provisioning.attestation]
    method = "symmetric_key"
    registration_id = "PASTE_YOUR_REGISTRATION_ID_HERE"
    
    symmetric_key = "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE"
    
  4. id_scoperegistration_idsymmetric_key 的值更新为你的 DPS 和设备信息。

    对称密钥参数可以接受内联密钥、文件 URI 或 PKCS#11 URI 的值。 根据所使用的格式,取消注释一条对称密钥行。

    如果使用任何 PKCS#11 URI,请在配置文件中找到 PKCS#11 节,并提供有关 PKCS#11 配置的信息。

  5. 保存并关闭 config.toml 文件。

  6. 应用对 IoT Edge 所做的配置更改。

    sudo iotedge config apply
    

验证是否成功安装

如果运行时成功启动,则可以进入 IoT 中心,开始将 IoT Edge 模块部署到你的设备。

可以验证是否使用了在设备预配服务中创建的个人注册。 在 Azure 门户中导航到设备预配服务实例。 打开创建的个人注册的注册详细信息。 注意注册状态是否为“已分配”并且设备 ID 已列出。

在设备上,使用以下命令验证是否已成功安装并启动 IoT Edge。

检查 IoT Edge 服务的状态。

systemctl status iotedge

检查服务日志。

journalctl -u iotedge --no-pager --no-full

列出正在运行的模块。

iotedge list

检查 IoT Edge 服务的状态。

sudo iotedge system status

检查服务日志。

sudo iotedge system logs

列出正在运行的模块。

sudo iotedge list

后续步骤

使用设备预配服务注册过程可以在预配新设备的同时,设置设备 ID 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。 了解如何使用 Azure 门户大规模部署和监视 IoT Edge 模块,或使用 Azure CLI 执行此操作。