将 IoT Edge 设备配置为充当透明网关

适用于:IoT Edge 1.4 checkmark IoT Edge 1.4

本文详细说明如何将 IoT Edge 设备配置为充当透明网关,供其他设备用来与 IoT 中心通信。 本文使用术语 IoT Edge 网关来指代配置为透明网关的 IoT Edge 设备。 有关详细信息,请参阅如何将 IoT Edge 设备用作网关

注意

下游设备不能使用文件上传。

成功设置透明网关连接需要完成三个常规步骤。 本文介绍其中的第一个步骤:

  1. 将网关设备配置为服务器,以便下游设备能够安全地连接到该设备。 设置网关以接收来自下游设备的消息,并将消息路由到适当的目标。
  2. 为下游设备创建设备标识,以便它可以向 IoT 中心进行身份验证。 配置下游设备,使其通过网关设备发送消息。 有关这些步骤,请参阅向 Azure IoT 中心验证下游设备
  3. 将下游设备连接到网关设备并开始发送消息。 有关这些步骤,请参阅将下游设备连接到 Azure IoT Edge 网关

充当网关的设备需要安全地连接到下游设备。 Azure IoT Edge 允许使用公钥基础结构 (PKI) 在设备之间建立安全连接。 在这种情况下,我们可以将下游设备连接到充当透明网关的 IoT Edge 设备。 要维持合理的安全性,下游设备应确认网关设备的标识。 此标识检查可防止设备连接到潜在的恶意网关。

下游设备可以是包含通过 Azure IoT 中心云服务创建的标识的任何应用程序或平台。 这些应用程序通常使用 Azure IoT 设备 SDK。 下游设备甚至可以是 IoT Edge 网关设备本身上运行的应用程序。

可以创建任何启用设备网关拓扑所需的信任的证书基础结构。 在本文中,我们假设使用相同的证书设置来启用 IoT 中心的 X.509 CA 安全性,其中涉及与特定 IoT 中心(IoT 中心根 CA)关联的 X.509 CA 证书,以及通过此 CA 签名的一系列证书和 IoT Edge 设备的 CA。

注意

在这些文章中使用的术语“根 CA 证书”是指 PKI 证书链最顶层的颁发机构公共证书,而不一定是联合证书颁发机构的证书根。 在许多情况下,它实际上是中间 CA 公共证书。

以下步骤将演示创建证书并将它们安装在网关上的正确位置的过程。 可以使用任一计算机生成证书,然后将其复制到 IoT Edge 设备。

先决条件

安装了 IoT Edge 的 Linux 或 Windows 设备。

如果设备均未就绪,可在 Azure 虚拟机中创建一个。 按照将第一个 IoT Edge 模块部署到虚拟 Linux 设备中的步骤,创建一个 IoT 中心、创建一个虚拟机并配置 IoT Edge 运行时。

安装设备 CA 证书

所有 IoT Edge 网关上都需要安装设备 CA 证书。 IoT Edge 安全守护程序使用 IoT Edge 设备 CA 证书为工作负载 CA 证书签名,而工作负载 CA 证书又为 IoT Edge 中心的服务器证书签名。 在连接启动期间,网关将其服务器证书提供给下游设备。 下游设备将进行检查,确保服务器证书是汇总到根 CA 证书的证书链的一部分。 此过程允许下游设备确认网关是否来自受信任的源。 有关详细信息,请参阅了解 Azure IoT Edge 如何使用证书

Screenshot that shows the gateway certificate setup.

根 CA 证书和设备 CA 证书(带有私钥)需要在 IoT Edge 网关设备上提供,并在 IoT Edge 配置文件中进行配置。 请记住,在这种情况下,“根 CA 证书”表示此 IoT Edge 方案的最顶层证书颁发机构。 网关设备 CA 证书和下游设备证书需要汇总到同一根 CA 证书。

提示

在 IoT Edge 设备上安装根 CA 证书和设备 CA 证书的过程也在管理 IoT Edge 设备上的证书中进行了更详细的介绍。

准备好以下文件:

  • 根 CA 证书
  • 设备 CA 证书
  • 设备 CA 私钥

对于生产方案,你应该通过自己的证书颁发机构生成这些文件。 对于开发和测试方案,可以使用演示证书。

创建演示证书

如果没有自己的证书颁发机构,并且想要使用演示证书,请按照创建演示证书来测试 IoT Edge 设备功能中的说明来创建文件。 在该页上,需要执行以下步骤:

  1. 首先在设备上设置生成证书的脚本。
  2. 创建根 CA 证书。 按照这些说明操作后,你将有一个根 CA 证书文件 <path>/certs/azure-iot-test-only.root.ca.cert.pem
  3. 创建 IoT Edge 设备 CA 证书。 按照这些说明操作后,你将有一个设备 CA 证书 <path>/certs/iot-edge-device-ca-<cert name>-full-chain.cert.pem 及其私钥 <path>/private/iot-edge-device-ca-<cert name>.key.pem

将证书复制到设备

  1. 检查该证书是否符合格式要求

  2. 如果在另一计算机上创建了这些证书,请将它们复制到 IoT Edge 设备上。 可使用 U 盘,这是一种类似于 Azure Key Vault 的服务,或使用安全文件复制等功能。

  3. 将文件移动到证书和密钥的首选目录。 对证书使用 /var/aziot/certs,对密钥使用 /var/aziot/secrets

  4. 创建证书和密钥目录并设置权限。 应将证书和密钥存储到首选 /var/aziot 目录。 对证书使用 /var/aziot/certs,对密钥使用 /var/aziot/secrets

    # If the certificate and keys directories don't exist, create, set ownership, and set permissions
    sudo mkdir -p /var/aziot/certs
    sudo chown aziotcs:aziotcs /var/aziot/certs
    sudo chmod 755 /var/aziot/certs
    
    sudo mkdir -p /var/aziot/secrets
    sudo chown aziotks:aziotks /var/aziot/secrets
    sudo chmod 700 /var/aziot/secrets
    
  5. 更改证书和密钥的所有权和权限。

    # Give aziotcs ownership to certificates
    # Read and write for aziotcs, read-only for others
    sudo chown -R aziotcs:aziotcs /var/aziot/certs
    sudo find /var/aziot/certs -type f -name "*.*" -exec chmod 644 {} \;
    
    # Give aziotks ownership to private keys
    # Read and write for aziotks, no permission for others
    sudo chown -R aziotks:aziotks /var/aziot/secrets
     sudo find /var/aziot/secrets -type f -name "*.*" -exec chmod 600 {} \;
    

在设备上配置证书

  1. 在 IoT Edge 设备上,打开配置文件:/etc/aziot/config.toml。 如果使用 IoT Edge for Linux on Windows,必须使用 PowerShell cmdlet Connect-EflowVm 连接到 EFLOW 虚拟机。

    提示

    如果设备上尚不存在配置文件,则使用 /etc/aziot/config.toml.edge.template 作为模板来创建一个。

  2. 查找 trust_bundle_cert 参数。 取消注释此行,并为设备上的根 CA 证书文件提供文件 URI。

  3. 找到文件的 [edge_ca] 节。 取消注释此部分中的三行,并将证书和密钥文件的文件 URI 作为以下属性的值提供:

    • cert:设备 CA 证书
    • pk:设备 CA 私钥
  4. 保存并关闭该文件。

  5. 单击“应用”以应用更改。

    sudo iotedge config apply
    

部署 edgeHub 和路由消息

下游设备将遥测和消息发送到网关设备,其中 IoT Edge 中心模块负责将信息路由到其他模块或 IoT 中心。 若要为此功能准备网关设备,请确保:

  • IoT Edge 中心模块已部署到设备。

    首次在设备上安装 IoT Edge 时,只会自动启动一个系统模块,即 IoT Edge 代理。 为设备创建第一个部署后,第二个系统模块和 IoT Edge 中心也会启动。 如果 edgeHub 模块未在设备上运行,请为设备创建一个部署。

  • IoT Edge 中心模块设置了路由,用于处理来自下游设备的传入消息。

    网关设备必须有一个适当的路由来处理来自下游设备的消息,否则这些消息将不会被处理。 可以将消息发送到网关设备上的模块,也可以直接发送到 IoT 中心。

若要部署 IoT Edge 中心模块并为其配置路由以处理来自下游设备的传入消息,请执行以下步骤:

  1. 在 Azure 门户中导航到 IoT 中心。

  2. 转到“设备管理”菜单下的“设备”,然后选择要用作网关的 IoT Edge 设备。

  3. 选择“设置模块” 。

  4. 在“模块”页上,可以添加任何要部署到网关设备的模块。 就本文而言,我们侧重于配置和部署 edgeHub 模块,无需在此页面上显式设置。

  5. 在完成时选择“下一步:路由”。

  6. 在“路由”页上,请确保存在用于处理来自下游设备的消息的路由。 例如:

    • 将所有消息(无论是来自模块还是来自下游设备)发送到 IoT 中心的路由:

      • 名称allMessagesToHub
      • FROM /messages/* INTO $upstream
    • 将来自所有下游设备的全部消息发送到 IoT 中心的路由:

      • 名称allDownstreamToHub
      • FROM /messages/* WHERE NOT IS_DEFINED ($connectionModuleId) INTO $upstream

      该路由之所以有效,是因为与来自 IoT Edge 模块的消息不同,来自下游设备的消息没有与之关联的模块 ID。 使用路由的 WHERE 子句,我们可以筛选出具有该系统属性的所有消息。

      有关消息路由的详细信息,请参阅部署模块和建立路由

  7. 创建一个或多个路由后,选择“查看 + 创建”。

  8. 在“查看 + 创建”页面上,选择“创建”。

在网关设备上打开端口

标准 IoT Edge 设备不需要任何入站连接便可工作,因为与 IoT 中心之间的所有通信都是通过出站连接执行的。 网关设备则不同,因为它们需要从其下游设备接收消息。 如果下游设备与网关设备之间有防火墙,则也需要能够通过防火墙进行通信。

为了使网关方案能够正常工作,必须在 IoT Edge 中心至少为来自下游设备的入站流量打开一个受支持的协议。 受支持的协议包括 MQTT、AMQP、HTTPS、基于 WebSocket 的 MQTT 和基于 Websocket 的 AMQP。

端口 协议
8883 MQTT
5671 AMQP
443 HTTPS
MQTT+WS
AMQP+WS

后续步骤

现在,你已将一个 IoT Edge 设备设置为透明网关,需要将下游设备配置为信任该网关并向其发送消息。 继续在 Azure IoT 中心内对下游设备进行身份验证,以进行设置透明网关方案的后续步骤。