使用 WebSocket 庫生成預先簽署的請求 - AWS IoT Wireless

使用 WebSocket 庫生成預先簽署的請求

下文顯示如何生成預先簽署的請求,以便您可以使用 WebSocket 庫將請求傳送到服務。

將 WebSocket 請求的政策新增到 IAM 角色

若要使用 WebSocket 通訊協定呼叫網路分析器,您需要將以下政策附加至提出此請求的 AWS Identity and Access Management (IAM) 角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotwireless:StartNetworkAnalyzerStream", "Resource": "*" } ] }

建立預先簽署的 URL

為您的 WebSocket 請求建構 URL,其中包含在您的應用程式和網路分析器之間建立通訊時所需的資訊。若要驗證請求的身分,WebSocket 串流使用 Amazon Signature 第 4 版程序來簽署請求。如需有關 Signature 第 4 版的詳細資訊,請參閱《Amazon Web Services 一般參考》中的簽署 AWS API 請求

若要呼叫網路分析器,請使用 StartNetworkAnalyzerStream 請求 URL。將使用先前提及的 IAM 角色的憑證簽署請求。URL 採用下列格式,並會新增分行符以增加可讀性。

GET wss://api.iotwireless.<region>.amazonaws.com/start-network-analyzer-stream?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=Signature Version 4 credential scope &X-Amz-Date=date &X-Amz-Expires=time in seconds until expiration &X-Amz-Security-Token=security-token &X-Amz-Signature=Signature Version 4 signature &X-Amz-SignedHeaders=host

使用以下值作為 Singature 第 4 版的參數:

  • X-Amz-Algorithm:您在簽署程序中使用的演算法。唯一有效的值為 AWS4-HMAC-SHA256

  • X-Amz-Credential:透過串連存取金鑰 ID 和憑證範圍元件所形成的以斜線 (「/」) 分隔的字串。憑證範圍包括 YYYYMMDD 格式的日期、AWS 區域、服務名稱和特殊終止字串 (aws4_request)。

  • X-Amz-Date:簽章的建立日期與時間。依照《Amazon Web Services 一般參考》中 Signature 第 4 版中的處理日期指示生成日期與時間。

  • X-Amz-Expires:憑證在逾期前尚有多少時間 (以秒為單位)。最大值為 300 秒 (5 分鐘)。

  • X-Amz-Security-Token:(選用) 用於臨時安全憑證的 Signature 第 4 版字符。如果您指定此參數,請將其包含在正式請求中。如需詳細資訊,請參閱《AWS Identity and Access Management 使用者指南》中的請求臨時安全憑證

  • X-Amz-Signature:您為請求所生成的 Signature 第 4 版簽章。

  • X-Amz-SignedHeaders:在為請求建立簽章時,所簽署的標頭。唯一有效的值為 host

建構請求 URL 以及建立 Signature 第 4 版簽章

若要為請求建構 URL 及建立 Signature 第 4 版簽章,請使用下列步驟。這些範例是虛擬程式碼。

建立字串,其中包括來自您的請求的資訊 (使用標準化格式)。這可確保當 AWS 收到請求時,可以計算出您在 任務 3:計算簽章 中計算出的相同簽章。如需詳細資訊,請參閱《Amazon Web Services 一般參考》中的為 Signature 第 4 版建立正式請求

  1. 在應用程式中定義請求的變數。

    # HTTP verb method = "GET" # Service name service = "iotwireless" # AWS 區域 region = "AWS 區域" # Service streaming endpoint endpoint = "wss://api.iotwireless.region.amazonaws.com" # Host host = "api.iotwireless.<region>.amazonaws.com" # Date and time of request amz-date = YYYYMMDD'T'HHMMSS'Z' # Date without time for credential scope datestamp = YYYYMMDD
  2. 建立正式的 URI (統一資源識別符)。正式 URI 是介於網域與查詢字串之間的部分 URI。

    canonical_uri = "/start-network-analyzer-stream"
  3. 建立正式標頭和已簽章標頭。請注意正式標頭中的結尾 \n

    • 附加小寫標頭名稱,後面接著冒號。

    • 為該標頭附加逗號分隔的值清單。不要在有多個值的標頭中排序值。

    • 附加新的一行 (\n)。

    canonical_headers = "host:" + host + "\n" signed_headers = "host"
  4. 演算法必須符合雜湊演算法。您必須使用 SHA-256。

    algorithm = "AWS4-HMAC-SHA256"
  5. 建立憑證的範圍,將衍生的金鑰範圍限定於提出請求的日期、區域和服務。

    credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
  6. 建立正式查詢字串。查詢字串值必須是 URL 編碼並以名稱排序。

    • 依照字元字碼指標的參數名稱遞增排序。​具有重複名稱的參數應依數值排序。例如,以大寫字母 F 開頭的參數名稱,放在以小寫字母 b 開頭的參數名稱之前。

    • URI 編碼不能執行 RFC 3986 所定義的任何未預留字元:A–Z、a–z、0–9、連字號 (-)、底線 (_)、句點 ( . ) 和波狀符號 ( ~ )。

    • 對所有其他含有 %XY 的字元執行百分比編碼,其中 X 和 Y 是十六進位字元 (0-9 和大寫 A-F)。例如,空間字元必須編碼為 %20 (而非像有些編碼結構描述那樣使用「+」),而延伸的 UTF-8 字元必須採用 %XY%ZA%BC 格式。

    • 對參數值中的任何等於 (=) 字元進行雙倍編碼。

    canonical_querystring = "X-Amz-Algorithm=" + algorithm canonical_querystring += "&X-Amz-Credential="+ URI-encode(access key + "/" + credential_scope) canonical_querystring += "&X-Amz-Date=" + amz_date canonical_querystring += "&X-Amz-Expires=300" canonical_querystring += "&X-Amz-Security-Token=" + token canonical_querystring += "&X-Amz-SignedHeaders=" + signed_headers canonical_querystring += "&language-code=en-US&media-encoding=pcm&sample-rate=16000"
  7. 建立承載的雜湊。對於 GET 請求,承載為空字串。

    payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
  8. 結合所有元素來建立正式請求。

    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash

要簽署的字串包含有關您的請求的中繼資料。您在下一個步驟計算請求簽章時,使用此字串登入。如需詳細資訊,請參閱《Amazon Web Services 一般參考》中的建立 Signature 第 4 版的登入字串

string_to_sign=algorithm + "\n" + amz_date + "\n" + credential_scope + "\n" + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()

從您的 AWS 私密存取金鑰衍生簽署金鑰。為了提供更大程度的保護,衍生的金鑰有專屬的日期、服務和 AWS 區域。您使用衍生的金鑰來簽署請求。如需詳細資訊,請參閱《Amazon Web Services 一般參考》中的為 AWS Signature 第 4 版計算簽章

此程式碼假設您已實作 GetSignatureKey 函數來衍生簽署金鑰。如需詳細資訊和範例函數,請參閱《Amazon Web Services 一般參考》中的如何衍生 Signature 第 4 版的簽署密鑰範例

函數 HMAC(key, data) 代表 HMAC-SHA256 函數,它會以二進位格式傳回結果。

#Create the signing key signing_key = GetSignatureKey(secret_key, datestamp, region, service) # Sign the string_to_sign using the signing key signature = HMAC.new(signing_key, (string_to_sign).Encode("utf-8"), Sha256()).HexDigest

您計算簽章之後,請將簽章新增到查詢字串。如需詳細資訊,請參閱《Amazon Web Services 一般參考》中的新增簽章至請求

#Add the authentication information to the query string canonical_querystring += "&X-Amz-Signature=" + signature # Sign the string_to_sign using the signing key request_url = endpoint + canonical_uri + "?" + canonical_querystring

後續步驟

您現在可以使用請求 URL 與您的 WebSocket 程式庫,以便向服務提出請求並觀察訊息。如需詳細資訊,請參閱WebSocket 訊息和狀態碼