使用 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-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"}}

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