授權使用 AWS IoT Core 憑證提供者直接呼叫 AWS 服務 - AWS IoT Core

授權使用 AWS IoT Core 憑證提供者直接呼叫 AWS 服務

裝置會透過 TLS 交互身分驗證通訊協定,使用 X.509 憑證連接至 AWS IoT Core。其他 AWS 服務不支援憑證型身分驗證,但可以使用 AWS 憑證 (採用 AWS 簽章第 4 版格式) 進行呼叫。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 的 Identity and Access Management

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 ServiceAWS STS 來擔任您為該憑證建立的 IAM 角色。

  5. AWS STS 會傳回有限權限的臨時安全性字符給憑證提供者。

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

  7. 裝置使用安全性字符,搭配 AWS Signature 第 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-thingname HTTP 請求標頭的值來傳遞物件名稱。

    這三個變數僅適用於 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 服務的裝置,在連接至 AWS IoT Core 時,必須知道該使用何角色 ARN。硬式編碼的角色 ARN 不是好的解決方案,因為您需要隨角色 ARN 變更而更新裝置。更好的解決方案是使用 CreateRoleAlias API 來建立指向該角色 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 角色最大工作階段持續時間。

    如需此 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 (而非冒充的服務) 通訊,請參閱伺服器身分驗證,點選所列連結以下載相應的 憑證授權機構憑證,然後將其複製到您的裝置。

    • RoleAlias:您為憑證提供者所建立的角色別名的名稱。

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

      注意

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

    在 AWS CLI 中執行下列命令,為您的 AWS 帳戶 取得憑證提供者端點。如需此 API 行為的詳細資訊,請參閱 DescribeEndpoint

    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 device certificate key pair -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"}}

    然後,您可以使用 accessKeyIdsecretAccessKey、和 sessionToken 值,來簽署對 AWS 服務的請求。如需端對端示範,請參閱「AWS 安全部落格」 上的如何使用 AWS IoT 憑證提供者來免除裝置中的硬編碼 AWS 憑證部落格文章。