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

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

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

裝置可以使用 X.509 憑證來連線到 AWS IoT Core 使用TLS相互驗證通訊協定。其他 AWS 服務不支援憑證型驗證,但可以使用AWS 簽章版本 4 格式的認 AWS 證來呼叫這些服務。簽名版本 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) 延伸模組傳送至「傳輸層安全性」(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. 裝置會使用安全性權杖以簽 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角色的工作階段持續時間上限。如需詳細資訊,請參閱《 AWS Identity and Access Management 使用者指南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-thingnameHTTP題的值傳遞。只有當您在 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 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 服務的要求。如需 end-to-end 示範,請參閱如何使用AWS 安全部落格上的 AWS IoT 認證提供者部落格文章,消除裝置中硬式編碼 AWS 認證的需求。