本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 device certificate key pair
-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 -