使用自定义身份验证 Amazon IoT Core 进行连接 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用自定义身份验证 Amazon IoT Core 进行连接

设备可以通过自定义身份验证与任何 Amazon IoT Core 支持设备消息传递的协议进行连接。 Amazon IoT Core 有关受支持的通信协议的更多信息,请参阅 设备通信协议。  您传递给授权方 Lambda 函数的连接数据取决于您使用的协议。有关创建授权方 Lambda 函数的更多信息,请参阅 定义您的 Lambda 函数。以下部分说明如何使用每个支持的协议连接到身份验证。

HTTPS

使用 P HTTPub lish 向 Amazon IoT Core 其HTTPPOST发送数据的设备API可以通过请求标头或请求中的查询参数传递凭证。设备可以使用 x-amz-customauthorizer-name 标头或查询参数指定要调用的授权方。如果您在授权方中启用了令牌签名,则必须使用请求标头或查询参数传递 token-key-namex-amz-customauthorizer-signature。请注意,在浏览器中使用该token-signatureURL值时,必须使用-enco JavaScript ding。

注意

该HTTPS协议的客户授权者仅支持发布操作。有关该HTTPS协议的更多信息,请参阅设备通信协议

以下示例请求显示了如何使用请求标头和查询参数传递这些参数。

//Passing credentials via headers POST /topics/topic?qos=qos HTTP/1.1 Host: your-endpoint  x-amz-customauthorizer-signature: token-signature token-key-name: token-value  x-amz-customauthorizer-name: authorizer-name //Passing credentials via query parameters POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1

MQTT

Amazon IoT Core 通过连接MQTT连接的设备可以通过MQTT消息的usernamepassword字段传递凭据。username 值也可以选择将其他值(包括令牌、签名和授权方名称)传递给授权方的查询字符串包含在内。如果要使用基于令牌的身份验证方案而不是 usernamepassword 值,则可以使用此查询字符串。 

注意

密码字段中的数据由 base64 编码。 Amazon IoT Core您的 Lambda 函数必须对其进行解码。

以下示例包含一个 username 字符串,其中带有指定令牌和签名的额外参数。 

username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value

要调用授权方, Amazon IoT Core 通过使用MQTT和自定义身份验证连接的设备必须通过端口 443 进行连接。它们还必须通过应用层协议协商 (ALPN) TLS 扩展名,值为mqtt和服务器名称指示 (SNI) 扩展名及其 Amazon IoT Core 数据端点的主机名。为避免可能出现的错误,x-amz-customauthorizer-signature应对的值进行URL编码。我们还强烈建议对x-amz-customauthorizer-name和的值token-key-name进行URL编码。有关这些值的更多信息,请参阅设备通信协议。V2 Amazon IoT 设备 SDK、移动 SDK 和 Amazon IoT 设备客户端 可以配置这两个扩展。 

MQTT结束了 WebSockets

Amazon IoT Core 通过使用over连接MQTT的设备 WebSockets 可以通过以下两种方式之一传递凭据。

  • 通过请求标头或HTTPUPGRADE请求中的查询参数来建立 WebSockets 连接。

  • 通过MQTTCONNECT消息中的usernamepassword字段。

如果您通过MQTT连接消息传递凭据,则需要ALPN和SNITLS扩展名。有关这些扩展的更多信息,请参阅MQTT。 以下示例演示如何通过HTTP升级请求传递证书。

GET /mqtt HTTP/1.1 Host: your-endpoint Upgrade: WebSocket Connection: Upgrade x-amz-customauthorizer-signature: token-signature token-key-name: token-value  sec-WebSocket-Key: any random base64 value sec-websocket-protocol: mqtt sec-WebSocket-Version: websocket version

签名令牌

必须使用 create-authorizer 调用中用到的公私密钥对的私有秘钥签署令牌。以下示例说明如何使用UNIX类似命令和来创建令牌签名 JavaScript。他们使用 SHA -256 哈希算法对签名进行编码。

Command line
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
JavaScript
const crypto = require('crypto') const key = "PEM encoded RSA private key" const k = crypto.createPrivateKey(key) let sign = crypto.createSign('SHA256') sign.write(t) sign.end() const s = sign.sign(k, 'base64')