使用自訂驗證連線到 AWS IoT Core - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用自訂驗證連線到 AWS IoT Core

設備可以通 AWS IoT Core 過使用自定義身份驗證與任何 AWS IoT Core 支持設備消息傳遞的協議進行連接。如需受支援通訊協定的詳細資訊,請參閱 裝置通訊協定。  傳遞至授權方 Lambda 函數的連線資料取決於您使用的通訊協定。如需建立授權方 Lambda 函數的詳細資訊,請參閱 定義您的 Lambda 函數。以下各節說明如何使用每個支援的通訊協定來連線,以便進行身分驗證。

HTTPS

使用 HTTPPublish 傳送資料至 AWS IoT Core 的裝置API可以透過要求標頭或要HTTPPOST求中的查詢參數來傳遞認證。裝置可以指定要使用 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連線連線的裝置可以透過MQTT訊息的usernamepassword欄位傳遞認證。 AWS IoT Core 此 username 值也可以選擇包含一個查詢字串,將其他值 (包括字符、簽章和授權方名稱) 傳遞給您的授權方。如果您想要使用字符型身分驗證結構描述,而不是 usernamepassword 值,則可使用此查詢字串。 

注意

密碼欄位中的資料是由基 64 編碼。 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 上連線。它們也必須傳遞值為的應用程式層通訊協定交涉 (ALPN) TLS 延伸模組,mqtt且其 AWS IoT Core 資料端點的主機名稱為「伺服器名稱指示」(SNI) 延伸模組。為了避免潛在的錯誤,x-amz-customauthorizer-signature應對的值URL進行編碼。我們也強烈建議您token-key-name將值x-amz-customauthorizer-name和URL編碼。如需這些值的詳細資訊,請參閱 裝置通訊協定。V2 AWS IoT 裝置 SDK、行動 SDK 和 AWS IoT 裝置用戶端 可以設定這些延伸模組。 

MQTT以上 WebSockets

AWS IoT Core 透過使用 MQTT over 連線的裝置 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')