使用客户端设备设置AWS物联网 Greengrass 并对其进行故障排除 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用客户端设备设置AWS物联网 Greengrass 并对其进行故障排除

由 Marouane Sefiani 和 Akalanka De Silva 创作 () AWS

环境:PoC 或试点

技术:物联网

AWS服务:AWS物联网 Green AWS grass;物联网核心

Summary

AWSIoT Greengrass 是一款开源边缘运行时和云服务,用于在边缘设备上构建、部署和管理物联网 (IoT) 软件。AWS物联网 Greengrass 的用例包括:

  • 使用AWS物联网 Greengrass 网关作为家庭自动化中心的智能家居

  • 智能工厂,AWS物联网 Greengrass 可以促进车间数据的摄取和本地处理

AWSIoT Greengrass 可以充当其他边缘设备(也称为客户端设备)的安全MQTT、经过身份验证的连接端点,否则这些设备通常会直接连接到物联网核心。AWS当客户端设备无法直接通过网络访问AWS物联网核心端点时,此功能非常有用。

您可以将 AWS IoT Greengrass 设置为与客户端设备一起使用,用于以下用例:

  • 让客户端设备向AWS物联网发送数据 Greengrass

  • 为了让AWS物联网 Greengrass 将数据转发到物联网核心 AWS

  • 利用高级 AWS IoT Core 规则引擎功能

这些功能需要在 AWS IoT Greengrass 设备上安装和配置以下组件:

  • MQTT经纪人

  • MQTT桥梁

  • 客户端设备身份验证

  • IP 探测器

此外,来自客户端设备的已发布消息必须JSON采用格式或协议缓冲区 (protobuf) 格式。

本示例介绍了如何安装和配置这些必需的组件,并提供了故障排除提示和最佳实践。

先决条件和限制

先决条件

限制

  • 您必须选择可用 AWS IoT Core 的AWS区域。有关 AWS IoT Core 的当前区域列表,请参阅按区域划分的AWS服务

  • 核心设备必须至少有 172 MB RAM 和 512 MB 的磁盘空间。

架构

下图显示此模式的解决方案架构。

用于使用客户端AWS设备设置 IoT Greengrass 的解决方案架构

此架构包括:

  • 两个客户端设备 每个设备都包含私钥、设备证书以及根证书颁发机构 (CA) 证书。包含MQTT客户端的AWS物联网设备SDK也安装在每台客户端设备上。

  • 部署了 AWS IoT Greengrass 的核心设备,包含以下组件:

    • MQTT经纪人

    • MQTT桥梁

    • 客户端设备身份验证

    • IP 探测器

该架构支持以下场景:

  • 客户端设备可以使用其MQTT客户端通过核心设备的MQTT代理相互通信。

  • 客户设备还可以通过核心设备的MQTT代理和MQTT桥接器与云中的AWS物联网核心进行通信。

  • AWS云端的 IoT Core 可以通过MQTT测试客户端、核心设备的MQTT桥接器和MQTT代理向客户端设备发送消息。

有关客户端设备和核心设备之间通信的更多信息,请参阅其他信息部分。

工具

AWS服务

  • AWSIoT G reengrass 是一款开源物联网 (IoT) 边缘运行时和云服务,可帮助您在设备上构建、部署和管理物联网应用程序。

  • AWSIoT Core 为连接互联网的设备提供安全的双向通信,以连接到云端。AWS

  • AWSIoT Device SDK 是一个软件开发套件,包括开源库、带示例的开发者指南和移植指南,以便您可以根据自己选择的硬件平台构建创新的物联网产品或解决方案。

  • AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。

最佳实践

  • 来自客户端设备的消息的有效载荷应为JSON或 Protobuf 格式,以便利用 Io AWS T Core 规则引擎的高级功能,例如转换和条件操作。

  • 将MQTT网桥配置为允许双向通信。

  • 在 AWS IoT Greengrass 中配置和部署 IP 检测器组件,确保代理证书的主题备用名称 SAN () 字段中包含核心设备的 IP 地址。MQTT

操作说明

任务描述所需技能

在你的核心AWS设备上设置 IoT Greengrass。

按照开发者AWS指南中的说明安装物联网 Greengrass Core 软件。

AWS IoT Greengrass

检查安装状态。

使用以下命令检查核心设备上的 AWS IoT Greengrass 服务的状态:

sudo systemctl status greengrass.service

命令预期输出是:

Launched Nucleus successfully
将军 AWS

设置IAM策略并将其附加到 Greengrass 服务角色。

  1. 创建允许与MQTT网桥进行通信的IAM策略。以下为策略示例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" }, { "Sid": "GreengrassActions", "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": "*" } ] }
  2. 将策略附加到 Greengrass 服务角色。要获取服务角色,请使用以下命令:

    aws greengrassv2 get-service-role-for-account --region <region>

    其中,<region>指的是您所在AWS的地区。

将军 AWS

在AWS物联网 Greengrass 核心设备中配置和部署所需的组件。

配置与部署以下组件:

AWS IoT Greengrass

确认MQTT网桥允许双向通信。

要在客户端设备和 AWS IoT Core 之间中继MQTT消息,请配置和部署网MQTT桥组件并指定要中继的主题。示例如下:

{ "mqttTopicMapping": { "ClientDevicesToCloud": { "topic": "dt/#", "source": "LocalMqtt", "target": "IotCore" }, "CloudToClientDevices": { "topic": "cmd/#", "source": "IotCore", "target": "LocalMqtt" } } }
AWS IoT Greengrass

确认身份验证组件允许客户端设备连接并发布或订阅主题。

以下 aws.greengrass.clientdevices.Auth 配置允许所有客户端设备连接、发布消息和订阅所有主题。

{ "deviceGroups": { "formatVersion": "2021-03-05", "definitions": { "MyPermissiveDeviceGroup": { "selectionRule": "thingName: *", "policyName": "MyPermissivePolicy" } }, "policies": { "MyPermissivePolicy": { "AllowAll": { "statementDescription": "Allow client devices to perform all actions.", "operations": [ "*" ], "resources": [ "*" ] } } } } }
AWS IoT Greengrass
任务描述所需技能

安装AWS物联网设备SDK。

在客户端设备SDK上安装AWS物联网设备。有关支持的语言和相关语言的完整列表SDKs,请参阅 AWSIoT Core 文档

例如,适用于 Python SDK 的AWS物联网设备SDK位于上 GitHub。要安装它,请执行以下SDK操作:

  1. 按照 GitHub 存储库的 “先决条件” 页面上的说明,确认已安装 Python 3.7 或更高版本。

  2. 使用 p ip 命令安装。SDK

    对于 MacOS 和 Linux:

    python3 -m pip install awsiotsdk

    对于 Windows:

    python -m pip install awsiotsdk

或者,您可以SDK从源存储库安装:

# Create a workspace directory to hold all the SDK files mkdir sdk-workspace cd sdk-workspace # Clone the repository git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git # Install using Pip (use 'python' instead of 'python3' on Windows) python3 -m pip install ./aws-iot-device-sdk-python-v2
通用AWS物联网

创建事物。

  1. AWSIoT 控制台中,如果出现 “开始” 按钮,请选择它。否则,请在导航窗格中展开 Secure(安全),然后选择 Policies(策略)。

  2. 如果显示您还没有任何策略对话框,请选择创建策略。否则,选择创建

  3. 输入物AWS联网策略的名称(例如,ClientDevicePolicy)。

  4. 添加语句部分,将现有策略替换为以下JSON代码。<account>用您的AWS地区<region>和AWS账号替换和。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:region:account:client/*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": "arn:aws:iot:region:account:thing/*" } ] }
  5. 选择创建

  6. AWS物联网控制台的导航窗格中,选择管理事物

  7. 如果显示您还没有任何事物对话框,请选择注册事物。否则,选择创建

  8. 创建AWS物联网事物页面上,选择创建单个事物

  9. 将您的设备添加到设备注册表 页面上,输入您的 IoT 事物的名称(例如 ClientDevice1),然后选择下一步

    :您无法在创建事物后更改其名称。要更改名称,您必须创建一个新事物,为其指定新名称,然后删除旧事物。

  10. 添加事物的证书页面上,选择创建证书

  11. 选择下载链接以下载证书、私有密钥和根 CA 证书。

    重要事项:这是您下载证书和私钥的唯一机会。

  12. 选择 Activate(激活)来激活您的证书。证书必须处于活动状态,设备才能连接到 AWS IoT。

  13. 选择附加策略

  14. 在 “为你的事物添加政策” 中 ClientDevicePolicy,选择 “注册事物”。

AWS物联网核心

从 Greengrass 核心设备下载 CA 证书。

如果您希望 Greengrass 核心设备能够在离线环境中运行,则必须将 Greengrass 核心 CA 证书提供给客户端设备,这样它才能验证MQTT代理的证书(由 Greengrass 核心 CA 颁发)。因此,获取此证书副本非常重要。通过以下方法之一下载 CA 证书:

  • 如果您可以通过电脑访问AWS物联网 Greengrass 设备,https://<device IP>:8883请在网络浏览器中输入并查看代理证书和 CA MQTT 证书。您也可将 CA 证书保存到客户端设备。

  • 或者,你可以使用 O SSL pen 命令行:

    openssl s_client -showcerts -connect <device IP>:8883
将军 AWS

在客户端设备复制凭证。

在客户端设备中复制 Greengrass 核心 CA 证书、设备证书以及私钥。

将军 AWS

将客户端设备与核心设备相关联。

将客户端设备与核心设备关联,以便其可以发现核心设备。然后,客户端设备可以使用 Greengrass API 发现来检索其关联核心设备的连接信息和证书。有关更多信息,请参阅 AWS IoT Greengrass 文档中的关联客户端设备

  1. AWS物联网 Greengrass 控制台上,选择核心设备。

  2. 选择托管管理的核心设备。

  3. 在核心设备的详细信息页面上,请选择客户端设备选项卡。

  4. 关联客户端设备部分,选择关联客户端设备

  5. 将客户端设备与核心设备关联模式中,对要关联的每台客户端设备执行以下操作:

    1. 输入要关联为客户端设备的 AWS IoT 事物的名称。

    2. 选择添加

  6. 选择关联

您关联的客户端设备现在可以使用 Greengrass 发现来API发现此核心设备。

AWS IoT Greengrass
任务描述所需技能

将数据从一个客户端设备发送到另一客户端设备。

使用设备中的MQTT客户端发布有关该dt/client1/sensor主题的消息。

将军 AWS

将数据从客户端设备发送到 AWS IoT Core。

使用设备中的MQTT客户端发布有关该dt/client1/sensor主题的消息。

在MQTT测试客户端中,订阅设备正在发送消息的主题,或订阅 # 以获取所有主题(查看详细信息)。

将军 AWS

从 AWS IoT Core 向客户端设备发送消息。

在MQTT测试客户端页面的发布到主题选项卡的主题名称字段中,输入消息的主题名称。在此示例中,使用 cmd/client1 作为主题。

将军 AWS

故障排除

问题解决方案

无法验证服务器证书错误

当MQTT客户端无法验证MQTT代理在TLS握手期间提供的证书时,就会发生此错误。最常见的原因是MQTT客户端没有 CA 证书。请按照以下步骤操作,确保将 CA 证书提供给MQTT客户端。

  1. 如果您可以通过电脑访问AWS物联网 Greengrass 设备,https://<device IP>:8883请在浏览器窗口中进入以查看代理证书和 CA MQTT 证书。您也可将 CA 证书保存到客户端设备。

    或者使用 O SSL pen 命令行:

    openssl s_client -showcerts -connect <device IP>:8883
  2. 将 Moquette CA 和 Greengrass Core CA 证书内容保存到文件中,然后使用以下命令查看解码后的内容:

    openssl x509 -in <Name of CA>.pem -text

    Moquette CA 证书应显示该SAN字段,如下例所示:

    X509v3 Subject Alternative Name: IP Address:XXX.XXX.XXX.XXX, IP Address:127.0.0.1, DNS:localhost

无法验证服务器名称错误

当MQTT客户端无法验证它是否连接到正确的服务器时,就会发生此错误。最常见的原因是 Greengrass 设备的 IP 地址未在证书字段中SAN列出。

按照前一解决方案中的说明获取MQTT代理证书,并验证该SAN字段是否包含 AWS IoT Greengrass 设备的 IP 地址,如其他信息部分所述。如果没有,请确认 IP 检测器组件安装得当,然后重新启动核心设备。

仅在从嵌入式客户端设备连接时,无法验证服务器名称

Mbed TLS 是嵌入式设备中常用的TLS库,目前仅支持证书SAN字段的DNS名称验证,如 Mbed TLS 库代码所示。由于核心设备没有自己的域名并且依赖于 IP 地址,因此使用 Mbed 的TLS客户端在TLS握手期间TLS将无法通过服务器名称验证,从而导致连接失败。我们建议你通过 x509 _crt_check_san 函数将 SAN IP 地址验证添加到 Mbed TLS 库中。

相关资源

其他信息

本节提供有关客户端设备和核心设备之间通信的附加信息。

MQTT代理在核心设备的端口 8883 上侦听TLS客户端连接尝试。下图显示了MQTT代理服务器证书的示例。

经MQTT纪服务器证书示例

示例证书显示以下详细信息:

  • 该证书由AWS物联网 Greengrass Core CA 颁发,该证书是本地的,特定于核心设备;也就是说,它充当本地 CA。

  • 该证书由客户端身份验证组件每周自动轮换,如下图所示。您可在客户端身份验证组件配置中设置此间隔。

轮换经MQTT纪商的服务器证书
  • 主题备用名称 (SAN) 在TLS客户端的服务器名称验证中起着至关重要的作用。它可以帮助TLS客户端确保连接到正确的服务器,并有助于避免在TLS会话设置期间发生 man-in-the中间攻击。在示例证书中,该SAN字段表示此服务器正在本地主机(本地 Unix 域套接字)上侦听,并且网络接口的 IP 地址为 192.168.1.12。

在服务器验证期间,TLS客户端使用证书中的SAN字段来验证其是否连接到合法服务器。相比之下,在HTTP服务器和浏览器之间的典型TLS握手期间,公用名 (CN) 字段或SAN字段中的域名用于交叉检查服务器验证过程中浏览器实际连接的域。如果核心设备没有域名,则SAN字段中包含的 IP 地址具有相同的用途。有关更多信息,请参阅 RFC5280 — Internet X.509 公钥基础设施证书和证书吊销列表 () 配置文件的 “主题备用名称” 部分。CRL

AWS物联网 Greengrass 中的 IP 探测器组件可确保证书字段中SAN包含正确的 IP 地址。

示例中的证书由充当本地 CA 的 AWS IoT Greengrass 设备签名。TLS客户端(MQTT客户端)不知道此 CA,因此我们必须提供如下所示的 CA 证书。

CA 证书示例