

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

# 使用 AWS IoT Core 登入資料提供者授權直接呼叫 AWS 服務
<a name="authorizing-direct-aws"></a>

裝置可以使用 X.509 憑證， AWS IoT Core 使用 TLS 交互身分驗證通訊協定連線至 。 AWS 其他服務不支援以憑證為基礎的身分驗證，但可以使用 [AWS Signature 第 4 版格式](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)的 AWS 登入資料來呼叫。Signature [第 4 版演算法](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)通常要求發起人擁有存取金鑰 ID 和私密存取金鑰。 AWS IoT Core 具有登入資料提供者，可讓您使用內建[的 X.509 憑證](x509-client-certs.html)作為唯一裝置身分來驗證 AWS 請求。這樣就不需要在裝置上儲存存取金鑰 ID 與私密存取金鑰。

憑證提供者會使用 X.509 憑證來對呼叫者進行身分驗證並發出有限權限的臨時安全性字符。權杖可用來簽署和驗證任何 AWS 請求。這種驗證 AWS 請求的方式需要您建立和設定 [AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/service-authorization/latest/reference/id_roles.html)，並將適當的 IAM 政策連接到該角色，以便登入資料提供者可以代表您擔任該角色。如需 AWS IoT Core 和 IAM 的詳細資訊，請參閱 [的身分和存取管理 AWS IoT](security-iam.md)。

 AWS IoT 需要裝置將[伺服器名稱指示 (SNI) 延伸](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)項目傳送至 Transport Layer Security (TLS) 通訊協定，並在 `host_name` 欄位中提供完整的端點地址。該 `host_name` 字段必須包含您正在呼叫的端點，並且它必須是：
+ 由 `aws iot [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) --endpoint-type iot:CredentialProvider` 傳回的 `endpointAddress`

沒有正確 `host_name` 值的裝置所嘗試的連線將會失敗。

下圖說明憑證提供者的工作流程。

![\[AWS IoT Core 登入資料提供者工作流程。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/credentials-provider-diagram.png)


1.  AWS IoT Core 裝置向登入資料提供者提出 HTTPS 請求，以取得安全字符。請求包含用於身分驗證的裝置 X.509 憑證。

1. 登入資料提供者會將請求轉送至 AWS IoT Core 身分驗證和授權模組，以驗證憑證並驗證裝置是否具有請求安全字符的許可。

1. 如果憑證有效且具有請求安全字符的許可，則 AWS IoT Core 身分驗證和授權模組會傳回成功。否則，它會傳送例外到裝置。

1. 在成功驗證憑證後，憑證提供者會叫用 [AWS Security Token ServiceAWS STS](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) 來擔任您為該憑證建立的 IAM 角色。

1. AWS STS 會傳回臨時、有限權限的安全字符給登入資料提供者。

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

1. 裝置使用安全字符來簽署 Signature AWS 第 4 版的 AWS 請求。

1. 請求的服務會叫用 IAM 來驗證簽章有效性並根據附加到您為憑證提供者建立的 IAM 角色的存取政策來授權請求。

1. 如果 IAM 成功驗證簽章有效性並授權請求，表示請求成功。否則，IAM 會傳送例外。

下列章節說明如何使用憑證來取得安全性字符。該流程假設您已經[註冊裝置](register-device.html)且[已建立並啟用自己的憑證](device-certs-your-own.html)。

## 如何使用憑證來取得安全性字符
<a name="authorizing-direct-aws.walkthrough"></a>

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:ThingName` 與 `credentials-iot:ThingTypeName` 當作內容變數新增到安全性字符。憑證提供者會提供 `credentials-iot:AwsCertificateId` 作為上下文變數，即使裝置在請求中未提供物件名稱。您以 `x-amzn-iot-thingname` HTTP 請求標頭的值來傳遞物件名稱。

   這三個變數僅適用於 IAM 政策，不適用於 AWS IoT Core 政策。

1. 請確認執行下一步驟 (建立角色別名) 的使用者擁有傳遞這個新建角色到 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::123456789012:role/your role name"
       }
   }
   ```

1. 建立 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)](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-api.html#roles-modify_max-session-duration-api)。

   如需此 API 的詳細資訊，請參閱 [CreateRoleAlias](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateRoleAlias.html)。

1. 將政策連接至裝置憑證。連接至本裝置憑證的政策，必須授予裝置承擔該角色的許可。您需要授予角色別名 `iot:AssumeRoleWithCertificate` 動作的許可，如下列範例。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iot:AssumeRoleWithCertificate",
               "Resource": "arn:aws:iot:us-east-1:123456789012:rolealias/your role alias"
           }
       ]
   }
   ```

1. 對憑證提供者發出 HTTPS 請求，以取得安全性字符。請提供下列資訊：
   + *憑證*：因為這是一個對 TLS 共同身分驗證的 HTTP 請求，您提出請求時需提供憑證與私有金鑰給用戶端。使用您在註冊憑證時使用的相同憑證和私有金鑰 AWS IoT Core。

     為了確保您的裝置正在與 AWS IoT Core （而不是模擬它的服務） 通訊，請參閱[伺服器身分驗證](x509-client-certs.html#server-authentication)，遵循連結下載適當的 CA 憑證，然後將它們複製到您的裝置。
   + *RoleAlias*：您為憑證提供者所建立的角色別名的名稱。角色別名名稱區分大小寫，且必須符合在其中建立的角色別名 AWS IoT Core。
   + *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](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html)。如需啟用 FIPS 的端點，請參閱 [AWS IoT Core - 登入資料 提供者端點](iot-connect-fips.md#iot-connect-fips-credential)。

   ```
   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 用戶端。
**注意**  
*roleAlias* 名稱區分大小寫，且必須符合在其中建立的角色別名 AWS IoT。

   ```
   curl --cert your certificate --key your 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 登入資料提供者部落格文章，消除裝置中的硬編碼 AWS IoT 登入資料需求](https://aws.amazon.com/blogs/security/how-to-eliminate-the-need-for-hardcoded-aws-credentials-in-devices-by-using-the-aws-iot-credentials-provider/)。