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

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

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

HTTP

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

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

MQTT

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

注記

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

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

username?x-amz-customauthorizer-name=${name}&x-amz-customauthorizer-signature=${sign}&token-name=${token-value}

オーソライザーを呼び出すには、MQTT とカスタム認証を使用して AWS IoT Core に接続するデバイスがポート 443 に接続する必要があります。また、mqtt の値を持つ Application Layer Protocol Negotiation (ALPN) TLS 拡張と、 AWS IoT Core データエンドポイントのホスト名を持つ Server Name Indication (SNI) 拡張を渡す必要があります。これらの値の詳細については、デバイス通信プロトコル を参照してください。  V2 AWS IoT Device SDK、Mobile SDK、および AWS IoT Device Client は、これらの拡張の両方を設定できます。   

MQTT over WebSockets

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

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

  • 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: some-token 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')