本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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) 延伸host_name
欄位中提供完整的端點地址。該 host_name
字段必須包含您正在呼叫的端點,並且它必須是:
-
由
aws iot describe-endpoint
傳回的--endpoint-type iot:CredentialProvider endpointAddress
沒有正確 host_name
值的裝置所嘗試的連線將會失敗。
下圖說明憑證提供者的工作流程。
-
AWS IoT Core 裝置向憑證提供者提出安全字符的HTTPS請求。請求包含用於身分驗證的裝置 X.509 憑證。
-
登入資料提供者會將請求轉送至 AWS IoT Core 身分驗證和授權模組,以驗證憑證,並確認裝置具有請求安全字符的許可。
-
如果憑證有效且具有請求安全字符的許可,則 AWS IoT Core 身分驗證和授權模組會傳回成功。否則,它會傳送例外到裝置。
-
在成功驗證憑證後,登入資料提供者會叫用 AWS Security Token Service (AWS STS) 來擔任您為該憑證建立的 IAM 角色。
-
AWS STS 會傳回臨時、有限權限的安全字符給登入資料提供者。
-
憑證提供者傳回安全性字符到裝置。
-
裝置使用安全字符簽署 Signature AWS 第 4 版的 AWS 請求。
-
請求的服務會叫用 IAM 來驗證簽章有效性並根據附加到您為登入資料提供者建立的 IAM 角色的存取政策來授權請求。
-
如果 IAM 成功驗證簽章有效性並授權請求,表示請求成功。否則,IAM 會傳送例外狀況。
下列章節說明如何使用憑證來取得安全性字符。該流程假設您已經註冊裝置且已建立並啟用自己的憑證。
如何使用憑證來取得安全性字符
-
設定登入資料提供者代表您的裝置所擔任的 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:ThingName
與credentials-iot:ThingTypeName
當作內容變數新增到安全性字符。憑證提供者會提供credentials-iot:AwsCertificateId
作為上下文變數,即使裝置在請求中未提供物件名稱。您可以傳遞物件名稱做為x-amzn-iot-thingname
HTTP請求標頭的值。這三個變數僅適用於 IAM 政策,不適用於 AWS IoT Core 政策。
-
-
請確認執行下一步驟 (建立角色別名) 的使用者擁有傳遞這個新建角色到 AWS IoT Core的權限。下列政策同時提供
iam:GetRole
和iam: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
" } } -
建立 AWS IoT Core 角色別名。將直接呼叫 AWS 服務的裝置必須知道連線到 時ARN要使用哪個角色 AWS IoT Core。對角色進行硬式編碼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角色別名所參考之角色的工作階段持續時間上限。如需詳細資訊,請參閱 Identity and Access Management 使用者指南中的 AWS 修改角色最長工作階段持續時間 (AWS API)。
如需此 的詳細資訊API,請參閱 CreateRoleAlias。
-
將政策連接至裝置憑證。連接至本裝置憑證的政策,必須授予裝置承擔該角色的許可。您需要授予角色別名
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" } ] }
-
向登入資料提供者提出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
--keyyour private key
-H "x-amzn-iot-thingname:your thing name
" --cacert AmazonRootCA1.pem https://your endpoint
/role-aliases/your role alias
/credentials此命令會傳回一個包含
accessKeyId
、secretAccessKey
、sessionToken
以及一個過期情況的安全性字符物件。下列JSON物件是curl
命令的範例輸出。{"credentials":{"accessKeyId":"
access key
","secretAccessKey":"secret access key
","sessionToken":"session token
","expiration":"2018-01-18T09:18:06Z"}}然後,您可以使用
accessKeyId
、secretAccessKey
和sessionToken
值來簽署對 AWS 服務的請求。如需 end-to-end示範,請參閱 安全部落格上的如何使用 AWS 登入資料提供者部落格文章,消除裝置中硬式編碼登入 AWS IoT 資料的需求。 AWS -