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

fxnxkyjh  于 11个月前  发布在  Postman
关注(0)|答案(2)|浏览(122)

我想使用HTTPS和Postman在AWS上发布一个IoT主题的消息。
编辑:我已经编辑了大部分的职位,包括一步一步的过程中,我创造的东西
我通过以下步骤创建了一个名为TestDevice的东西:
AWS IoT控制台>管理(左 Jmeter 板面板)>所有设备>事物>创建事物(在中心页面上)>创建单个事物>将其命名为TestDevice(无影子和其他配置)>自动生成新证书>创建名为TestDevice-policy的策略(这将打开一个新的浏览器选项卡,您将在其中创建策略>将其附加到事物>完成创建并下载所有证书
该政策看起来像这样:
x1c 0d1x的数据
下载的证书如下所示:



现在根据AWS developer guide,我的端点应该是:

https://xxx-ats.iot.ap-northeast-1.amazonaws.com/topics/TestTopic?qos=1

字符串
我在控制台中打开了AWS IoT MQTT测试客户端,并订阅了#,这应该可以让我看到所有传入的消息。
设置 Postman 为@Ermiya Eskandary指示



当我点击发送时,POSTMAN上出现套接字挂起错误:



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

所以我一定是做错了一些 Postman 设置

1mrurvl1

1mrurvl11#

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:设备的私钥文件

然后,您 * 可能 * 还拥有一个或多个CA(证书颁发机构)证书文件。目前,根据文档,AWS IoT核心服务器认证证书由以下根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 》中的Map。

  • 设置 * > * 证书 * > *CA证书 *

1.切换至 ON
1.选择您的根CA(任何根CA都可以与Postman一起使用,但其他工具可能并不总是支持ECC)
x1c 0d1x的数据
1.* 添加证书 *



1.我们这里有几个值:

*主持人

  1. https://,由 Postman 设定
    1.您的AWS IoT Data-ATS端点(aws iot describe-endpoint --endpoint-type iot:Data-ATS),由您设置,例如xxx-ats.iot.eu-west-1.amazonaws.com
  2. 8443,由您设置,为端口-不使用443

*CRT文件:选择设备的证书。

Postman使用的是.crt文件名约定,但仅此而已。.crt文件的格式为DER或PEM格式。AWS在此使用.pem来表示PEM格式,即证书的Base64编码。
Postman完全支持.pem,但目前不支持DER,因此我们可以保持此.pem文件不变。

  • 旁注:请随意在末尾添加.crt,以便Windows将其识别为证书文件,并允许您双击它以查看详细信息。*
    *密钥文件:选择设备的私钥
    *PFX文件:保持原样
    *密语:保持原样



1.单击“Add”(添加)-这应该是您的最终配置



现在,Postman已正确配置为向HTTPS端点发送请求。
IoT在尝试通过HTTPS端点发布消息时抛出Missing authentication的原因是端口443需要自定义的ALPN协议名称x-amzn-http-ca。如果您使用AWS Sig V4进行身份验证,则只能在未设置自定义ALPN协议名称的情况下通过端口443进行通信。
在本例中,由于我们使用的是X.509客户端证书身份验证,端口8443允许我们不需要配置ALPN。

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

我已选择证书身份验证。
AWS文档中突出显示了这一点,我的重点是粗体项目:
| 议定书|支助的行动|认证|端口|ALPN协议名称|
| --|--|--|--|--|
| 基于WebSocket的MQTT|发布、订阅|签名版本4| 443 |N/A|
| 基于WebSocket的MQTT|发布、订阅|自定义身份验证| 443 |N/A|
| MQTT|发布、订阅|X.509客户端证书| 443 |x-amzn-mqtt-ca个|
| MQTT|发布、订阅|X.509客户端证书| 8883 |N/A|
| MQTT|发布、订阅|自定义身份验证| 443 |MQTT|
|HTTPS协议| 只发布|签名版4| 第四百四十三章|不适用|
|HTTPS协议| 只发布|X.509客户端证书| 第四百四十三章|一米三十米一个|
|HTTPS协议| 只发布|X.509客户端证书| 八四四三|不适用|
| HTTPS|只发布|自定义身份验证| 443 |N/A|

最后要检查的是,附加到证书的策略是否允许您使用该证书发布到要发布的主题。
至少,您需要将以下策略与iot:Publish策略操作一起附加:

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

字符串
eu-west-1替换为您的区域,将xxx替换为您的AWS帐户ID,将my-topic替换为您的主题名称。
如果你想发布到任何主题,请使用ARN中的*标签(而不是#!),如前所述。

arn:aws:iot:eu-west-1:xxx:topic/*


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

  • 方法:POST
  • URL:https://xxx:8443/topics/yyy?qos=1,将xxx替换为ATS端点,将yyy替换为主题名称
  • Body:raw -文本/JSON作为内容类型,并不重要
  • Header:保留Content-Length非常重要,否则您将在AWS MQTT测试客户端中获得Message cannot be displayed in specified format.

x1c4d 1x的
点击发送&一个200 OK响应信号成功:

{
    "message": "OK",
    "traceId": "xxx-xxx-xxx-xxx-xxx"
}


如果您没有正确设置策略以允许发布到主题,您将得到一个403 Forbidden响应,表示失败。
注意message设置为null

{
    "message": null,
    "traceId": "xxx-xxx-xxx-xxx-xxx"
}


如果成功,请检查控制台,您的消息将出现在那里:



P.S.开发者指南确实有一个错误,那就是流氓"。我已经提交了反馈,希望能纠正这个错误:)

0qx6xfy6

0qx6xfy62#

根据您的问题(How to post to a topic on AWS IoT using HTTP(S) POSTMAN),您只想在AWS-IoT MQTT代理中的特定主题中发布有效负载。
这个任务非常简单,您不需要创建一个东西来实现它,也不需要创建要附加到POSTMAN的证书。
这是一个简单的过程的解释:
1 -用户通过POSTMAN访问您案例中的HTTPs端点。
2 -你可以在你的POST主体中使用你想要在你的payload中发布的数据。注意:你可以有一个更灵活的代码来接受你想要发布的数据和你想要发布的主题。也就是说,你可以在你的POST主体中发送数据和主题。
3 -当你访问HTTPs端点时,你将调用一个Lambda。这个函数将连接到API网关,并将接收你从POSTMAN发送的有效负载。
4 -在lambda内部,您将与AWS IoT核心建立连接,在那里您将在所需的主题中发布从POSTMAN获得的有效负载。
换句话说,要完成这项任务,您需要了解如何通过API API Gateway设置端点,以及如何创建lambda以连接到MQTT代理。您可以通过一些不同的方式创建此架构。我使用通过SERVERLESS框架来完成。
这里重要的一点是您需要向lambda提供在MQTT代理中发布的权限。没有该权限,它将失败。
我不会详细介绍如何使用SERVERLESS创建HTTPs端点,因为这不是问题所在。下面的代码显示了如何将HTTPs端点设置为名为fnPublishMqtt的lambda,以及什么是RoleStatements,以允许lambda在AWS IoT-Core MQTT代理中发布凭据。

publishmqtt:
    handler: fnPublishMqtt.fnPublishMqtt
    events:
    - http:
        path: publishmqtt
        method: post
        private: false
        cors: false
    memorySize: 256
    iamRoleStatementsName: "someRoleName"
    iamRoleStatements:
    - Effect: "Allow"
      Action:
      - "iot:*"
      Resource: '*'

字符串
下一步是使用NodeJS SDK V3的lambda本身:

const { IoTDataPlaneClient, PublishCommand } = require("@aws-sdk/client-iot-data-plane")
const clientIoTDataPlane = new IoTDataPlaneClient ({ region: "us-east-1" })

const publishMQTT = async (params) => {
  try {
    const input = {
      topic: params.topic,
      payload: JSON.stringify(params.payload),
      qos:'0'
    }
    const command = new PublishCommand (input)
    const result = clientIoTDataPlane.send(command)
    return result
  } catch (error) {
    console.error(error.stack)
    throw error.stack
  }
}

module.exports.fnPublishMqtt = async (event) => {
  
    try {
        const jsonBody = JSON.parse(event.body)

        const mqttParams = {
            topic: jsonBody.topic,
            payload: jsonBody.payload
        }
        const resp = await publishMQTT(mqttParams)
        console.log('resp:', resp)
        return {
            statusCode: 200,
            body: JSON.stringify(resp)
        }

        
    } catch (error) {
        console.log('error:', error)
    }
    
}


然后只需转到您的POSTMAN调用端点https://xxxxxxx/publishmqtt,传递以下POST主体{topic:"topic/tes",payload: {status:74648}
您应该能够看到在AWS IoT-Core MQTT代理中发布的{topic:"topic/tes",payload: {status:74648}

相关问题