使用 X.509 证书创建和预配 IoT Edge for Linux on Windows 设备

适用于:IoT Edge 1.4 复选标记 IoT Edge 1.4

本文提供了有关注册和预配 IoT Edge for Linux on Windows 设备的端到端说明。

连接到 IoT 中心的每个设备都有一个设备 ID,用于跟踪云到设备或设备到云的通信。 可以使用设备连接信息来配置设备,这些信息包括 IoT 中心主机名、设备 ID 以及设备用于向 IoT 中心进行身份验证的信息。

本文中的步骤演示了一个名为“手动预配”的过程。在手动预配过程中,你可以将单个设备连接到其 IoT 中心。 对于手动预配,可以通过两种方式来验证 IoT Edge 设备:

  • 对称密钥:你在 IoT 中心创建新设备标识时,服务将创建两个密钥。 将其中一个密钥置于设备上,并在进行身份验证时将该密钥提供给 IoT 中心。

    此身份验证方法更容易上手,但不够安全。

  • X.509 自签名:创建两个 X.509 标识证书并将其置于设备上。 在 IoT 中心创建新的设备标识时,需要提供两个证书的指纹。 设备在向 IoT 中心进行身份验证时会提供一个证书,IoT 中心会验证该证书是否与其指纹匹配。

    此身份验证方法更加安全,建议用于生产方案。

本文介绍如何使用 X.509 证书作为身份验证方法。 如果要使用对称密钥,请参阅使用对称密钥创建和预配 IoT Edge for Linux on Windows 设备

注意

如果要设置多个设备,并且不想手动预配每个设备,请参阅以下文章之一来了解 IoT Edge 如何与 IoT 中心设备预配服务配合工作:

先决条件

本文介绍如何注册 IoT Edge 设备并安装 IoT Edge for Linux on Windows。 这些任务具有不同的先决条件和用于完成这些任务的实用程序。 在继续操作之前,请确保已满足所有先决条件。

设备管理工具

你可以使用 Azure 门户、Visual Studio Code 或 Azure CLI 来完成注册设备的步骤。 每个实用工具都有自身的先决条件,或者可能需要完成安装:

Azure 订阅中的免费或标准 IoT 中心

设备要求

具有以下最低要求的 Windows 设备:

  • 系统要求

    • Windows 101/11(专业版、企业版、IoT Enterprise)
    • Windows Server 20191/2022
      1 Windows 10 和 Windows Server 2019 最低内部版本 17763,并且安装了所有当前累积更新。
  • 硬件要求

    • 最小可用内存:1 GB
    • 最小可用磁盘空间:10 GB
  • 虚拟化支持

  • 网络支持

    • Windows Server 未附带默认交换机。 需要创建一个虚拟交换机,然后才能将 EFLOW 部署到 Windows Server 设备。
    • Windows 桌面版本附带了可用于 EFLOW 安装的默认交换机。 如果需要,可以创建自己的自定义虚拟交换机。

提示

如果要在 Azure IoT Edge for Linux on Windows 部署中使用 GPU 加速的 Linux 模块,则需要考虑多个配置选项。

需要根据 GPU 体系结构安装正确的驱动程序,并且可能需要访问 Windows 预览体验计划内部版本。 若要确定配置需求并满足这些先决条件,请参阅 适用于 Azure IoT Edge for Linux on Windows 的 GPU 加速

现在务必要花点时间来满足 GPU 加速的先决条件。 如果在安装过程中决定要进行 GPU 加速,则需要重新启动安装过程。

开发人员工具

准备目标设备,以便安装 Azure IoT Edge for Linux on Windows 并部署 Linux 虚拟机:

  1. 在目标设备上将执行策略设置为 AllSigned。 可以在已提升权限的 PowerShell 提示符下使用以下命令检查当前执行策略:

    Get-ExecutionPolicy -List
    

    如果 local machine 的执行策略不是 AllSigned,则可以使用以下命令设置执行策略:

    Set-ExecutionPolicy -ExecutionPolicy AllSigned -Force
    

若要详细了解 Azure IoT Edge for Linux on Windows PowerShell 模块,请参阅 PowerShell 函数参考

生成设备标识证书

使用 X.509 证书进行手动预配需要 IoT Edge 1.0.10 或更高版本。

在使用 X.509 证书预配 IoT Edge 设备时,你将使用所谓的设备标识证书。 此证书仅用于预配 IoT Edge 设备,以及通过 Azure IoT 中心对设备进行身份验证。 它是不能对其他证书进行签名的叶证书。 设备标识证书不同于 IoT Edge 设备提供给模块或下游设备进行验证的证书颁发机构 (CA) 证书。

对于 X.509 证书身份验证,每个设备的身份验证信息采用从设备标识证书获取的指纹的形式提供。 在注册设备时,会向 IoT 中心提供这些指纹,以便服务在连接时能够识别设备。

若要详细了解如何在 IoT Edge 设备中使用 CA 证书,请参阅了解 Azure IoT Edge 如何使用证书

若要使用 X.509 进行手动预配,需要以下文件:

  • 两个设备标识证书及其 .cer 或 .pem 格式的匹配私钥证书。 需要两个设备标识证书才能轮换证书。 最佳做法是准备两个不同的设备标识证书,它们的过期日期不同。 如果其中一个证书过期,另一个证书仍然有效,让你有时间轮换已过期的证书。

    其中一组证书和密钥文件提供给 IoT Edge 运行时。 创建设备标识证书时,请将证书公用名 (CN) 设置为你希望该设备在 IoT 中心具有的设备 ID。

  • 从两个设备标识证书获取的指纹。 IoT 中心在注册 IoT Edge 设备时需要两个指纹。 只能使用一个证书进行注册。 若要使用单个证书,请在注册设备时为主要和次要指纹设置相同的证书指纹。

    SHA-1 哈希的指纹值为 40 个十六进制字符,SHA-256 哈希的指纹值为 64 个十六进制字符。 在注册设备时,两个指纹都将提供给 IoT 中心。

    从证书中检索指纹的一种方法是使用以下 openssl 命令:

    openssl x509 -in <certificate filename>.pem -text -fingerprint
    

    指纹包含在此命令的输出中。 例如:

    SHA1 Fingerprint=D2:68:D9:04:9F:1A:4D:6A:FD:84:77:68:7B:C6:33:C0:32:37:51:12
    

如果没有可用的证书,可以创建演示证书以测试 IoT Edge 设备功能。 按照该文章中的说明设置证书创建脚本、创建根 CA 证书,然后创建一个 IoT Edge 设备标识证书。 若要进行测试,可以创建单个设备标识证书,并在 IoT 中心注册设备时对主要和辅助指纹值使用相同的指纹。

注册设备

根据你的偏好,你可以使用 Azure 门户、Visual Studio Code 或 Azure CLI 来注册设备。

在 Azure 门户中的 IoT 中心内,IoT Edge 设备的创建和管理独立于不支持边缘的 IoT 设备。

  1. 登录 Azure 门户,导航到 IoT 中心。

  2. 在左侧窗格中,从菜单中选择“设备”,然后选择“添加设备”。

  3. 在“创建设备”页面上,提供以下信息:

    • 创建描述性设备 ID。 记下此设备 ID,因为稍后会用到它。
    • 选中“IoT Edge 设备”复选框。
    • 选择“X.509 自签名”作为身份验证类型。
    • 提供主要和辅助标识证书指纹。 SHA-1 哈希的指纹值为 40 个十六进制字符,SHA-256 哈希的指纹值为 64 个十六进制字符。 Azure 门户仅支持十六进制值。 在门户中输入指纹值之前,请从指纹值中删除列分隔符和空格。 例如,将 D2:68:D9:04:9F:1A:4D:6A:FD:84:77:68:7B:C6:33:C0:32:37:51:12 输入为 D268D9049F1A4D6AFD8477687BC633C032375112

    提示

    如果正在测试并且想要使用一个证书,则可以对主要和辅助指纹使用相同的证书。

  4. 选择“保存”。

在 IoT 中心完成设备注册后,需检索用于安装和预配 IoT Edge 运行时的信息。

查看已注册设备并检索预配信息

使用 X.509 证书进行身份验证的设备需要其 IoT 中心名称、设备名称及证书文件才能完成 IoT Edge 运行时的安装和预配。

连接到 IoT 中心并已启用 Edge 的设备将在“设备”页上列出。 可以按设备类型 IoT Edge 设备筛选列表。

安装 IoT Edge

在目标设备上部署 Azure IoT Edge for Linux on Windows。

注意

以下 PowerShell 过程概述了如何在 Windows 上将适用于 Linux 的 IoT Edge 部署到本地设备。 若要使用 PowerShell 部署到远程目标设备,请使用远程 PowerShell 与远程设备建立连接,并在该设备上远程运行这些命令。

  1. 在已提升权限的 PowerShell 会话中,根据目标设备体系结构运行以下命令之一,以下载 IoT Edge for Linux on Windows。

    • X64/AMD64

      $msiPath = $([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))
      $ProgressPreference = 'SilentlyContinue'
      Invoke-WebRequest "https://aka.ms/AzEFLOWMSI_1_4_LTS_X64" -OutFile $msiPath
      
    • ARM64

      $msiPath = $([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))
      $ProgressPreference = 'SilentlyContinue'
      Invoke-WebRequest "https://aka.ms/AzEFLOWMSI_1_4_LTS_ARM64" -OutFile $msiPath
      
  2. 在设备上安装 IoT Edge for Linux on Windows。

    Start-Process -Wait msiexec -ArgumentList "/i","$([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))","/qn"
    

    通过向安装命令中添加 INSTALLDIR="<FULLY_QUALIFIED_PATH>"VHDXDIR="<FULLY_QUALIFIED_PATH>" 参数,可以指定自定义 IoT Edge for Linux on Windows 安装和 VHDX 目录。 例如,如果要使用用于安装的 D:\EFLOW 文件夹和用于 VHDX 的 D:\EFLOW-VHDX,可以使用以下 PowerShell cmdlet。

    Start-Process -Wait msiexec -ArgumentList "/i","$([io.Path]::Combine($env:TEMP, 'AzureIoTEdge.msi'))","/qn","INSTALLDIR=D:\EFLOW", "VHDXDIR=D:\EFLOW-VHDX"
    
  3. 在目标设备上将执行策略设置为 AllSigned(如果尚未设置)。 请参阅 PowerShell 先决条件,了解用于检查当前执行策略以及将执行策略设置为 AllSigned 的命令。

  4. 创建 IoT Edge for Linux on Windows 部署。 部署将为你创建 Linux 虚拟机并安装 IoT Edge 运行时。

    Deploy-Eflow
    

    提示

    默认情况下,Deploy-Eflow 命令会创建具有 1 GB RAM、1 个 vCPU 核心和 16 GB 磁盘空间的 Linux 虚拟机。 但是,VM 所需的资源高度依赖于部署的工作负荷。 如果 VM 没有足够的内存来支持工作负荷,将无法启动。

    可以使用 Deploy-Eflow 命令的可选参数自定义虚拟机的可用资源。 这是在满足最低硬件要求的设备上部署 EFLOW 所必需的。

    例如,以下命令创建具有 1 个 vCPU 核心、1 GB RAM(以 MB 表示)和 2 GB 磁盘空间的虚拟机:

    Deploy-Eflow -cpuCount 1 -memoryInMB 1024 -vmDataSize 2
    

    有关所有可用的可选参数的信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数

    警告

    默认情况下,EFLOW Linux 虚拟机没有 DNS 配置。 使用 DHCP 的部署将尝试获取由 DHCP 服务器传播的 DNS 配置。 请检查 DNS 配置以确保具有 Internet 连接。 有关详细信息,请参阅 AzEFLOW-DNS

    可以为部署分配 GPU,以启用 GPU 加速的 Linux 模块。 若要获取这些功能的访问权限,需要安装适用于 Azure IoT Edge for Linux on Windows 的 GPU 加速中详细说明的必备组件。

    若要使用 GPU 直通,请将 gpuName、gpuPassthroughType 和 gpuCount 参数添加到 Deploy-Eflow 命令中 。 有关所有可用的可选参数的信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数

    警告

    启用硬件设备直通可能会增加安全风险。 Azure 建议使用 GPU 供应商提供的设备缓解驱动程序(如果适用)。 有关详细信息,请参阅使用离散设备分配部署图形设备

  5. 输入“Y”接受许可条款。

  6. 根据自己的偏好,输入“O”或“R”以打开或关闭“可选诊断数据”。

  7. 部署完成后,PowerShell 窗口会报告“部署成功”。

    成功的部署会在消息末尾显示“部署成功”,PNG。

    成功部署后,便可以预配设备了。

为设备预配其云标识

你已准备好使用云标识和身份验证信息设置你的设备。

若要使用 X.509 证书预配设备,需要 IoT 中心名称、设备 ID 以及 Windows 主机上标识证书和私钥的绝对路径。

在目标设备上准备好设备标识证书及其匹配的私钥。 了解这两个文件的绝对路径。

在目标设备上权限提升的 PowerShell 会话中运行以下命令。 将占位符文本替换为你自己的值。

Provision-EflowVm -provisioningType ManualX509 -iotHubHostname "HUB_HOSTNAME_HERE" -deviceId "DEVICE_ID_HERE" -identityCertPath "ABSOLUTE_PATH_TO_IDENTITY_CERT_HERE" -identityPrivKeyPath "ABSOLUTE_PATH_TO_PRIVATE_KEY_HERE"

有关 Provision-EflowVM 命令的详细信息,请参阅适用于 IoT Edge for Linux on Windows 的 PowerShell 函数

验证成功的配置

验证是否已在 IoT Edge 设备上成功安装并配置了 IoT Edge for Linux on Windows。

  1. 在 PowerShell 会话中使用以下命令,登录到 Windows 虚拟机上的 IoT Edge for Linux:

    Connect-EflowVm
    

    注意

    唯一被允许通过 SSH 登录到虚拟机的帐户是创建该虚拟机的用户。

  2. 登录后,可以使用以下 Linux 命令查看正在运行的 IoT Edge 模块的列表:

    sudo iotedge list
    
  3. 如果需要对 IoT Edge 服务进行故障排除,请使用以下 Linux 命令。

    1. 检索服务日志。

      sudo iotedge system logs
      
    2. 使用 check 工具验证设备的配置和连接状态。

      sudo iotedge check
      

    注意

    在新预配的设备上,可能会看到与 IoT Edge 中心相关的错误:

    × 生产就绪性:Edge 中心的存储目录持久保存在主机文件系统上- 错误

    无法检查 edgeHub 容器的当前状态

    由于 IoT Edge 中心模块未运行,在新预配的设备上预期会出现此错误。 若要解决此错误,请在 IoT 中心为设备设置模块并创建部署。 为设备创建部署会启动设备上的模块,包括 IoT Edge 中心模块。

创建新的 IoT Edge 设备时,它将在 Azure 门户中显示状态代码 417 -- The device's deployment configuration is not set。 此状态正常,表示设备已准备好接收模块部署。

卸载 IoT Edge for Linux on Windows

若要从设备中删除 Azure IoT Edge for Linux on Windows 安装,请使用以下命令。

  1. 在 Windows 上打开“设置”
  2. 选择“添加或删除程序”
  3. 选择“Azure IoT Edge”应用
  4. 选择“卸载”

后续步骤