使用 AWS IoT Core 登入資料提供者授權對 AWS 服務的直接呼叫 - AWS IoT Core

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

使用 AWS IoT Core 登入資料提供者授權對 AWS 服務的直接呼叫

裝置可以使用 X.509 憑證, AWS IoT Core 使用TLS交互身分驗證通訊協定連線至 。 AWS 其他服務不支援以憑證為基礎的身分驗證,但可以使用 AWS Signature 第 4 版格式的 AWS 登入資料來呼叫。Signature 第 4 版演算法通常要求發起人擁有存取金鑰 ID 和私密存取金鑰。 AWS IoT Core 具有登入資料提供者,可讓您使用內建 X.509 憑證做為唯一裝置身分來驗證 AWS 請求。這樣就不需要在裝置上儲存存取金鑰 ID 與私密存取金鑰。

憑證提供者會使用 X.509 憑證來對呼叫者進行身分驗證並發出有限權限的臨時安全性字符。權杖可用來簽署和驗證任何 AWS 請求。驗證 AWS 請求的方式需要您建立和設定 AWS Identity and Access Management (IAM) 角色,並將適當的IAM政策連接到該角色,以便登入資料提供者可以代表您擔任該角色。如需 AWS IoT Core 和 IAM 的更多相關資訊,請參閱的身分和存取管理 AWS IoT

AWS IoT 要求裝置將伺服器名稱指示 (SNI) 延伸項目傳送至 Transport Layer Security (TLS) 通訊協定,並在 host_name 欄位中提供完整的端點地址。該 host_name 字段必須包含您正在呼叫的端點,並且它必須是:

  • aws iot describe-endpoint --endpoint-type iot:CredentialProvider 傳回的 endpointAddress

沒有正確 host_name 值的裝置所嘗試的連線將會失敗。

下圖說明憑證提供者的工作流程。

AWS IoT Core 登入資料提供者工作流程。
  1. AWS IoT Core 裝置向憑證提供者提出安全字符的HTTPS請求。請求包含用於身分驗證的裝置 X.509 憑證。

  2. 登入資料提供者會將請求轉送至 AWS IoT Core 身分驗證和授權模組,以驗證憑證,並確認裝置具有請求安全字符的許可。

  3. 如果憑證有效且具有請求安全字符的許可,則 AWS IoT Core 身分驗證和授權模組會傳回成功。否則,它會傳送例外到裝置。

  4. 在成功驗證憑證後,登入資料提供者會叫用 AWS Security Token Service (AWS STS) 來擔任您為該憑證建立的 IAM 角色。

  5. AWS STS 會傳回臨時、有限權限的安全字符給登入資料提供者。

  6. 憑證提供者傳回安全性字符到裝置。

  7. 裝置使用安全字符簽署 Signature AWS 第 4 版的 AWS 請求。

  8. 請求的服務會叫用 IAM 來驗證簽章有效性並根據附加到您為登入資料提供者建立的 IAM 角色的存取政策來授權請求。

  9. 如果 IAM 成功驗證簽章有效性並授權請求,表示請求成功。否則,IAM 會傳送例外狀況。

下列章節說明如何使用憑證來取得安全性字符。該流程假設您已經註冊裝置已建立並啟用自己的憑證

如何使用憑證來取得安全性字符

  1. 設定登入資料提供者代表您的裝置所擔任的 IAM 角色。將下列信任政策連接至該角色。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "credentials.iot.amazonaws.com"}, "Action": "sts:AssumeRole" } }

    針對您要呼叫的每個 AWS 服務,將存取政策連接至角色。憑證提供者支援以下政策變數:

    • credentials-iot:ThingName

    • credentials-iot:ThingTypeName

    • credentials-iot:AwsCertificateId

    當裝置提供其對 AWS 服務的請求中的物件名稱時,憑證提供者會將 credentials-iot:ThingNamecredentials-iot:ThingTypeName 當作內容變數新增到安全性字符。憑證提供者會提供 credentials-iot:AwsCertificateId 作為上下文變數,即使裝置在請求中未提供物件名稱。您可以傳遞物件名稱做為x-amzn-iot-thingnameHTTP請求標頭的值。

    這三個變數僅適用於 IAM 政策,不適用於 AWS IoT Core 政策。

  2. 請確認執行下一步驟 (建立角色別名) 的使用者擁有傳遞這個新建角色到 AWS IoT Core的權限。下列政策同時提供 iam:GetRoleiam:PassRole許可給 AWS 使用者。iam:GetRole 許可讓使用者取得有關您剛建立的角色資訊。iam:PassRole 許可可讓使用者將角色傳遞給另一個 AWS 服務。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your AWS 帳戶 id:role/your role name" } }
  3. 建立 AWS IoT Core 角色別名。將直接呼叫 AWS 服務的裝置必須知道連線到 時ARN要使用哪個角色 AWS IoT Core。對角色進行硬式編碼ARN不是很好的解決方案,因為它需要您在角色ARN變更時更新裝置。更好的解決方案是使用 CreateRoleAliasAPI來建立指向角色 的角色別名ARN。如果角色ARN變更,您只需更新角色別名。無需在裝置上進行變更。這API需要下列參數:

    roleAlias

    必要。辨識角色別名的任意字串。可作為在角色別名資料模型中的主索引鍵功能。它包含 1-128 字元且必須僅包含英數字元和 =、@ 和 - 符號。可使用大寫和小寫字母字元。

    roleArn

    必要。ARN 角色別名所參考的角色的 。

    credentialDurationSeconds

    選用。憑證有效期間 (秒)。最低值為 900 秒 (15 分鐘)。最高值為 43,200 秒 (12 小時)。預設值為 3,600 秒 (1 小時)。

    重要

    AWS IoT Core 登入資料提供者可以發出最長存留期為 43,200 秒 (12 小時) 的登入資料。讓憑證有效時間長達 12 小時,有助於藉由快取憑證更長的時間,減少呼叫憑證提供者的次數。

    credentialDurationSeconds值必須小於或等於IAM角色別名所參考之角色的工作階段持續時間上限。如需詳細資訊,請參閱 Identity and Access Management 使用者指南中的 AWS 修改角色最長工作階段持續時間 (AWS API)

    如需此 的詳細資訊API,請參閱 CreateRoleAlias

  4. 將政策連接至裝置憑證。連接至本裝置憑證的政策,必須授予裝置承擔該角色的許可。您需要授予角色別名 iot:AssumeRoleWithCertificate 動作的許可,如下列範例。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"iot:AssumeRoleWithCertificate", "Resource":"arn:aws:iot:your region:your_aws_account_id:rolealias/your role alias" } ] }
  5. 向登入資料提供者提出HTTPS請求,以取得安全字符。請提供下列資訊:

    • 憑證:由於這是透過TLS相互身分驗證的HTTP請求,因此您必須在提出請求時提供憑證和私有金鑰給用戶端。使用您向 註冊憑證時使用的相同憑證和私有金鑰 AWS IoT Core。

      若要確定您的裝置正在與 AWS IoT Core (而不是模擬它的服務) 通訊,請參閱伺服器身分驗證,遵循連結下載適當的 CA 憑證,然後將其複製到您的裝置。

    • RoleAlias:您為登入資料提供者建立的角色別名名稱。

    • ThingName:您在註冊物件時建立的 AWS IoT Core 物件名稱。這會傳遞為 x-amzn-iot-thingname HTTP 標頭的值。只有在 AWS IoT Core 或 政策中使用物件屬性作為IAM政策變數時,才需要此值。

      注意

      ThingName 您在 中提供的 x-amzn-iot-thingname 必須符合指派給憑證的 AWS IoT 物件資源名稱。如果不符合,則會傳回 403 錯誤。

    在 中執行下列命令 AWS CLI ,以取得您 的登入資料提供者端點 AWS 帳戶。如需此 的詳細資訊API,請參閱 DescribeEndpoint。如需FIPS啟用 的端點,請參閱 AWS IoT Core- 登入資料提供者端點

    aws iot describe-endpoint --endpoint-type iot:CredentialProvider

    下列JSON物件是 describe-endpoint命令的範例輸出。它包含用來要求安全字符的 endpointAddress

    { "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com" }

    使用端點向登入資料提供者提出HTTPS請求,以傳回安全字符。下列範例命令使用 curl,但您可以使用任何HTTP用戶端。

    curl --cert your certificate --key your private key -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-aliases/your role alias/credentials

    此命令會傳回一個包含 accessKeyIdsecretAccessKeysessionToken 以及一個過期情況的安全性字符物件。下列JSON物件是 curl命令的範例輸出。

    {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}

    然後,您可以使用 accessKeyIdsecretAccessKeysessionToken值來簽署對 AWS 服務的請求。如需 end-to-end示範,請參閱 安全部落格上的如何使用 AWS 登入資料提供者部落格文章,消除裝置中硬式編碼登入 AWS IoT 資料的需求AWS