使用自定义身份验证 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

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

注意

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

使用 MQTT 连接连接的设备可以通过 MQTT 消息的usernamepassword字段传递凭证。 Amazon IoT Core 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

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

MQTT 结束了 WebSockets

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

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

  • 通过 usernamepassword 字段中的 MQTT CONNECT 消息。

如果您通过 MQTT 连接消息传递凭证,则需要使用 ALPN 和 SNI TLS 扩展。有关这些扩展的更多信息,请参阅 MQTT。以下示例演示如何通过 HTTP Upgrade 请求传递凭证。

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')