カスタム認証 AWS IoT Core を使用した への接続 - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

カスタム認証 AWS IoT Core を使用した への接続

デバイスは、 AWS IoT Core がデバイスメッセージング用に AWS IoT Core サポートする任意のプロトコルでカスタム認証を使用して に接続できます。サポートされる通信プロトコルの詳細については、デバイス通信プロトコル を参照してください。  オーソライザーの Lambda 関数に渡す接続データは、使用するプロトコルによって異なります。オーソライザーの Lambda 関数の作成の詳細については、「Lambda 関数の定義」を参照してください。次のセクションでは、サポートされている各プロトコルを使用して接続して認証する方法について説明します。

HTTPS

HTTP Publish API を使用して AWS IoT Core にデータを送信するデバイスは、HTTP POST リクエストのリクエストヘッダーまたはクエリパラメータを介して認証情報を渡すことができます。デバイスは、x-amz-customauthorizer-name ヘッダーまたはクエリパラメータを使用して呼び出すオーソライザーを指定できます。オーソライザーでトークン署名を有効にしている場合は、リクエストヘッダーまたはクエリパラメータで token-key-namex-amz-customauthorizer-signature を渡す必要があります。ブラウザ内 JavaScript から を使用する場合は、token-signature値が URL エンコードされている必要があることに注意してください。

注記

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 接続 AWS IoT Core を使用して に接続するデバイスは、MQTT メッセージの usernameおよび passwordフィールドを介して認証情報を渡すことができます。username の値には、追加の値 (トークン、署名、オーソライザー名など) をオーソライザーに渡すクエリ文字列をオプションで含めることもできます。usernamepassword の値の代わりにトークンベースの認証スキームを使用する場合は、このクエリ文字列を使用できます。 

注記

パスワードフィールドのデータは、 によって base64 でエンコードされます AWS IoT Core。Lambda 関数はそれをデコードする必要があります。

次の例では、トークンと署名を指定する追加のパラメータを含む username 文字列が含まれています。 

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

オーソライザーを呼び出すには、MQTT とカスタム認証 AWS IoT Core を使用して に接続するデバイスがポート 443 に接続する必要があります。また、 の値を持つ Application Layer Protocol Negotiation (ALPN) TLS 拡張機能mqttと、 AWS IoT Core データエンドポイントのホスト名を持つ Server Name Indication (SNI) 拡張機能を渡す必要があります。潜在的なエラーを回避するために、x-amz-customauthorizer-signature の値は URL エンコードされている必要があります。また、x-amz-customauthorizer-nametoken-key-name の値も URL エンコードすることを強くお勧めします。これらの値の詳細については、「デバイス通信プロトコル」を参照してください。V2 AWS IoT Device SDKsMobile SDKs、および AWS IoT Device Client は、これらの拡張の両方を設定できます。 

MQTT over WebSockets

MQTT over AWS IoT Core を使用して に接続するデバイスは WebSockets 、次の 2 つの方法のいずれかで認証情報を渡すことができます。

  • HTTP UPGRADE リクエストのリクエストヘッダーまたはクエリパラメータを使用して WebSockets 接続を確立します。

  • MQTT CONNECT メッセージの username フィールドと password フィールド経由。

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