如何使用 HTTPS 和 Postman 将消息发布到 AWS 上的 IoT 事物主题?

Jak*_*uin 4 amazon-web-services postman aws-iot

我想使用 HTTPS 和 Postman 向 AWS 上的 IoT 事物主题发布消息。

编辑:我已经编辑了帖子的大部分内容,以包含我创建的内容的分步过程

TestDevice我按照以下步骤创建了一个名为的东西:

AWS IoT 控制台 > 管理(左侧仪表板面板) > 所有设备 > 事物 > 创建事物(在中心页面上) > 创建单个事物 > 将其命名为 TestDevice(无阴影和其他配置) > 自动生成新证书 > 创建名为的策略TestDevice-policy(这将打开一个新的浏览器选项卡,您将在其中创建策略 > 将其附加到事物 > 完成创建事物并下载所有证书

该政策如下所示:

在此输入图像描述

下载的证书如下所示:

在此输入图像描述

现在根据AWS开发人员指南,我的端点应该是:

https://xxx-ats.iot.ap-northeast-1.amazonaws.com/topics/TestTopic?qos=1
Run Code Online (Sandbox Code Playgroud)

我在控制台中打开 AWS IoT MQTT 测试客户端并订阅,#这应该允许我查看所有传入消息。

按照 @Ermiya Eskandary 的指示设置邮递员

在此输入图像描述

当点击发送时,我在 POSTMAN 上收到套接字挂起错误:

在此输入图像描述

所以我可以保证这不是 AWS IoT 设置问题,因为运行 AWS 开发人员指南中的 python 示例我得到“OK”响应

在此输入图像描述 在此输入图像描述

所以我一定做错了一些邮递员设置

Erm*_*ary 6

Postman 绝对可以连接到 HTTPs 端点并发布消息,尽管 AWS IoT 文档确实没有最好地解释这一点。

我想确保我回答了你们所有的问题,所以这里有很多细节,但我们会一点一点地讨论。


现在我打开 AWS Iot 测试控制台并订阅 #

正确的。

#+MQTT 通配符。订阅其中任何一个都会让您订阅所有主题。

它们很容易与 AWS IAM 策略通配符- *&混淆?,您可以在 IoT Core 策略中使用它们,但不能用于订阅。使用它们作为订阅的主题名称不会产生任何消息。


我使用哪些证书?

您下载的 Windows 连接套件(Linux/Mac 的名称会有所不同)至少包含:

  • {thing-name}.cert.pem:设备证书
  • {thing-name}.private.key: 公钥文件
  • {thing-name}.public.key: 私钥文件

我正在使用eu-west-1使用上述命名约定的区域,但是,显然它在所有区域中并不一致。

尽管如此,大多数情况下您都可以推断出它,因为设备证书是文件.pem,私钥的名称为private,公钥的名称为public 。

在你的情况下,它们分别是:

  • certificate.cert.pem:设备的证书
  • public.pem.key:设备的公钥文件
  • private.pem.key:设备的私钥文件

然后,您可能还拥有 1 个或多个 CA(证书颁发机构)证书文件。目前,根据文档,AWS IoT Core 服务器身份验证证书由以下根 CA 证书之一签名(但您可能还会看到 CA 2 和 4 :

  • RSA 2048 位密钥:Amazon 根 CA 1
  • ECC 256 位密钥:Amazon 根 CA 3

在您的情况下,您同时拥有根 CA 1 和根 CA 3,其名称可以方便地指出密码套件:

密码套件超出了本答案的范围,但我们将坚持使用 RSA 2048。


那么,我们需要 Postman 什么呢?

我们需要:

  • 1个证书颁发机构:RSA2048AmazonRootCA1.pem
  • 设备的证书:certificate.cert.pem
  • 设备的私钥:private.pem.key

这就是他们在 Postman 中的映射方式。

设置>证书> CA 证书

  1. 切换至“开”
  2. 选择您的根 CA(任何根 CA 都可以与 Postman 配合使用,但其他工具可能并不总是支持 ECC)

在此输入图像描述

  1. 添加证书

在此输入图像描述

  1. 我们这里有一些价值观:
  • 主持人
  1. https://,由邮递员设置
  2. 您的 AWS IoTData-ATS端点 ( aws iot describe-endpoint --endpoint-type iot:Data-ATS),由您设置,例如xxx-ats.iot.eu-west-1.amazonaws.com
  3. 8443,由您设置,作为端口 -不要使用 443
  • CRT 文件:选择您设备的证书。

Postman 使用.crt文件名约定,但仅此而已 - 文件名约定。文件格式.crt为 DER 或 PEM。AWS 在此使用.pemPEM 格式表示证书的 Base64 编码。

Postman完全支持.pem但目前不支持DER,所以我们可以保持这个.pem文件原样。

旁注:请随意添加.crt到末尾,让 Windows 将其识别为证书文件并允许您双击它来检查详细信息。

  • KEY 文件:选择您设备的私钥

  • PFX 文件:保持原样

  • 密码:保持原样

在此输入图像描述

  1. 单击添加- 这应该是您的最终配置

在此输入图像描述


Postman 现在已正确配置为将请求发送到 HTTPS 端点。

Missing authenticationIoT在尝试通过 HTTPS 端点发布消息时抛出异常的原因是端口 443 需要自定义ALPN协议名称x-amzn-http-ca. 如果您使用 AWS Sig V4 进行身份验证,则只能通过端口 443 进行通信,而无需设置自定义 ALPN 协议名称。

在本例中,由于我们使用 X.509 客户端证书身份验证,因此端口 8443 允许我们无需配置 ALPN。ALPN 不可能在 Postman 中配置,并且很难配置curl,所以我们应该选择其中之一

  • 端口 443,AWS Signature v4 身份验证
  • 端口8443,X.509证书认证

我选择了证书身份验证。

AWS 文档中强调了这一点,我重点强调了粗体项目:

协议 支持的操作 验证 港口 ALPN 协议名称
基于 WebSocket 的 MQTT 发布、订阅 签名版本 4 第443章 不适用
基于 WebSocket 的 MQTT 发布、订阅 自定义认证 第443章 不适用
MQTT 发布、订阅 X.509 客户端证书 第443章 x-amzn-mqtt-ca
MQTT 发布、订阅 X.509 客户端证书 8883 不适用
MQTT 发布、订阅 自定义认证 第443章 MQTT
HTTPS 仅发布 签名版本 4 第443章 不适用
HTTPS 仅发布 X.509 客户端证书 第443章 x-amzn-http-ca
HTTPS 仅发布 X.509 客户端证书 8443 不适用
HTTPS 仅发布 自定义认证 第443章 不适用

最后要检查的是,附加到您的证书的策略是否允许您使用该证书发布到您想要发布到的主题。

至少,您需要将以下策略附加到iot:Publish策略操作中:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:eu-west-1:xxx:topic/my-topic"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

替换eu-west-1为您的区域、xxx您的 AWS 账户 ID 和my-topic您的主题名称。

如果您希望能够发布到任何主题,请*在 ARN 中使用通配符,如之前详述(而不是#!),例如

arn:aws:iot:eu-west-1:xxx:topic/*
Run Code Online (Sandbox Code Playgroud)

一旦您拥有正确的 CA、设置了正确的设备证书,并将主机设置为 ATS 签名数据端点、将端口设置为 8443、将 KEY 文件设置为您的私钥,并且您的证书在控制台中附加了正确的策略,您已准备好发送您的请求。

  • 方法:邮寄
  • URL: https://xxx:8443/topics/yyy?qos=1,替换xxx为您的 ATS 端点和yyy您的主题名称
  • Body: raw - Text/JSON 作为内容类型,并不重要
  • 标头:保留非常重要Content-Length,否则您将Message cannot be displayed in specified format.进入 AWS MQTT 测试客户端

在此输入图像描述


点击发送并200 OK响应表示成功:

{
    "message": "OK",
    "traceId": "xxx-xxx-xxx-xxx-xxx"
}
Run Code Online (Sandbox Code Playgroud)

如果您没有正确设置策略以允许发布到该主题,您将收到403 Forbidden表示失败的响应。

注意message设置为null

{
    "message": null,
    "traceId": "xxx-xxx-xxx-xxx-xxx"
}
Run Code Online (Sandbox Code Playgroud)

如果成功,请检查控制台并显示您的消息:

在此输入图像描述


PS开发者指南确实有一个流氓拼写错误"。我已提交反馈以希望纠正此问题:)