AWS IoT Core 使用自訂身分驗證連線至 - AWS IoT Core

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

AWS IoT Core 使用自訂身分驗證連線至

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

HTTPS

使用HTTP發佈API AWS IoT Core 將資料傳送至 的裝置,可以透過請求標頭或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 連線 AWS IoT Core 連線至 的裝置可以透過 MQTT 訊息的 usernamepassword 欄位傳遞憑證。此 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

若要叫用授權方, AWS IoT Core 使用 MQTT和 自訂身分驗證連線至 的裝置必須在連接埠 443 上連線。他們還必須傳遞值為 的應用程式層通訊協定交涉 (ALPN) TLS擴充功能,mqtt而伺服器名稱指示 (SNI) 擴充功能必須傳遞其 AWS IoT Core 資料端點的主機名稱。為了避免潛在的錯誤, x-amz-customauthorizer-signature 的值應URL進行編碼。我們也強烈建議token-key-namex-amz-customauthorizer-name和 URL 的值進行編碼。如需這些值的詳細資訊,請參閱 裝置通訊協定。V2 AWS IoT 裝置 SDK、行動 SDK 和 AWS IoT 裝置用戶端 可以設定這些延伸模組。 

MQTT 超過 WebSockets

AWS IoT Core 使用 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')