

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

# 身分驗證
<a name="authentication"></a>

身分驗證是一種機制，您可以用來驗證用戶端或伺服器的身分。伺服器身分驗證是裝置或其他用戶端確保與實際 AWS IoT 端點通訊的程序。用戶端身分驗證是裝置或其他用戶端自行進行身分驗證的程序 AWS IoT。

## X.509 憑證概觀
<a name="x509-certificate-overview"></a>

X.509 憑證為數位憑證，其依據 [X.509 公有金鑰基礎設施標準](https://en.wikipedia.org/wiki/X.509)，將公有金鑰與憑證內含的身分建立關聯。X.509 憑證由稱為認證機構 (CA) 的可信任實體發行。CA 負責維護一個或多個稱為憑證授權機構憑證的特殊憑證，用以發行 X.509 憑證。僅認證機構可存取憑證授權機構憑證。X.509 憑證鏈同時用於用戶端的伺服器身分驗證，和伺服器的用戶端身分驗證。

# 伺服器驗證
<a name="server-authentication"></a>

當您的裝置或其他用戶端嘗試連線時 AWS IoT Core AWS IoT Core ，伺服器會傳送 X.509 憑證，供您的裝置用來驗證伺服器。身分驗證是透過在 TLS 層驗證 [ X.509 憑證鏈](x509-client-certs.md)進行。這與您造訪 HTTPS URL 時瀏覽器所使用的方法相同。如果您要使用自己的憑證授權單位的憑證，請參閱 [管理您的憑證授權機構憑證](manage-your-CA-certs.md)。

當您的裝置或其他用戶端建立與端點的 AWS IoT Core TLS 連線時， 會 AWS IoT Core 呈現憑證鏈，供裝置用來驗證其是否正在與 通訊 AWS IoT Core ，而非其他伺服器模擬 AWS IoT Core。顯示的鏈取決於裝置所連接端點的類型，以及在 TLS 交握期間用戶端和 AWS IoT Core 交涉[的密碼套件](transport-security.md)的組合。

## 端點類型
<a name="endpoint-types"></a>

AWS IoT Core 支援 `iot:Data-ATS`。 `iot:Data-ATS`端點提供由 [Amazon Trust Services](https://www.amazontrust.com/repository/) CA 簽署的伺服器憑證。

ATS 端點呈現的憑證由 Starfield 交叉簽署。某些 TLS 用戶端實作需要驗證信任根，並要求在用戶端的信任存放區中安裝 Starfield 憑證授權機構憑證。

**警告**  
不建議使用雜湊整個憑證 (包括發行者名稱等) 的憑證關聯方法，因為這會導致憑證驗證失敗，因為我們提供的 ATS 憑證是由 Starfield 交叉簽署，且具有不同的發行者名稱。

**重要**  
使用`iot:Data-ATS`端點。Symantec 和 Verisign 憑證已棄用，不再受 支援 AWS IoT Core。

您可以使用 `describe-endpoint` 命令建立 ATS 端點。

```
aws iot describe-endpoint --endpoint-type iot:Data-ATS
```

`describe-endpoint` 命令會傳回下列格式的端點。

```
account-specific-prefix.iot.your-region.amazonaws.com
```

**注意**  
第一次呼叫 `describe-endpoint` 時，會建立一個端點。所有後續呼叫 `describe-endpoint` 會傳回相同的端點。

**注意**  
若要在 AWS IoT Core 主控台中查看您的`iot:Data-ATS`端點，請選擇**設定**。主控台只會顯示 `iot:Data-ATS` 端點。

### `IotDataPlaneClient` 使用適用於 Java 的 AWS 開發套件建立
<a name="java-client"></a>

若要建立`IotDataPlaneClient`使用 `iot:Data-ATS`端點的 ，您必須執行下列動作。
+ 使用 [DescribeEndpoint](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeEndpoint.html) API 建立 `iot:Data-ATS` 端點。
+ 在建立 `IotDataPlaneClient` 時指定該端點。

下列範例會同時執行這些操作。

```
public void setup() throws Exception {
        IotClient client = IotClient.builder().credentialsProvider(CREDENTIALS_PROVIDER_CHAIN).region(Region.US_EAST_1).build();
        String endpoint = client.describeEndpoint(r -> r.endpointType("iot:Data-ATS")).endpointAddress();
        iot = IotDataPlaneClient.builder()
                                .credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
                                .endpointOverride(URI.create("https://" + endpoint))
                                .region(Region.US_EAST_1)
                                .build();
}
```

## 伺服器身分驗證的憑證授權機構憑證
<a name="server-authentication-certs"></a>

根據您正在使用的資料端點類型，以及您已交涉的密碼套件， AWS IoT Core 伺服器身分驗證憑證會由下列其中一個根 CA 憑證簽署：

**Amazon Trust Services 端點 (首選)**

**注意**  
您可能需要在這些連結上按一下滑鼠右鍵，然後選取 **Save link as...** (另存連結為...) 以將這些憑證儲存為檔案。
+ RSA 2048 位元金鑰：[https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem)。
+ RSA 4096 位元金鑰：Amazon Root CA 2。保留以供日後使用。
+ ECC 256 位元金鑰：[https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem)。
+ ECC 384 位元金鑰：Amazon Root CA 4。保留以供日後使用。

這些憑證都是由 [Starfield 根憑證授權機構憑證](https://www.amazontrust.com/repository/SFSRootCAG2.pem)交叉簽署的。所有新的 AWS IoT Core 區域，從 2018 年 5 月 9 日 AWS IoT Core 在亞太區域 （孟買） 區域推出 開始，僅提供 ATS 憑證。

**VeriSign 端點 (舊版)**
+ RSA 2048 位元金鑰：[VeriSign 類別 3 公開主要 G5 根憑證授權機構憑證](https://www.digicert.com/kb/digicert-root-certificates.htm)

## 伺服器身分驗證準則
<a name="server-authentication-guidelines"></a>

有許多變數會影響裝置驗證 AWS IoT Core 伺服器驗證憑證的能力。例如，裝置的記憶體可能受限，無法保存所有可能的根憑證授權機構憑證，或者裝置可能實作非標準的憑證驗證方法。基於這些原因，我們建議您遵循以下準則：
+ 我們建議您使用 ATS 端點並安裝所有支援的 Amazon Root CA 憑證。
+ 如果您無法在裝置上存放全部這些憑證，而且您的裝置未使用 ECC 式驗證，則可以略過 [https://www.amazontrust.com/repository/AmazonRootCA3.pem](https://www.amazontrust.com/repository/AmazonRootCA3.pem) 和 [https://www.amazontrust.com/repository/AmazonRootCA4.pem](https://www.amazontrust.com/repository/AmazonRootCA4.pem) 4 ECC 憑證。如果您的裝置未實作 RSA 式憑證驗證，則可以略過 [https://www.amazontrust.com/repository/AmazonRootCA1.pem](https://www.amazontrust.com/repository/AmazonRootCA1.pem) 和 [https://www.amazontrust.com/repository/AmazonRootCA2.pem](https://www.amazontrust.com/repository/AmazonRootCA2.pem) RSA 憑證。您可能需要在這些連結上按一下滑鼠右鍵，然後選取 **Save link as...** (另存連結為...) 以將這些憑證儲存為檔案。
+ 如果您在連線至 ATS 端點時遇到伺服器憑證驗證問題，請嘗試將相關的交叉簽署 Amazon Root 憑證授權機構憑證新增至信任存放區。您可能需要在這些連結上按一下滑鼠右鍵，然後選取 **Save link as...** (另存連結為...) 以將這些憑證儲存為檔案。
  + [交叉簽署 Amazon Root CA 1](https://www.amazontrust.com/repository/G2-RootCA1.pem)
  + [交叉簽署的 Amazon Root CA 2](https://www.amazontrust.com/repository/G2-RootCA2.pem) - 預留以供日後使用。
  + [交叉簽署 Amazon Root CA 3](https://www.amazontrust.com/repository/G2-RootCA3.pem)
  + [交叉簽署的 Amazon Root CA 4 - 預留以供日後使用。](https://www.amazontrust.com/repository/G2-RootCA4.pem)
+ 如果您遇到伺服器憑證驗證問題，則您的裝置可能需要明確地信任根 CA。嘗試將 [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem) 新增到您的信任存放區。
+ 如果您在執行上述步驟後仍然遇到問題，請聯絡 [AWS 開發人員支援](https://aws.amazon.com/premiumsupport/plans/developers/)。

**注意**  
憑證授權機構憑證在過期日期之後，即無法用於驗證伺服器的憑證。憑證授權機構憑證過期日期之前，可能需要進行替代。請確認您能夠於所有裝置或用戶端更新根憑證授權機構憑證，以維持連線能力並取得最新的安全最佳實務。

**注意**  
在裝置程式碼 AWS IoT Core 中連線至 時，請將憑證傳遞至您用來連線的 API。您使用的 API 會因 SDK 而異。如需詳細資訊，請參閱 [AWS IoT Core 裝置開發套件](iot-sdks.md)。

# 用戶端身分驗證
<a name="client-authentication"></a>

AWS IoT 支援三種類型的身分主體進行裝置或用戶端身分驗證：
+ [X.509 用戶端憑證](x509-client-certs.md)
+ [IAM 使用者、群組和角色](iam-users-groups-roles.md)
+ [Amazon Cognito 身分](cognito-identities.md)

這些身分可用於裝置、行動裝置、網頁或桌面應用程式。使用者輸入 AWS IoT 命令列界面 (CLI) 命令甚至可以使用它們。一般而言， AWS IoT 裝置使用 X.509 憑證，而行動應用程式則使用 Amazon Cognito 身分。Web 和桌面應用程式則使用 IAM 或聯合身分。 AWS CLI 命令會使用 IAM。如需 IAM 身分的詳細資訊，請參閱[的身分和存取管理 AWS IoT](security-iam.md)。

# X.509 用戶端憑證
<a name="x509-client-certs"></a>

X.509 憑證 AWS IoT 提供驗證用戶端和裝置連線的能力。用戶端憑證必須先向 註冊 AWS IoT ，用戶端才能與 通訊 AWS IoT。您可以在相同 中的多個 AWS 帳戶中註冊用戶端憑證 AWS 區域 ，以便在同一區域中的 AWS 帳戶之間移動裝置。如需詳細資訊，請參閱 [在具有多帳戶註冊的多個 AWS 帳戶中使用 X.509 用戶端憑證](#multiple-account-cert)。

我們建議為每個裝置或用戶端提供唯一的憑證，藉此更精細地管理用戶端，包括憑證撤銷作業。裝置必須支援憑證的輪換和替代，以確保憑證過期時操作順暢。

如需使用 X.509 憑證支援數個裝置的詳細資訊，請參閱 [裝置佈建](iot-provision.md)，以檢閱 AWS IoT 支援的不同憑證管理和佈建選項。

**AWS IoT 支援這些類型的 X.509 用戶端憑證：**
+  產生的 X.509 憑證 AWS IoT
+  由向 註冊的 CA 簽署的 X.509 憑證 AWS IoT。
+  未註冊 AWS IoT且有 CA 簽署的 X.509 憑證。

本節說明如何在 AWS IoT中管理 X.509 憑證。您可以使用 AWS IoT 主控台或 AWS CLI 來執行這些憑證操作：
+ [建立 AWS IoT 用戶端憑證](device-certs-create.md)
+ [建立您自己的用戶端憑證](device-certs-your-own.md)
+ [註冊用戶端憑證](register-device-cert.md)
+ [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)
+ [撤銷用戶端憑證](revoke-ca-cert.md)

如需執行這些操作之 AWS CLI 命令的詳細資訊，請參閱 [AWS IoT CLI 參考](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/index.html)。

## 使用 X.509 用戶端憑證
<a name="x509-client-cert-basics"></a>

X.509 憑證會驗證用戶端和裝置的連線 AWS IoT。相較於其他識別和身分驗證機制，X.509 憑證具備多種好處。X.509 憑證可讓裝置使用非對稱金鑰。例如，您可以將私密金鑰燒錄到裝置上的安全儲存空間，這樣敏感的密碼編譯資料永遠不會離開裝置。由於私有金鑰絕對不會離開裝置，因此 X.509 憑證提供更勝於其他機制 (例如使用者名稱和密碼或承載符記) 的強大用戶端身分驗證。

AWS IoT 會使用 TLS 通訊協定的用戶端身分驗證模式來驗證用戶端憑證。TLS 支援多種程式設計語言與作業系統，且普遍用於加密資料。在 TLS 用戶端身分驗證中， AWS IoT 會請求 X.509 用戶端憑證，並根據憑證 AWS 帳戶 登錄檔驗證憑證的狀態。然後，它會向用戶端挑戰與憑證中包含的公有金鑰對應的私有金鑰的擁有權證明。 AWS IoT 要求用戶端將[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)模組傳送至 Transport Layer Security (TLS) 通訊協定。如需設定 SNI 延伸模組的詳細資訊，請參閱 [中的傳輸安全性 AWS IoT Core](transport-security.md)。

為了促進安全且一致的用戶端連線至 AWS IoT 核心，X.509 用戶端憑證必須擁有下列項目：
+ 在 AWS IoT Core 中註冊。如需詳細資訊，請參閱[註冊用戶端憑證](register-device-cert.md)。
+ 狀態為 `ACTIVE`。如需詳細資訊，請參閱[啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)。
+ 尚未到達憑證過期日期。

您可以建立使用 Amazon 根 CA 的用戶端憑證，也可以使用由其他憑證授權單位 (CA) 簽署的自有用戶端憑證。如需使用 AWS IoT 主控台建立使用 Amazon 根 CA 的憑證的詳細資訊，請參閱 [建立 AWS IoT 用戶端憑證](device-certs-create.md)。如需使用您自己的 X.509 憑證的詳細資訊，請參閱 [建立您自己的用戶端憑證](device-certs-your-own.md)。

對於有憑證授權機構憑證簽署的憑證，其過期日期與時間會於憑證建立時設定。產生的 X.509 憑證會在 2049 年 12 月 31 日 UTC 午夜 (2049-12-31T23：59：59Z AWS IoT 過期）。

AWS IoT Device Defender 可以對支援常見 IoT 安全最佳實務的 AWS 帳戶 和裝置執行稽核。這包括管理您的 CA 或 Amazon 根 CA 簽署的 X.509 憑證過期日期。如需管理憑證過期日期的詳細資訊，請參閱[裝置憑證過期](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-approaching-expiration.html)和 [CA 憑證過期](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-ca-cert-approaching-expiration.html)。

在官方 AWS IoT 部落格上，如需深入了解裝置憑證輪換的管理，以及安全最佳實務，請參閱[如何使用 管理 IoT 裝置憑證輪換 AWS IoT](https://aws.amazon.com/blogs/iot/how-to-manage-iot-device-certificate-rotation-using-aws-iot/)。

## 在具有多帳戶註冊的多個 AWS 帳戶中使用 X.509 用戶端憑證
<a name="multiple-account-cert"></a>

多帳戶註冊可讓您在相同區域或不同區域的 AWS 帳戶之間移動裝置。您可以在生產前帳戶中註冊、測試和設定裝置，然後在生產帳戶中註冊並使用相同的裝置和裝置憑證。您也可以在裝置上註冊用戶端憑證，或在沒有註冊 CA 的情況下註冊裝置憑證 AWS IoT。如需詳細資訊，請參閱[註冊未註冊 CA 所簽署的用戶端憑證 (CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)。

**注意**  
`iot:Data-ATS`、`iot:Data` (舊式)、`iot:Jobs` 及 `iot:CredentialProvider` 端點類型上支援用於多帳戶註冊的憑證。如需 AWS IoT 裝置端點的詳細資訊，請參閱 [AWS IoT 裝置資料和服務端點](iot-connect-devices.md#iot-connect-device-endpoints)。

使用多帳戶註冊的裝置必須將[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)項目傳送至 Transport Layer Security (TLS) 通訊協定，並在連線至 時提供 `host_name` 欄位中的完整端點地址 AWS IoT。 AWS IoT 會使用 中的端點地址，將連線`host_name`路由至正確的 AWS IoT 帳戶。未在 `host_name` 中傳送有效端點位址的現有裝置將繼續運作，但無法使用需要此資訊的功能。如需 SNI 延伸模組的詳細資訊，以及如何識別 `host_name` 欄位的端點位址，請參閱 [中的傳輸安全性 AWS IoT Core](transport-security.md)。

**使用多帳戶註冊**

1. 您可以在有 CA 的情況下註冊裝置憑證。您可以在 `SNI_ONLY` 模式下在多個帳戶中註冊簽署 CA，並使用該 CA 將相同的用戶端憑證註冊到多個帳戶。如需詳細資訊，請參閱[在 SNI\$1ONLY 模式下註冊 CA 憑證 (CLI) - 建議](manage-your-CA-certs.md#register-CA-cert-SNI-cli)。

1. 您可以在沒有 CA 的情況下註冊裝置憑證。請參閱 [註冊未註冊 CA 所簽署的用戶端憑證 (CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)。註冊 CA 非必須。您不需要註冊簽署裝置憑證的 CA AWS IoT。

## 支援的憑證簽署演算法 AWS IoT
<a name="x509-cert-algorithms"></a>

AWS IoT 支援下列憑證簽署演算法：
+ SHA256WITHRSA
+ SHA384WITHRSA
+ SHA512WITHRSA
+ SHA256WITHRSAANDMGF1 (RSASSA-PSS)
+ SHA384WITHRSAANDMGF1 (RSASSA-PSS)
+ SHA512WITHRSAANDMGF1 (RSASSA-PSS)
+ DSA\$1WITH\$1SHA256
+ ECDSA-WITH-SHA256
+ ECDSA-WITH-SHA384
+ ECDSA-WITH-SHA512

如需憑證身分驗證和安全性的詳細資訊，請參閱[裝置憑證金鑰品質](https://docs.aws.amazon.com/iot-device-defender/latest/devguide/audit-chk-device-cert-key-quality.html)。

**注意**  
憑證簽署請求 (CSR) 必須包含公開金鑰。該金鑰可以是公開金鑰 (長度至少 2,048 位元) 或 ECC 金鑰 (至少 NIST P-256、NIST P-384 或 NIST P-521 曲線)。如需詳細資訊，請參閱《*AWS IoT API 參考指南*》中的 [CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCertificateFromCsr.html)。

## 支援的金鑰演算法 AWS IoT
<a name="x509-cert-key-algorithms"></a>

下表顯示如何支援金鑰演算法：


****  

| 金鑰演算法 | 憑證簽署演算法 | TLS 版本控制 | 支援？ 是或否 | 
| --- | --- | --- | --- | 
| 金鑰大小至少為 2048 位元的 RSA | 全部 | TLS 1.2 TLS 1.3 | 是 | 
| ECC NIST P-256/P-384/P-521 | 全部 | TLS 1.2 TLS 1.3 | 是 | 
| 金鑰大小至少為 2048 位元的 RSA-PSS | 全部 | TLS 1.2 | 否 | 
| 金鑰大小至少為 2048 位元的 RSA-PSS | 全部 | TLS 1.3 | 是 | 

若要使用 [CreateCertificateFromCSR](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateFromCsr.html) 建立憑證，您可以使用支援的金鑰演算法來產生 CSR 的公有金鑰。若要使用 [RegisterCertificate](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificate.html) 或 [RegisterCertificateWithoutCA](https://docs.aws.amazon.com//iot/latest/apireference/API_RegisterCertificateWithoutCA.html) 註冊您自己的憑證，您可以使用支援的金鑰演算法來產生憑證的公有金鑰。

如需詳細資訊，請參閱 [安全政策](https://docs.aws.amazon.com//iot/latest/developerguide/transport-security.html#tls-policy-table)。

# 建立 AWS IoT 用戶端憑證
<a name="device-certs-create"></a>

AWS IoT 提供由 Amazon 根憑證授權機構 (CA) 簽署的用戶端憑證。

本主題說明如何建立由 Amazon 根憑證授權機構簽署的用戶端憑證，以及憑證檔案的下載方式。建立用戶端憑證檔案之後，您必須將它們安裝在用戶端上。

**注意**  
提供的每個 X.509 用戶端憑證都會 AWS IoT 保留您在憑證建立時設定的發行者和主體屬性。只在建立憑證之後，憑證屬性才是不可變的。

您可以使用 AWS IoT 主控台或 AWS CLI 來建立由 Amazon 根 AWS IoT 憑證授權單位簽署的憑證。

## 建立 AWS IoT 憑證 （主控台）
<a name="device-certs-create-console"></a>

**使用 AWS IoT 主控台建立 AWS IoT 憑證**

1. 登入 AWS 管理主控台 並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在導覽窗格中，依序選擇**安全**、**憑證**，然後選擇**建立**。

1. 選擇 **One-click certificate creation (一鍵建立憑證)** - **Create certificate (建立憑證)**。

1. 從**已建立的憑證**頁面上，將該物件的用戶端憑證檔案、公開金鑰和私密金鑰下載到安全的位置。產生的這些憑證只能與 AWS IoT AWS IoT 服務搭配使用。

   如果您還需要 Amazon 根 CA 憑證檔案，此頁面上也有可下載該憑證的頁面連結。

1. 現在已建立用戶端憑證，並已註冊 AWS IoT。您必須先啟動憑證，才能在用戶端中使用憑證。

    若要立即啟用用戶端憑證，請選擇**啟用**。如果您不想立即啟用憑證，請參閱 [啟動用戶端憑證 (主控台)](activate-or-deactivate-device-cert.md#activate-device-cert-console) 以了解如何稍後再啟用憑證。

   

1. 如果您要將政策連接至憑證，請選擇 **Attach a policy** (連接政策)。

   如果您不想立即連接政策，請選擇 **Done** (完成) 來完成。您可以稍後附加政策。

完成程序之後，請在用戶端上安裝憑證檔案。

## 建立 AWS IoT 憑證 (CLI)
<a name="device-certs-create-cli"></a>

 AWS CLI 提供 **[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)**命令來建立由 Amazon 根憑證授權單位簽署的用戶端憑證。但是，此命令不會下載 Amazon 根憑證授權機構憑證檔案。您可以從 [伺服器身分驗證的憑證授權機構憑證](server-authentication.md#server-authentication-certs) 下載 Amazon 根 CA 憑證檔案。

此命令會建立私有金鑰、公有金鑰和 X.509 憑證檔案，並使用 註冊和啟用憑證。 AWS IoT

```
aws iot create-keys-and-certificate \
    --set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```

如果您不想在建立並註冊憑證時啟動憑證，此命令會建立私有金鑰、公有金鑰和 X.509 憑證檔案並註冊憑證，但不會啟動憑證。[啟動用戶端憑證 (CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli) 描述稍後如何啟用憑證。

```
aws iot create-keys-and-certificate \
    --no-set-as-active \
    --certificate-pem-outfile certificate_filename.pem \
    --public-key-outfile public_filename.key \
    --private-key-outfile private_filename.key
```



在用戶端上安裝憑證檔案。

# 建立您自己的用戶端憑證
<a name="device-certs-your-own"></a>

AWS IoT 支援由任何根憑證或中繼憑證授權機構 (CA) 簽署的用戶端憑證。 AWS IoT 會使用 CA 憑證來驗證憑證的擁有權。若要使用由非 Amazon CA 的 CA 簽署的裝置憑證，CA 的憑證必須向 註冊， AWS IoT 以便我們驗證裝置憑證的擁有權。

AWS IoT 支援多種自帶憑證 (BYOC) 的方式：
+ 首先，註冊用於簽署用戶端憑證的 CA，然後註冊個別的用戶端憑證。如果您想要在裝置或用戶端首次連線至其用戶端憑證 AWS IoT （也稱為[Just-in-Time佈建](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html)) 時註冊裝置或用戶端，您必須向 AWS IoT 註冊簽署 CA，並啟用自動註冊。
+ 如果您無法註冊簽署 CA，則可以選擇不使用 CA 註冊用戶端憑證。對於不使用 CA 註冊的裝置，在將它們連接到 AWS IoT時需要出示[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)。

**注意**  
若要使用 CA 註冊用戶端憑證，您必須向 註冊簽署 CA AWS IoT，而不是階層中的任何其他 CAs。

**注意**  
一個 CA 憑證只能由一個區域中的一個帳戶在 `DEFAULT` 模式下註冊。一個 CA 憑證可以由一個區域中的多個帳戶在 `SNI_ONLY` 模式下註冊。

如需有關使用 X.509 憑證支援數個以上裝置的詳細資訊，請參閱 [裝置佈建](iot-provision.md)，以檢閱 AWS IoT 支援的不同憑證管理和佈建選項。

**Topics**
+ [管理您的憑證授權機構憑證](manage-your-CA-certs.md)
+ [使用您的憑證授權機構憑證建立用戶端憑證](create-device-cert.md)

# 管理您的憑證授權機構憑證
<a name="manage-your-CA-certs"></a>

本節說明管理您自己的憑證授權機構 (CA) 憑證的一般工作。

 AWS IoT 如果您使用的用戶端憑證是由 AWS IoT 無法辨識的 CA 簽署，則可以向 註冊憑證授權機構 (CA)。

如果您希望用戶端在第一次連線 AWS IoT 時自動向 註冊其用戶端憑證，則必須向簽署用戶端憑證的 CA 註冊 AWS IoT。否則，您不需要註冊已簽署用戶端憑證的憑證授權機構憑證。

**注意**  
一個 CA 憑證只能由一個區域中的一個帳戶在 `DEFAULT` 模式下註冊。一個 CA 憑證可以由一個區域中的多個帳戶在 `SNI_ONLY` 模式下註冊。

**Topics**
+ [建立憑證授權機構憑證](#create-your-CA-cert)
+ [註冊您的憑證授權機構憑證](#register-CA-cert)
+ [停用憑證授權機構憑證](#deactivate-ca-cert)

## 建立憑證授權機構憑證
<a name="create-your-CA-cert"></a>

如果沒有 憑證授權機構憑證，您可以使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具來建立憑證授權機構憑證。

**注意**  
您無法在 AWS IoT 主控台中執行此程序。

**使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具來建立憑證授權機構憑證**

1. 產生金鑰對。

   ```
   openssl genrsa -out root_CA_key_filename.key 2048
   ```

1. 透過該金鑰對的私有金鑰來產生憑證授權機構憑證。

   ```
   openssl req -x509 -new -nodes \
       -key root_CA_key_filename.key \
       -sha256 -days 1024 \
       -out root_CA_cert_filename.pem
   ```

## 註冊您的憑證授權機構憑證
<a name="register-CA-cert"></a>

這些程序說明如何從不是 Amazon CA 的憑證授權單位 (CA) 註冊憑證。 AWS IoT Core 會使用 CA 憑證來驗證憑證的擁有權。若要使用由非 Amazon CA 的 CA 簽署的裝置憑證，您必須向 註冊 CA 憑證， AWS IoT Core 以便驗證裝置憑證的擁有權。

### 註冊憑證授權機構憑證 (主控台)。
<a name="register-CA-cert-console"></a>

**注意**  
若要在主控台中註冊憑證授權機構憑證，請在主控台中的[註冊憑證授權機構憑證](https://console.aws.amazon.com//iot/home#/create/cacertificate)開始。您可在多帳戶模式下註冊您的 CA，而無需提供驗證憑證或私有金鑰的存取權。一個 CA 可由相同 AWS 區域中的多個 AWS 帳戶 以多帳戶模式進行註冊。您可透過提供驗證憑證和 CA 私有金鑰的擁有權證明，以單一帳戶模式註冊您的 CA。

### 註冊憑證授權機構憑證 (CLI)
<a name="register-CA-cert-cli"></a>

您可以在 `DEFAULT` 模式或 `SNI_ONLY` 模式下註冊 CA 憑證。CA 可以在 `DEFAULT` 中以 模式註冊 AWS 帳戶 AWS 區域。CA 可以由相同 AWS 帳戶 中的多個 以 `SNI_ONLY` 模式註冊 AWS 區域。如需 CA 憑證模式的詳細資訊，請參閱 [certificateMode](https://docs.aws.amazon.com//iot/latest/apireference/API_CACertificateDescription.html#iot-Type-CACertificateDescription-certificateMode)。

**注意**  
我們建議您在 `SNI_ONLY` 模式下註冊 CA。您不需要提供驗證憑證或存取私有金鑰，而且您可以在相同 AWS 帳戶 中透過多個 註冊 CA AWS 區域。

#### 在 SNI\$1ONLY 模式下註冊 CA 憑證 (CLI) - 建議
<a name="register-CA-cert-SNI-cli"></a>

**先決條件**

繼續操作之前，請確定您的電腦上具有下列資訊：
+ 根 CA 憑證檔案 (於下列範例中引用為 `root_CA_cert_filename.pem`)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更新版本

**使用 在 `SNI_ONLY` 模式下註冊 CA 憑證 AWS CLI**

1. 向 註冊 CA 憑證 AWS IoT。使用 **register-ca-certificate** 命令，輸入 CA 憑證檔案名稱。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [register-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)。

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --certificate-mode SNI_ONLY
   ```

   若成功，此命令會傳回 *certificateId*。

1. 此時，CA 憑證已向 註冊， AWS IoT 但處於非作用中狀態。CA 憑證必須處於作用中狀態，您才能註冊已簽署的任何用戶端憑證。

   這個步驟會啟動 CA 憑證。

   若要啟用該 CA 憑證，請按如下所示使用 **update-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)。

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

若要查看 CA 憑證的狀態，請使用 **describe-ca-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)。

#### 在 `DEFAULT` 模式下註冊 CA 憑證 (CLI)
<a name="register-CA-cert-default-cli"></a>

**先決條件**

繼續操作之前，請確定您的電腦上具有下列資訊：
+ 根 CA 憑證檔案 (於下列範例中引用為 `root_CA_cert_filename.pem`)
+ 根 CA 憑證私有金鑰檔案 (於下列範例中引用為 `root_CA_key_filename.key`)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更新版本

**使用 在 `DEFAULT` 模式下註冊 CA 憑證 AWS CLI**

1. 若要從 取得註冊碼 AWS IoT，請使用 **get-registration-code**。將傳回的 `registrationCode` 儲存為私有金鑰驗證憑證的 `Common Name`。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [get-registration-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/get-registration-code.html)。

   ```
   aws iot get-registration-code
   ```

1. 產生私有金鑰驗證憑證的金鑰對：

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 建立私密金鑰驗證憑證的憑證簽署要求 (CSR)。將憑證的 `Common Name` 欄位設定為 **get-registration-code** 傳回的 `registrationCode`。

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   將顯示提示要求您輸入一些此憑證的資訊，包括 `Common Name`。

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. 使用 CSR 建立私有金鑰驗證憑證：

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. 向 註冊 CA 憑證 AWS IoT。將 CA 憑證檔案名稱和私有金鑰驗證憑證檔案名稱傳遞給 **register-ca-certificate** 命令，如下所示。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [register-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html)。

   ```
   aws iot register-ca-certificate \
       --ca-certificate file://root_CA_cert_filename.pem \
       --verification-cert file://verification_cert_filename.pem
   ```

   如果成功，此命令會傳回 *certificateId*。

1. 此時，CA 憑證已向 註冊， AWS IoT 但未處於作用中狀態。CA 憑證必須處於作用中狀態，您才能註冊已簽署的任何用戶端憑證。

   這個步驟會啟動 CA 憑證。

   若要啟用該 CA 憑證，請按如下所示使用 **update-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [update-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)。

   ```
   aws iot update-ca-certificate \
       --certificate-id certificateId \
       --new-status ACTIVE
   ```

若要查看 CA 憑證的狀態，請使用 **describe-ca-certificate** 命令。如需詳細資訊，請參閱 *AWS CLI 命令參考*中的 [describe-ca-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html)。

### 建立憑證授權機構驗證憑證以在主控台中註冊憑證授權機構憑證
<a name="create-CA-verification-cert"></a>

**注意**  
此程序僅適用於從 AWS IoT 主控台註冊 CA 憑證的情況。  
如果您不是從 AWS IoT 主控台前往此程序，請在註冊 CA 憑證的主控台中啟動 [CA 憑證註冊](https://console.aws.amazon.com//iot/home#/create/cacertificate)程序。

繼續操作之前，請確定您在同一台電腦上具有下列可用項目：
+ 根 CA 憑證檔案 (於下列範例中引用為 `root_CA_cert_filename.pem`)
+ 根 CA 憑證私有金鑰檔案 (於下列範例中引用為 `root_CA_key_filename.key`)
+ [OpenSSL v1.1.1i](https://www.openssl.org/) 或更新版本

**如要使用命令列介面來建立 CA 驗證憑證，以於主控台中註冊您的 CA 憑證**

1. 將 `verification_cert_key_filename.key` 替換為您要建立的驗證憑證金鑰檔案名稱 (例如 **verification\$1cert.key**)。然後執行此命令以產生私有金鑰驗證憑證的金鑰對：

   ```
   openssl genrsa -out verification_cert_key_filename.key 2048
   ```

1. 將 `verification_cert_key_filename.key` 替換為您在步驟 1 建立的金鑰檔案名稱。

   `verification_cert_csr_filename.csr` 替換為您要建立的憑證簽署請求 (CSR) 檔案名稱。例如 **verification\$1cert.csr**。

   執行此命令以建立 CSR 檔案。

   ```
   openssl req -new \
       -key verification_cert_key_filename.key \
       -out verification_cert_csr_filename.csr
   ```

   命令會提示您輸入其他資訊 (稍後會說明)。

1. 在 AWS IoT 主控台的**驗證憑證**容器中，複製註冊碼。

1. **openssl** 命令提示您輸入的資訊如下列範例所示。除了 `Common Name` 欄位，您可輸入自己的值或將其留空。

   於 `Common Name` 欄位中，請貼上您在上一個步驟中複製的註冊碼。

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:your_registration_code
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

   完成後，命令將建立 CSR 檔案。

1. `verification_cert_csr_filename.csr` 替換為您在上一個步驟中使用的 `verification_cert_csr_filename.csr`。

   將 `root_CA_cert_filename.pem` 替換為您要註冊的 CA 憑證檔案名稱。

   將 `root_CA_key_filename.key` 替換為 CA 憑證私有金鑰檔案的檔案名稱。

   將 `verification_cert_filename.pem` 替換為您要建立的驗證憑證檔案名稱。例如 **verification\$1cert.pem**。

   ```
   openssl x509 -req \
       -in verification_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out verification_cert_filename.pem \
       -days 500 -sha256
   ```

1. OpenSSL 命令完成後，您應準備好這些檔案，以供返回主控台時使用。
   + 您的憑證授權機構憑證檔案 (在上一個命令中使用的 `root_CA_cert_filename.pem`)
   + 您在上一個步驟中建立的驗證憑證 (用於上一個命令中的 *verification\$1cert\$1filename.pem*)

## 停用憑證授權機構憑證
<a name="deactivate-ca-cert"></a>

當憑證授權機構 (CA) 憑證啟用自動用戶端憑證註冊時， 會 AWS IoT 檢查 CA 憑證，以確保 CA 為 `ACTIVE`。如果 CA 憑證為 `INACTIVE`， AWS IoT 則不允許註冊用戶端憑證。

藉由將 CA 憑證設定為 `INACTIVE`，您可防止自動註冊 CA 所核發的任何新用戶端憑證。

**注意**  
由有風險之憑證授權機構憑證簽署的任何已註冊裝置憑證將持續運作，直到您確實逐一撤銷這些憑證為止。

### 停用憑證授權機構憑證 (主控台)
<a name="deactivate-ca-cert-console"></a>

**使用 AWS IoT 主控台停用 CA 憑證**

1. 登入 AWS 管理主控台 並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 請在左側導覽窗格中，選擇 **Secure** (安全)、**CAs** (CA)。

1. 於憑證授權單位清單中，找出您要停用的憑證授權單位，接著選擇省略號圖示開啟選項選單。

1. 在選項選單上，選擇 **Deactivate (停用)**。

憑證授權機構應在清單中顯示為 **Inactive (非作用中)**。

**注意**  
 AWS IoT 主控台不提供列出您停用之 CA 簽署的憑證的方法。如需列出這些憑證的 AWS CLI 選項，請參閱 [停用憑證授權機構憑證 (CLI)](#deactivate-ca-cert-cli)。

### 停用憑證授權機構憑證 (CLI)
<a name="deactivate-ca-cert-cli"></a>

 AWS CLI 提供 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html)命令來停用 CA 憑證。

```
aws iot update-ca-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-certificates-by-ca.html) 命令，取得由指定 CA 簽署的所有已註冊裝置憑證清單。針對由指定憑證授權機構憑證所簽署的每一裝置憑證，請使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令來撤銷該裝置憑證，以避免受到使用。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 命令來查看 CA 憑證的狀態。

# 使用您的憑證授權機構憑證建立用戶端憑證
<a name="create-device-cert"></a>

您可以使用自己的憑證授權機構 (CA) 來建立用戶端憑證。用戶端憑證必須先向 註冊 AWS IoT ，才能使用。如需用戶端憑證之註冊選項的詳細資訊，請參閱 [註冊用戶端憑證](register-device-cert.md)。

## 建立用戶端憑證 (CLI)
<a name="create-device-cert-cli"></a>

**注意**  
您無法在 AWS IoT 主控台中執行此程序。

**使用 建立用戶端憑證 AWS CLI**

1. 產生金鑰對。

   ```
   openssl genrsa -out device_cert_key_filename.key 2048
   ```

1. 建立用戶端憑證的 CSR。

   ```
   openssl req -new \
       -key device_cert_key_filename.key \
       -out device_cert_csr_filename.csr
   ```

   將出現提示，要求您輸入一些資訊，如下所示：

   ```
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
       State or Province Name (full name) []:
       Locality Name (for example, city) []:
       Organization Name (for example, company) []:
       Organizational Unit Name (for example, section) []:
       Common Name (e.g. server FQDN or YOUR name) []:
       Email Address []:
   
       Please enter the following 'extra' attributes
       to be sent with your certificate request
       A challenge password []:
       An optional company name []:
   ```

1. 從 CSR 建立用戶端憑證。

   ```
   openssl x509 -req \
       -in device_cert_csr_filename.csr \
       -CA root_CA_cert_filename.pem \
       -CAkey root_CA_key_filename.key \
       -CAcreateserial \
       -out device_cert_filename.pem \
       -days 500 -sha256
   ```

 此時，用戶端憑證已建立，但尚未註冊 AWS IoT。如需如何和何時註冊用戶端憑證的詳細資訊，請參閱 [註冊用戶端憑證](register-device-cert.md)。

# 註冊用戶端憑證
<a name="register-device-cert"></a>

用戶端憑證必須向 註冊 AWS IoT ，才能啟用用戶端與 之間的通訊 AWS IoT。您可以手動註冊每個用戶端憑證，也可以將用戶端憑證設定為 AWS IoT 在用戶端第一次連線至 時自動註冊。

 如果想要您的用戶端和裝置在第一次連線時註冊，您必須使用 [註冊您的憑證授權機構憑證](manage-your-CA-certs.md#register-CA-cert)，在要使用用戶端憑證的區域中透過 AWS IoT 來簽署該用戶端憑證。Amazon 根 CA 會自動向 註冊 AWS IoT。

用戶端憑證可由 AWS 帳戶 和 區域共用。這些主題中的程序必須在您要使用用戶端憑證的每個帳戶和區域中執行。在一個帳戶或區域中註冊用戶端憑證時，另一個帳戶或區域不會自動加以辨識。

**注意**  
使用 Transport Layer Security (TLS) 通訊協定來連線 AWS IoT 的用戶端必須支援 TLS 的[伺服器名稱指示 (SNI) 延伸](https://tools.ietf.org/html/rfc3546#section-3.1)。如需詳細資訊，請參閱[中的傳輸安全性 AWS IoT Core](transport-security.md)。

**Topics**
+ [手動註冊用戶端憑證](manual-cert-registration.md)
+ [在用戶端連線至 AWS IoT just-in-time註冊 (JITR) 時註冊用戶端憑證](auto-register-device-cert.md)

# 手動註冊用戶端憑證
<a name="manual-cert-registration"></a>

您可以使用 AWS IoT 主控台和 手動註冊用戶端憑證 AWS CLI。

要使用的註冊程序取決於 AWS 帳戶和 區域是否會共用憑證。在一個帳戶或區域中註冊用戶端憑證時，另一個帳戶或區域不會自動加以辨識。

本主題中的程序必須在您要使用用戶端憑證的每個帳戶和區域中執行。用戶端憑證可由 AWS 帳戶和 區域共用。

## 註冊已註冊 CA 所簽署的用戶端憑證 (主控台)
<a name="manual-cert-registration-console"></a>

**注意**  
執行此程序之前，請確定您擁有用戶端憑證的 .pem 檔案，且用戶端憑證是由您已[註冊 AWS IoT](manage-your-CA-certs.md#register-CA-cert)的 CA 簽署。

**AWS IoT 使用主控台向 註冊現有憑證**

1. 登入 AWS 管理主控台並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 請在導覽窗格的 **Manage** (管理) 區段中，選擇 **Security** (安全性)，然後選擇 **Certificates** (憑證)。

1. 在 **Certificates** (憑證) 頁面的 **Certificates** (憑證) 對話方塊中，選擇 **Add certificate** (新增憑證)，然後選擇 **Register certificates** (註冊憑證)。

1. 在 **Register certificate** (登錄憑證) 頁面的 **Certificates to upload** (要上傳的憑證) 對話方塊中執行下列操作：
   + 請選擇 **CA is registered with AWS IoT** (已用註冊 CA)。
   + 從 **Choose a CA certificate** (選擇 CA 憑證) 中，選取您的 **Certification authority** (憑證授權機構)。
     + 選擇 **Register a new CA** (註冊新的憑證) 以註冊未使用 AWS IoT註冊的新 **Certification authority** (憑證授權機構)。
     + 若 **Amazon Root certificate authority** (Amazon 根憑證授權機構) 是您的憑證授權機構，**Choose a CA certificate** (選擇 CA 憑證) 請保留空白。
   + 最多選取要上傳和註冊的 10 個憑證 AWS IoT。
     + 請選擇您在 [建立 AWS IoT 用戶端憑證](device-certs-create.md) 和 [使用您的憑證授權機構憑證建立用戶端憑證](create-device-cert.md) 中建立的憑證檔案。
   + 請選擇 **Activate** (啟動) 或 **Deactivate** (停用)。若您選擇 **Deactive** (停用)，[啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md) 會說明如何在註冊憑證後啟動憑證。
   + 選擇**註冊**。

您已註冊的憑證將會出現在 **Certificates** (憑證) 頁面的 **Certificates** (憑證) 對話方塊中。

## 註冊未註冊 CA 所簽署的用戶端憑證 (主控台)
<a name="manual-cert-registration-console-noca"></a>

**注意**  
執行此程序之前，請確定您擁有用戶端憑證的 .pem 檔案。

**AWS IoT 使用主控台向 註冊現有憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure** (安全)、選擇 **Certificates** (憑證)，然後選擇 **Create** (建立)。

1. 在 **Create a certificate** (建立憑證) 上，找出 **Use my certificate** (使用我的憑證) 項目，然後選擇 **Get started** (開始使用)。

1. 在 **Select a CA** (選取 CA) 上，選擇 **Next** (下一步)。

1.  在 **Register existing device certificates** (註冊現有裝置憑證) 上，選擇 **Select certificates** (選取憑證)，然後選取最多 10 個要註冊的憑證檔案。

1.  關閉檔案對話方塊後，請選取您要在註冊用戶端憑證時啟用，還是撤銷用戶端憑證。

   如果您未在註冊憑證時啟用憑證，[啟動用戶端憑證 (主控台)](activate-or-deactivate-device-cert.md#activate-device-cert-console) 描述稍後如何啟用憑證。

   如果憑證在註冊時遭到撤銷，則無法稍後啟用。

   選擇要註冊的憑證檔案，並選取註冊後要採取的動作之後，請選取 **Register certificates** (註冊憑證)。

已成功註冊的用戶端憑證會出現在憑證清單中。

## 註冊已註冊 CA 所簽署的用戶端憑證 (CLI)
<a name="manual-cert-registration-cli"></a>

**注意**  
執行此程序之前，請確定您擁有憑證授權機構 (CA) .pem 和用戶端憑證的 .pem 檔案。用戶端憑證必須由您已[註冊 AWS IoT](manage-your-CA-certs.md#register-CA-cert)的憑證授權機構 (CA) 簽署。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate.html) 命令來註冊 (但不是啟動) 用戶端憑證。

```
aws iot register-certificate \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

用戶端憑證已向 註冊 AWS IoT，但尚未啟用。如需稍後如何啟用用戶端憑證的詳細資訊，請參閱 [啟動用戶端憑證 (CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli)。

當您使用這個命令註冊用戶端憑證時，也可以啟動用戶端憑證。

```
aws iot register-certificate \
    --set-as-active \
    --certificate-pem file://device_cert_filename.pem \
    --ca-certificate-pem file://ca_cert_filename.pem
```

如需啟用憑證使其可用於連線的詳細資訊 AWS IoT，請參閱 [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)

## 註冊未註冊 CA 所簽署的用戶端憑證 (CLI)
<a name="manual-cert-registration-noca-cli"></a>

**注意**  
執行此程序之前，請確定您擁有憑證的 .pem 檔案。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-certificate-without-ca.html) 命令來註冊 (但不是啟動) 用戶端憑證。

```
aws iot register-certificate-without-ca \
    --certificate-pem file://device_cert_filename.pem
```

用戶端憑證已向 註冊 AWS IoT，但尚未啟用。如需稍後如何啟用用戶端憑證的詳細資訊，請參閱 [啟動用戶端憑證 (CLI)](activate-or-deactivate-device-cert.md#activate-device-cert-cli)。

當您使用這個命令註冊用戶端憑證時，也可以啟動用戶端憑證。

```
aws iot register-certificate-without-ca \
    --status ACTIVE \
    --certificate-pem file://device_cert_filename.pem
```

如需啟用憑證使其可用於連線至 的詳細資訊 AWS IoT，請參閱 [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)。

# 在用戶端連線至 AWS IoT just-in-time註冊 (JITR) 時註冊用戶端憑證
<a name="auto-register-device-cert"></a>

您可以設定 CA 憑證，以啟用其簽署的用戶端憑證，以便在用戶端第一次連線時 AWS IoT 自動向 註冊 AWS IoT。

若要在用戶端 AWS IoT 第一次連線至 時註冊用戶端憑證，您必須啟用 CA 憑證以進行自動註冊，並設定用戶端提供所需憑證的第一個連線。

## 設定憑證授權機構憑證以支援自動註冊 (主控台)
<a name="enable-auto-registration-console"></a>

**使用 AWS IoT 主控台設定 CA 憑證以支援自動用戶端憑證註冊**

1. 登入 AWS 管理主控台並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 請在左側導覽窗格中，選擇 **Secure** (安全)、**CAs** (CA)。

1. 在憑證授權單位清單中，尋找您要啟用自動註冊的憑證授權單位，然後使用省略符號圖示開啟選項選單。

1. 在選項選單上，選擇 **Enable auto-registration (啟用自動註冊)**。

**注意**  
自動註冊狀態不會顯示在憑證授權單位清單中。若要查看憑證授權機構的自動註冊狀態，您必須開啟憑證授權機構的 **Details (詳細資料)** 頁面。

## 設定憑證授權機構憑證以支援自動註冊 (CLI)
<a name="enable-auto-registration-cli"></a>

如果您已向 註冊 CA 憑證 AWS IoT，請使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-ca-certificate.html)命令`autoRegistrationStatus`將 CA 憑證設定為 `ENABLE`。

```
aws iot update-ca-certificate \
--certificate-id caCertificateId \
--new-auto-registration-status ENABLE
```

如果您想要在註冊憑證授權機構憑證時啟用 `autoRegistrationStatus`，請使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/register-ca-certificate.html) 命令。

```
aws iot register-ca-certificate \
--allow-auto-registration  \
--ca-certificate file://root_CA_cert_filename.pem \
--verification-cert file://verification_cert_filename.pem
```

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-ca-certificate.html) 命令來查看 CA 憑證的狀態。

## 設定用戶端的首次連線進行自動註冊
<a name="configure-auto-reg-first-connect"></a>

當用戶端 AWS IoT 第一次嘗試連線至 時，在 Transport Layer Security (TLS) 交握期間，用戶端上必須存在由 CA 憑證簽署的用戶端憑證。

當用戶端連線到 時 AWS IoT，請使用您在[建立用戶端憑證或建立您自己的用戶端憑證中建立的 AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-create.html)用戶端憑證。 會將 CA 憑證 AWS IoT 辨識為已註冊的 CA 憑證、註冊用戶端憑證，並將其狀態設定為 `PENDING_ACTIVATION`。 [https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html)這代表系統會自動註冊該用戶端憑證，並準備啟用。用戶端憑證的狀態必須先是 `ACTIVE` 才能用來連線 AWS IoT。請參閱 [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md) 以了解啟用用戶端憑證的相關資訊。

**注意**  
您可以使用 AWS IoT Core just-in-time(JITR) 功能佈建裝置，而不必在裝置的第一個連線上傳送整個信任鏈 AWS IoT Core。雖不要求顯示憑證授權機構憑證，但需要裝置在連線時傳送[伺服器名稱指示 (SNI)](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) 延伸。

當 AWS IoT 自動註冊憑證或用戶端呈現 `PENDING_ACTIVATION` 狀態的憑證時， 會將訊息 AWS IoT 發佈至下列 MQTT 主題：

`$aws/events/certificates/registered/caCertificateId`

`caCertificateId` 為發行該用戶端憑證的憑證授權機構憑證 ID。

發佈至此主題的訊息具有以下結構：

```
{
        "certificateId": "certificateId",
        "caCertificateId": "caCertificateId",
        "timestamp": timestamp,
        "certificateStatus": "PENDING_ACTIVATION",
        "awsAccountId": "awsAccountId",
        "certificateRegistrationTimestamp": "certificateRegistrationTimestamp"
}
```

您可以建立規則以監聽此主題，並執行部分動作。我們建議您建立 Lambda 規則，此規則可驗證用戶端憑證未列於憑證撤銷清單 (CRL) 中，同時啟用憑證，並建立和連接政策至憑證。政策會決定用戶端能夠存取哪些資源。如果您要建立的政策需要連線裝置的用戶端 ID，您可以使用規則的 clientid() 函數來擷取用戶端 ID。範例規則定義可能如下所示：

```
SELECT *,
   clientid() as clientid
from $aws/events/certificates/registered/caCertificateId
```

在此範例中，規則會訂閱 JITR 主題`$aws/events/certificates/registered/caCertificateID`，並使用 clientid() 函數來擷取用戶端 ID。然後，規則會將用戶端 ID 附加至 JITR 承載。如需規則 clientid() 函數的詳細資訊，請參閱 [clientid()](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-clientid)。

如需如何建立會接聽 `$aws/events/certificates/registered/caCertificateID` 主題並執行這些動作之 Lambda 規則的詳細資訊，請參閱 [AWS IoT上用戶端憑證的即時註冊](https://aws.amazon.com/blogs/iot/just-in-time-registration-of-device-certificates-on-aws-iot/)。

如果在自動註冊用戶端憑證期間發生任何錯誤或例外狀況， 會將事件或訊息 AWS IoT 傳送至 CloudWatch Logs 中的日誌。如需為您帳戶設定記錄的詳細資訊，請參閱 [Amazon CloudWatch 文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/)。

# 管理用戶端憑證
<a name="manage-device-cert"></a>

AWS IoT 為您提供管理用戶端憑證的功能。

**Topics**
+ [啟用或停用用戶端憑證](activate-or-deactivate-device-cert.md)
+ [將物件或政策連接至用戶端憑證](attach-to-cert.md)
+ [撤銷用戶端憑證](revoke-ca-cert.md)
+ [將憑證傳輸至另一個帳戶](transfer-cert.md)

# 啟用或停用用戶端憑證
<a name="activate-or-deactivate-device-cert"></a>

AWS IoT 驗證用戶端憑證在驗證連線時是否處於作用中狀態。

您可以建立和註冊用戶端憑證而不需啟用它們，這樣在您想要使用前，它們就不會被使用。您也可以停用作用中的用戶端憑證，以暫時停用這些憑證。最後，您可以撤銷用戶端憑證，以防止未來使用這些憑證。

## 啟動用戶端憑證 (主控台)
<a name="activate-device-cert-console"></a>

**使用 AWS IoT 主控台啟用用戶端憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出您要啟用的憑證，然後使用省略符號圖示開啟選項選單。

1. 在選項選單中，選擇 **Activate (啟動)**。

憑證在憑證清單應顯示為 **Active (作用中)**。

## 停用用戶端憑證 (主控台)
<a name="deactivate-device-cert-console"></a>

**使用 AWS IoT 主控台停用用戶端憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出您要停用的憑證，然後使用省略符號圖示開啟選項選單。

1. 在選項選單中，選擇 **Deactivate (停用)**。

憑證在憑證清單中應顯示為 **Inactive (非作用中)**。

## 啟動用戶端憑證 (CLI)
<a name="activate-device-cert-cli"></a>

 AWS CLI 提供 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令來啟用憑證。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status ACTIVE
```

如果命令成功，則憑證的狀態將會是 `ACTIVE`。執行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看憑證的狀態。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

## 停用用戶端憑證 (CLI)
<a name="deactivate-device-cert-cli"></a>

 AWS CLI 提供停用憑證的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html)命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status INACTIVE
```

如果命令成功，則憑證的狀態將會是 `INACTIVE`。執行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看憑證的狀態。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 將物件或政策連接至用戶端憑證
<a name="attach-to-cert"></a>

當您建立和註冊與 AWS IoT 物件分開的憑證時，它不會有任何授權任何 AWS IoT 操作的政策，也不會與任何 AWS IoT 物件相關聯。本節說明如何在已註冊憑證上新增這些關聯。

**重要**  
要完成這些程序，您必須先建立要連接至憑證的物件或政策。

憑證會使用 驗證裝置， AWS IoT 使其可以連線。將憑證連接至物件資源會在裝置 (透過憑證) 與物件資源之間建立關係。若要授權裝置執行 AWS IoT 動作，例如允許裝置連接和發佈訊息，必須將適當的政策連接到裝置的憑證。

## 將物件連接至用戶端憑證 (主控台)
<a name="attach-to-cert-thing-console"></a>

您需要物件名稱才能完成此程序。

**將物件連接至已註冊憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出要連接政策的憑證、選擇省略符號圖示來開啟憑證的選項選單，然後選擇 **Attach thing (連接物件)**。

1. 在彈出式視窗中，找出要連接至憑證的物件名稱、選擇其核取方塊，然後選擇 **Attach** (連接)。

物件現應出現在憑證詳細資訊頁面上的物件清單中。

## 將政策連接至用戶端憑證 (主控台)
<a name="attach-to-cert-policy-console"></a>

您需要政策物件名稱才能完成此程序。

**將政策物件連接至已註冊憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出要連接政策的憑證、選擇省略符號圖示來開啟憑證的選項選單，然後選擇 **Attach policy (連接政策)**。

1. 在彈出式視窗中，找出要連接至憑證的政策名稱、選擇其核取方塊，然後選擇 **Attach** (連接)。

政策物件現應出現在憑證詳細資訊頁面上的政策清單中。

## 將物件連接至用戶端憑證 (CLI)
<a name="attach-to-cert-thing-cli"></a>

 AWS CLI 提供將物件連接到憑證的[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-thing-principal.html)命令。

```
aws iot attach-thing-principal \
    --principal certificateArn \
    --thing-name thingName
```

## 將政策連接至用戶端憑證 (CLI)
<a name="attach-to-cert-policy-cli"></a>

 AWS CLI 提供 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/attach-policy.html)命令，以將政策物件連接至憑證。

```
aws iot attach-policy \
    --target certificateArn \
    --policy-name policyName
```

# 撤銷用戶端憑證
<a name="revoke-ca-cert"></a>

如果您在已註冊的用戶端憑證上偵測到可疑活動，您可以撤銷該憑證，使其無法再次使用。

**注意**  
憑證一旦撤銷，就無法變更其狀態。也就是說，憑證狀態無法變更為 `Active` 或任何其他狀態。

## 撤銷用戶端憑證 (主控台)
<a name="revoke-device-cert-console"></a>

**使用 AWS IoT 主控台撤銷用戶端憑證**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

1. 在憑證清單中，找出您要撤銷的憑證，然後使用省略符號圖示開啟選項選單。

1. 在選項選單中，選擇 **Revoke (撤銷)**。

如果憑證已成功撤銷，它會在憑證清單中顯示為 **Revoked (已撤銷)**。

## 撤銷用戶端憑證 (CLI)
<a name="revoke-device-cert-cli"></a>

 AWS CLI 提供撤銷憑證的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令。

```
aws iot update-certificate \
    --certificate-id certificateId \
    --new-status REVOKED
```

如果命令成功，則憑證的狀態將會是 `REVOKED`。執行 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-certificate.html) 以查看憑證的狀態。

```
aws iot describe-certificate \
    --certificate-id certificateId
```

# 將憑證傳輸至另一個帳戶
<a name="transfer-cert"></a>

屬於某個憑證的 X.509 憑證 AWS 帳戶 可以轉移到另一個憑證 AWS 帳戶。

**將 X.509 憑證從一個憑證轉移到 AWS 帳戶 另一個憑證**

1. [開始傳輸憑證](#transfer-cert-init)

   在起始傳輸之前，必須先停用憑證，並將其與所有政策和物件分開。

1. [接受或拒絕憑證傳輸](#transfer-cert-accept)

   接收帳戶必須明確地接受或拒絕傳輸的憑證。在接收帳戶接受憑證之後，必須先啟用憑證才能使用。

1. [取消憑證傳輸](#transfer-cert-cancel)

   如果憑證未被接受，原始帳戶可以取消傳輸。

## 開始傳輸憑證
<a name="transfer-cert-init"></a>

您可以使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)或 ，開始 AWS 帳戶 將憑證轉移到另一個憑證 AWS CLI。

### 開始傳輸憑證 (主控台)
<a name="transfer-cert-init-console"></a>

若要完成此程序，將需要您想要傳輸之憑證的 ID。

從具有要傳輸之憑證的帳戶執行此程序。

**開始將憑證轉移到另一個憑證 AWS 帳戶**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

   選擇您想要傳輸且狀態為 **Active** (作用中) 或 **Inactive** (非作用中) 的憑證，並開啟其詳細資訊頁面。

1. 在憑證 **Details** (詳細資訊) 頁面的 **Actions** (動作) 選單中，如果 **Deactivate** (停用) 選項可用，請選擇 **Deactivate** (停用) 選項來停用憑證。

1. 在憑證的 **Details** (詳細資訊) 頁面的左側選單中，選擇 **Policies** (政策)。

1. 在憑證的 **Policies** (政策) 頁面上，如果有任何政策連接至憑證，請開啟政策的選項選單並選擇 **Detach** (分開)，來分開每個政策。

   在您繼續之前，憑證不得有任何連接的政策。

1. 在憑證的 **Policies** (政策) 頁面的左側選單中，選擇 **Things** (物件)。

1. 在憑證的 **Things** (物件) 頁面上，如果有任何物件連接至憑證，請開啟物件的選項選單並選擇 **Detach** (分開)，來分開每個物件。

   在您繼續之前，憑證不得有任何連接的物件。

1. 在憑證的 **Things** (物件) 頁面的左側選單中，選擇 **Details** (詳細資訊)。

1. 在憑證的 **Details** (詳細資訊) 頁面的 **Actions** (動作) 選單中，選擇 **Start transfer** (開始傳輸) 以開啟 **Start transfer** (開始傳輸) 對話方塊。

1. 在**開始轉移**對話方塊中，輸入要接收憑證的帳戶 AWS 帳戶 號碼，以及選用的簡短訊息。

1. 選擇 **Start transfer** (開始傳輸) 以傳輸憑證。

主控台應該會顯示訊息，指出傳輸成功或失敗。如果傳輸已開始，則憑證的狀態會更新為 **Transferred** (已傳輸)。

### 開始傳輸憑證 (CLI)
<a name="transfer-cert-init-cli"></a>

若要完成此程序，將需要您想要傳輸之憑證的 *certificateId* 和 *certificateArn*。

從具有要傳輸之憑證的帳戶執行此程序。

**開始將憑證轉移到另一個 AWS 帳戶**

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/update-certificate.html) 命令來停用憑證

   ```
   aws iot update-certificate --certificate-id certificateId --new-status INACTIVE
   ```

1. 分開所有策略。

   1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-attached-policies.html) 命令來列出已連接至憑證的政策。

      ```
      aws iot list-attached-policies --target certificateArn
      ```

   1. 對於每個連接的政策，使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-policy.html) 命令來分開政策。

      ```
      aws iot detach-policy --target certificateArn --policy-name policy-name
      ```

1. 分開所有物件。

   1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/list-principal-things.html) 命令來列出已連接至憑證的物件。

      ```
      aws iot list-principal-things --principal certificateArn
      ```

   1. 對於每個連接的物件，使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/detach-thing-principal.html) 命令來分開物件。

      ```
      aws iot detach-thing-principal --principal certificateArn --thing-name thing-name
      ```

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/transfer-certificate.html) 命令來啟動憑證傳輸。

   ```
   aws iot transfer-certificate --certificate-id certificateId --target-aws-account account-id
   ```

## 接受或拒絕憑證傳輸
<a name="transfer-cert-accept"></a>

您可以使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)或 AWS 帳戶 ，接受或拒絕從另一個 傳輸給您 AWS 帳戶 的憑證 AWS CLI。

### 接受或拒絕憑證傳輸 (主控台)
<a name="transfer-cert-accept-console"></a>

若要完成此程序，將需要已傳輸至您帳戶之憑證的 ID。

從接收所傳輸憑證的帳戶執行此程序。

**接受或拒絕已傳輸至 的憑證 AWS 帳戶**

1. 登入 AWS 管理主控台並開啟[AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

   選擇您想要接受或拒絕且狀態為 **Pending transfer** (待定傳輸) 的憑證，並開啟其詳細資訊頁面。

1. 在憑證的 **Details** (詳細資訊) 頁面的 **Actions** (動作) 選單中，
   + 若要接受憑證，請選擇 **Accept transfer** (接受傳輸)。
   + 若不要接受憑證，請選擇 **Reject transfer** (拒絕傳輸)。

### 接受或拒絕憑證傳輸 (CLI)
<a name="transfer-cert-accept-cli"></a>

若要完成此程序，將需要您想要接受或拒絕之憑證傳輸的 *certificateId*。

從接收所傳輸憑證的帳戶執行此程序。

**接受或拒絕已傳輸至 的憑證 AWS 帳戶**

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/accept-certificate-transfer.html) 命令來接受憑證。

   ```
   aws iot accept-certificate-transfer --certificate-id certificateId
   ```

1. 使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/reject-certificate-transfer.html) 命令來拒絕憑證。

   ```
   aws iot reject-certificate-transfer --certificate-id certificateId
   ```

## 取消憑證傳輸
<a name="transfer-cert-cancel"></a>

您可以在接受憑證傳輸之前，使用 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)或 AWS CLI來取消憑證傳輸。

### 取消憑證傳輸 (主控台)
<a name="transfer-cert-cancel-console"></a>

若要完成此程序，將需要您想要取消之憑證傳輸的 ID。

從已起始憑證傳輸的帳戶執行此程序。

**取消憑證傳輸**

1. 登入 AWS 管理主控台並開啟 [AWS IoT 主控台](https://console.aws.amazon.com/iot/home)。

1. 在左側導覽窗格中，選擇 **Secure (安全)**，然後選擇 **Certificates (憑證)**。

   選擇您想要取消其傳輸且狀態為 **Transferred** (已傳輸) 的憑證，並開啟其選項選單。

1. 在憑證的選項選單上，選擇 **Revoke transfer** (撤銷傳輸) 選項來取消憑證傳輸。
**重要**  
請小心不要弄錯 **Revoke transfer** (撤銷傳輸) 選項與 **Revoke** (撤銷) 選項。  
**Revoke transfer** (撤銷傳輸) 選項會取消憑證傳輸，而 **Revoke** (撤銷) 選項會使 AWS IoT無法復原且無法使用憑證。

### 取消憑證傳輸 (CLI)
<a name="transfer-cert-cancel-cli"></a>

若要完成此程序，將需要您想要取消之憑證傳輸的 *certificateId*。

從已起始憑證傳輸的帳戶執行此程序。

使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/cancel-certificate-transfer.html) 命令來取消憑證傳輸。

```
aws iot cancel-certificate-transfer --certificate-id certificateId
```

# 自訂用戶端憑證驗證
<a name="customize-client-auth"></a>

AWS IoT Core 支援 X.509 用戶端憑證的自訂用戶端憑證驗證，可增強用戶端身分驗證管理。此憑證驗證方法也稱為驗證前憑證檢查，您會根據自己的條件 （在 Lambda 函數中定義） 評估用戶端憑證，並撤銷用戶端憑證或憑證的簽署憑證授權單位 (CA) 憑證，以防止用戶端連線至 AWS IoT Core。例如，您可以建立自己的憑證撤銷檢查，以針對支援[線上憑證狀態通訊協定 (OCSP) 或憑證撤銷清單 (CRL) 端點的驗證授權單位驗證憑證的狀態](https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol)，並防止具有撤銷憑證的用戶端連線。 [https://en.wikipedia.org/wiki/Certificate_revocation_list](https://en.wikipedia.org/wiki/Certificate_revocation_list)用於評估用戶端憑證的條件是在 Lambda 函數 （也稱為預先驗證 Lambda) 中定義。您必須使用網域組態中設定的端點，且[身分驗證類型](protocols.md#connection-protocol-auth-mode)必須是 X.509 憑證。此外，用戶端在連線至 時必須提供[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 延伸 AWS IoT Core。

**注意**  
 AWS GovCloud (US) 區域不支援此功能。

**Topics**
+ [步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core](#client-auth-cert-verification)
+ [步驟 2：建立 Lambda 函數](#customize-client-auth-lambda)
+ [步驟 3：授權 AWS IoT 叫用您的 Lambda 函數](#customize-client-configuration-grant-permission)
+ [步驟 4：設定網域的身分驗證組態](#customize-client-configuration)

## 步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core
<a name="client-auth-cert-verification"></a>

如果您尚未這麼做，請註冊並啟用 [X.509 用戶端憑證。](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) AWS IoT Core否則，跳至下一步。

若要使用 註冊和啟用您的用戶端憑證 AWS IoT Core，請遵循下列步驟：

1. 如果您[直接使用 建立用戶端憑證 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)。這些用戶端憑證會自動向 註冊 AWS IoT Core。

1. 如果您[建立自己的用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)，請依照[這些指示向 註冊 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)憑證。

1. 若要啟用您的用戶端憑證，請遵循[這些指示](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)。

## 步驟 2：建立 Lambda 函數
<a name="customize-client-auth-lambda"></a>

您需要建立 Lambda 函數來執行憑證驗證，並針對所設定端點的每次用戶端連線嘗試呼叫 。建立此 Lambda 函數時，請遵循[建立第一個 Lambda 函數](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)的一般指引。此外，請確定 Lambda 函數遵循預期的請求和回應格式，如下所示：

**Lambda 函數事件範例**

```
{
	"connectionMetadata": {
		"id": "string"
	},
	"principalId": "string",
	"serverName": "string",
	"clientCertificateChain": [
		"string",
		"string"
	]
}
```

`connectionMetadata`  
中繼資料或與用戶端連線相關的其他資訊 AWS IoT Core。

`principalId`  
在 TLS 連線中與用戶端相關聯的主體識別符。

`serverName`  
[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 主機名稱字串。 AWS IoT Core 需要裝置將 [SNI 延伸](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)項目傳送至 Transport Layer Security (TLS) 通訊協定，並在 `host_name`欄位中提供完整的端點地址。

`clientCertificateChain`  
代表用戶端 X.509 憑證鏈的字串陣列。

**Lambda 函數回應範例**

```
{
	"isAuthenticated": "boolean"
}
```

`isAuthenticated`  
布林值，指出是否驗證請求。

**注意**  
在 Lambda 回應中， `isAuthenticated` 必須`true`繼續進行進一步的身分驗證和授權。否則，可以停用 IoT 用戶端憑證，也可以封鎖使用 X.509 用戶端憑證的自訂身分驗證，以進一步進行身分驗證和授權。

## 步驟 3：授權 AWS IoT 叫用您的 Lambda 函數
<a name="customize-client-configuration-grant-permission"></a>

建立 Lambda 函數之後，您必須使用 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 命令，授予 AWS IoT 叫用它的許可。請注意，每次嘗試連線到您設定的端點時，都會叫用此 Lambda 函數。如需詳細資訊，請參閱[授權 AWS IoT 叫用 Lambda 函數](custom-auth-authorize.md)。

## 步驟 4：設定網域的身分驗證組態
<a name="customize-client-configuration"></a>

下一節說明如何使用 設定自訂網域的身分驗證組態 AWS CLI。

### 設定網域的用戶端憑證組態 (CLI)
<a name="customize-client-auth-cli"></a>

如果您沒有網域組態，請使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) CLI 命令來建立組態。如果您已有網域組態，請使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) CLI 命令來更新網域的用戶端憑證組態。您必須新增您在上一個步驟中建立的 Lambda 函數 ARN。

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config 'clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type AWS_X509|CUSTOM_AUTH_X509 \
    --application-protocol SECURE_MQTT|HTTPS \
    --client-certificate-config '{"clientCertificateCallbackArn":"arn:aws:lambda:us-east-2:123456789012:function:my-function:1"}'
```

`domain-configuration-name`  
網域組態的名稱。

`authentication-type`  
網域組態的身分驗證類型。如需詳細資訊，請參閱[選擇身分驗證類型](protocols.md#connection-protocol-auth-mode)。

`application-protocol`  
裝置用來與之通訊的應用程式通訊協定 AWS IoT Core。如需詳細資訊，請參閱[選擇應用程式通訊協定](protocols.md#protocol-selection)。

`client-certificate-config`  
指定網域用戶端身分驗證組態的物件。

`clientCertificateCallbackArn`  
建立新連線時，在 TLS layer 中 AWS IoT 叫用之 Lambda 函數的 Amazon Resource Name (ARN)。若要自訂用戶端身分驗證以執行自訂用戶端憑證驗證，您必須新增您在上一個步驟中建立之 Lambda 函數的 ARN。

如需詳細資訊，請參閱 *AWS IoT API 參考*中的 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html) 和 [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)。如需網域組態的詳細資訊，請參閱[網域組態](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# IAM 使用者、群組和角色
<a name="iam-users-groups-roles"></a>

IAM 使用者、群組和角色為管理 AWS中身分及身分驗證的標準機制，您可以使用它們來使用 AWS SDK 和 連線到 AWS IoT HTTP 介面 AWS CLI。

IAM 角色也允許 代表您 AWS IoT 存取您帳戶中的其他 AWS 資源。例如，如果您想要讓裝置將其狀態發佈至 DynamoDB 資料表，IAM 角色 AWS IoT 允許 與 Amazon DynamoDB 互動。如需詳細資訊，請參閱 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)。

對於透過 HTTP 的訊息中介裝置連線， 會使用 Signature 第 4 版簽署程序來 AWS IoT 驗證使用者、群組和角色。如需詳細資訊，請參閱[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

搭配 AWS Signature 第 4 版使用 時 AWS IoT，用戶端必須在其 TLS 實作中支援下列項目：
+ TLS 1.2
+ SHA-256 RSA 憑證簽章驗證
+ TLS 密碼套件支援部分的一種密碼套件

如需相關資訊，請參閱 [的身分和存取管理 AWS IoT](security-iam.md)。

# Amazon Cognito 身分
<a name="cognito-identities"></a>

Amazon Cognito Identity 可讓您建立暫時性的有限權限 AWS 登入資料，以用於行動和 Web 應用程式。當您使用 Amazon Cognito Identity 時，請建立身分集區，為您的使用者建立唯一身分，並使用 Login with Amazon、Facebook 和 Google 等身分提供者進行身分驗證。您也可以將 Amazon Cognito 身分識別與自己的開發人員已驗證身分搭配使用。如需詳細資訊，請參閱 [Amazon Cognito 身分](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)。

若要使用 Amazon Cognito Identity，請定義與 IAM 角色相關聯的 Amazon Cognito 身分集區。IAM 角色與 IAM 政策相關聯，該政策會授予身分集區中的身分存取 AWS 資源的許可，例如呼叫 AWS 服務。

Amazon Cognito 身分會建立未驗證和已驗證的身分。未驗證的身分適用於行動裝置或 Web 應用程式中想使用應用程式但不想登入的訪客使用者。未驗證的使用者只會獲得與身分集區相關聯之 IAM 政策中所指定的許可。

當您使用已驗證的身分時，除了連接到身分集區的 IAM 政策之外，您還必須將 AWS IoT 政策連接到 Amazon Cognito 身分。若要連接政策 AWS IoT ，請使用 [ AttachPolicy](https://docs.aws.amazon.com/iot/latest/apireference/API_AttachPolicy.html) API，並將許可授予 AWS IoT 應用程式的個別使用者。您可以使用 AWS IoT 政策為特定客戶及其裝置指派精細的許可。

已驗證和未驗證的使用者是不同的身分類型。如果您未將 AWS IoT 政策連接至 Amazon Cognito 身分，則已驗證的使用者在 中的授權會失敗， AWS IoT 而且無法存取 AWS IoT 資源和動作。如需為 Amazon Cognito 身分建立政策的詳細資訊，請參閱 [發佈/訂閱政策範例](pub-sub-policy.md) 和 [使用 Amazon Cognito 身分授權](cog-iot-policies.md)。

![\[使用 Amazon Cognito Identity 存取裝置的應用程式。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/device-cognito.png)


# 自訂身分驗證和授權
<a name="custom-authentication"></a>

 AWS IoT Core 可讓您定義自訂授權方，以便管理自己的用戶端身分驗證和授權。當您需要使用 AWS IoT Core 非原生支援的身分驗證機制時，這會很有用。(如需原生支援機制的詳細資訊，請參閱 [用戶端身分驗證](client-authentication.md))。  

 例如，如果您要將 欄位中的現有裝置遷移至 ， AWS IoT Core 而這些裝置使用自訂承載字符或 MQTT 使用者名稱和密碼進行身分驗證， 則可以將其遷移至 ， AWS IoT Core 而不必為其佈建新身分。您可以搭配 AWS IoT Core 支援的任何通訊協定使用自訂身分驗證。如需 AWS IoT Core 支援的通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。

**Topics**
+ [了解自訂身分驗證工作流程](custom-authorizer.md)
+ [建立和管理自訂授權方 (CLI)](config-custom-auth.md)
+ [使用 X.509 用戶端憑證進行自訂身分驗證](custom-auth-509cert.md)
+ [AWS IoT Core 使用自訂身分驗證連線至](custom-auth.md)
+ [疑難排解您的授權方](custom-auth-troubleshooting.md)

# 了解自訂身分驗證工作流程
<a name="custom-authorizer"></a>

自訂身分驗證可讓您定義如何使用[授權方資源](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html)來驗證和授權用戶端。  每個授權方都包含客戶受管 Lambda 函數的參考、用於驗證裝置憑證的選用公有金鑰，以及其他組態資訊。 下圖說明 中自訂身分驗證的授權工作流程 AWS IoT Core。

![\[在 中自訂身分驗證的自訂授權工作流程 AWS IoT Core。\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core 自訂身分驗證和授權工作流程
<a name="custom-authentication-workflow"></a>

下方清單說明自訂身分驗證和授權工作流程中的每個步驟。

1. 裝置會使用其中一個支援的 來連線至客戶 AWS IoT Core 的資料端點[裝置通訊協定](protocols.md)。裝置會在請求的標頭欄位或查詢參數 （適用於 HTTP Publish 或 MQTT over WebSockets 通訊協定） 中，或在 MQTT CONNECT 訊息的使用者名稱和密碼欄位 （適用於 MQTT 和 MQTT over WebSockets 通訊協定） 中傳遞登入資料。

1. AWS IoT Core 會檢查兩個條件之一：
   + 傳入的請求指定授權方。
   + 接收請求 AWS IoT Core 的資料端點已為其設定預設授權方。

   如果 以下列其中一種方式 AWS IoT Core 尋找授權方， AWS IoT Core 會觸發與授權方相關聯的 Lambda 函數。

1.  （選用） 如果您已啟用權杖簽署，請在觸發 Lambda 函數之前，使用存放在授權方中的 公有金鑰 AWS IoT Core 驗證請求簽章。如果驗證失敗， AWS IoT Core 會停止請求，而不會叫用 Lambda 函數。  

1. Lambda 函數會接收請求中的憑證和連線中繼資料，並做出身分驗證決策。

1. Lambda 函數會傳回身分驗證決策的結果，以及指定連線中允許哪些動作 AWS IoT Core 的政策文件。Lambda 函數也會傳回資訊，指定透過叫用 Lambda 函數 AWS IoT Core 重新驗證請求中登入資料的頻率。

1. AWS IoT Core 根據從 Lambda 函數接收到的政策，評估連線上的活動。

1. 建立連線且最初調用您的自訂授權方 Lambda 後，閒置連線的下一個調用最多可延遲 5 分鐘，而不需要任何 MQTT 操作。之後，後續調用將遵循自訂授權方 Lambda 中的重新整理間隔。這種方法可以防止超出 Lambda 並行限制的過度調用 AWS 帳戶。

## 擴展考量
<a name="custom-authentication-scaling"></a>

 因為 Lambda 函數會為您的授權方處理身分驗證和授權，所以此函數會受制於 Lambda 定價和服務配額，例如並行執行速率。 如需 Lambda 定價的詳細資訊，請參閱[ Lambda 定價](https://aws.amazon.com/lambda/pricing/)。您可以調整 Lambda 函數回應中的 `refreshAfterInSeconds` 和 `disconnectAfterInSeconds` 參數，管理 Lambda 函數上的負載。如需 Lambda 函數回應內容的詳細資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。

**注意**  
如果將簽署保持啟用狀態，您可以防止無法辨識的用戶端過度觸發 Lambda。在您的授權方中停用簽署之前，請考慮這一點。

**注意**  
自訂授權方的 Lambda 函數逾時限制為 5 秒。

# 建立和管理自訂授權方 (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core 使用自訂授權方實作自訂身分驗證和授權機制。自訂授權方是一種 AWS IoT Core 資源，可讓您根據特定需求彈性定義和實作規則和政策。若要使用step-by-step說明建立自訂授權方，請參閱[教學課程：為 建立自訂授權方 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html)。

每個授權方都包含以下元件：
+  *名稱*：識別授權方的唯一使用者定義字串。
+  *Lambda 函數 ARN*：Lambda 函數的 Amazon 資源名稱 (ARN)，用於實作授權和身分驗證邏輯。  
+  *字符金鑰名稱*：用來從 HTTP 標頭、查詢參數或 MQTT CONNECT 使用者名稱擷取字符以執行簽章驗證的金鑰名稱。如果在您的授權方中啟用簽署，則此值為必要的。
+  *已停用簽署旗標 (選用)*：布林值，用來指定是否要停用憑證上的簽署需求。 這對於簽署憑證沒有意義的案例很有用，例如使用 MQTT 使用者名稱和密碼的身分驗證結構述。預設值為 `false`，因此預設會啟用簽署。
+  *字符簽署公有金鑰*： AWS IoT Core 用來驗證字符簽章的公有金鑰。其長度下限為 2,048 位元。如果在您的授權方中啟用簽署，則此值為必要的。  

Lambda 會依據 Lambda 函數執行的次數，以及在您函數中執行程式碼所需的時間，向您收費。如需 Lambda 定價的詳細資訊，請參閱 [Lambda 定價](https://aws.amazon.com/lambda/pricing/)。如需建立 Lambda 函數的詳細資訊，請參閱《[Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/)》。

**注意**  
如果將簽署保持啟用狀態，您可以防止無法辨識的用戶端過度觸發 Lambda。在您的授權方中停用簽署之前，請考慮這一點。

**注意**  
自訂授權方的 Lambda 函數逾時限制為 5 秒。

**Topics**
+ [定義您的 Lambda 函式](custom-auth-lambda.md)
+ [建立授權方](custom-auth-create-authorizer.md)
+ [授權 AWS IoT 叫用您的 Lambda 函數](custom-auth-authorize.md)
+ [測試您的授權方](custom-auth-testing.md)
+ [管理自訂授權方](custom-auth-manage.md)

# 定義您的 Lambda 函式
<a name="custom-auth-lambda"></a>

 當 AWS IoT Core 叫用您的授權方時，它會觸發與授權方相關聯的 Lambda，其中包含下列 JSON 物件的事件。範例 JSON 物件包含所有可能的欄位。不包含與連線請求無關的任何欄位。

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 Lambda 函數應該使用此資訊來驗證傳入連線，並決定連線中允許哪些動作。此函數應該傳送包含下列值的回應。
+  `isAuthenticated`：指出是否驗證請求的布林值。
+  `principalId`：英數字串，作為自訂授權請求所傳送之字符的識別符。該值必須為英數字串 (字元數量不低於 1 個且不超過 128 個)，且符合此規則表達式 (regex) 模式：`([a-zA-Z0-9]){1,128}`。不允許非英數字元的特殊字元與 `principalId`搭配使用 AWS IoT Core。如果允許 使用非英數特殊字元，請參閱 AWS 其他服務的文件`principalId`。
+  `policyDocuments`：JSON 格式 AWS IoT Core 政策文件的清單 如需建立 AWS IoT Core 政策的詳細資訊，請參閱[AWS IoT Core 政策](iot-policies.md)。政策文件的數目上限為 10 份政策文件。每份政策文件最多可包含 2,048 個字元。
+  `disconnectAfterInSeconds`：整數，用來指定連接至 AWS IoT Core 閘道的持續時間上限 (以秒為單位)。最小值為 300 秒，最大值為 86,400 秒。預設值為 86，400。
**注意**  
建立連線時，會設定 的值 `disconnectAfterInSeconds`（由 Lambda 函數傳回）。在後續政策重新整理 Lambda 調用期間，無法修改此值。
+  `refreshAfterInSeconds`：整數，用來指定政策重新整理的間隔。一旦超出此間隔， AWS IoT Core 便會叫用 Lambda 函數，以允許政策重新整理。最小值為 300 秒，最大值為 86,400 秒。

  下列 JSON 物件包含您的 Lambda 函數可以傳送的回應範例。

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 `policyDocument` 值必須包含有效的 AWS IoT Core 政策文件。如需 AWS IoT Core 政策的詳細資訊，請參閱[AWS IoT Core 政策](iot-policies.md)。  在 MQTT over TLS 和 MQTT over WebSockets 連線中， 會在 `refreshAfterInSeconds` 欄位值中指定的間隔內 AWS IoT Core 快取此政策。如果採用 HTTP 連線，除非裝置使用的是 HTTP 持續連線 (也稱為 HTTP 保持連線或 HTTP 連線重複使用)，否則每個授權請求都會呼叫 Lambda 函數。您可以在設定授權方時選擇啟用快取。在此間隔期間， 會針對此快取政策 AWS IoT Core 授權已建立連線中的動作，而不會再次觸發您的 Lambda 函數。如果在自訂身分驗證期間發生失敗， 會 AWS IoT Core 終止連線。如果連線開啟的時間超過 `disconnectAfterInSeconds`參數中指定的值， AWS IoT Core 也會終止連線。

 下列 JavaScript 包含範例 Node.js Lambda 函數，其會在 MQTT Connect 訊息中尋找值為 的密碼，`test`並傳回政策，授予許可，以 AWS IoT Core 連接至名為 的用戶端，`myClientName`並發佈至包含相同用戶端名稱的主題。如果找不到預期的密碼，它會傳回拒絕這兩個動作的政策。

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 當上述 Lambda 函數在 MQTT Connect 訊息中收到 `test` 的預期密碼時，它會傳回下列 JSON。`password` 和 `principalId` 屬性的值會是 MQTT 連結訊息的值。

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# 建立授權方
<a name="custom-auth-create-authorizer"></a>

 您可以使用 [CreateAuthorizer API](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) 建立授權方。下列範例描述此命令。

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

您可以使用 `signing-disabled` 參數，在每次叫用授權方時選擇退出簽章驗證。除非您必須停用簽署，否則強烈建議您不要這樣做。簽章驗證可保護您防範未知裝置過度叫用 Lambda 函數。在建立授權方之後，您無法更新授權方的 `signing-disabled` 狀態。若要變更此行為，您必須使用不同的 `signing-disabled` 參數值建立另一個自訂授權方。

如果您已停用簽署，`tokenKeyName` 和 `tokenSigningPublicKeys` 參數的值是選用值。如果啟用簽署，則它們是必要值。

建立 Lambda 函數和自訂授權方之後，您必須明確授予 AWS IoT Core 服務許可，才能代表您叫用函數。 您可以使用下列命令來執行此操作。

**注意**  
預設 IoT 端點可能不支援搭配 Lambda 函數使用自訂授權方。反之，您可以使用網域組態來定義新的端點，然後為自訂授權方指定該端點。

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# 授權 AWS IoT 叫用您的 Lambda 函數
<a name="custom-auth-authorize"></a>

在本節中，您將授予您剛建立的自訂授權方資源的許可，以執行 Lambda 函數。若要授與許可，您可以使用 [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI 命令。

**使用 將許可授予 Lambda 函數 AWS CLI**

1. 在插入您的值之後，輸入以下命令。請注意，`statement-id` 值必須是唯一的。`Id-1234` 將 取代為您擁有的確切值，否則您可能會發生錯誤`ResourceConflictException`。

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. 如果命令成功，它會傳回許可陳述式，例如此範例。您可以繼續下一節來測試自訂授權方。

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   如果命令未成功，它會傳回錯誤，例如此範例。您必須先檢閱並更正錯誤，然後才能繼續進行。

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# 測試您的授權方
<a name="custom-auth-testing"></a>

 您可以使用 [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html) API 來測試授權方的叫用和傳回值。此 API 可讓您指定通訊協定中繼資料，並在您的授權方中測試簽章驗證。

下列標籤顯示如何使用 AWS CLI 來測試您的授權方。

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

`token-signature` 參數的值是簽署的字符。若要了解如何取得此值，請參閱 [簽署字符](custom-auth.md#custom-auth-token-signature)。

如果您的授權方取得使用者名稱和密碼，您可以使用 `--mqtt-context` 參數來傳遞此資訊。下列標籤顯示如何使用 `TestInvokeAuthorizer` API，將包含使用者名稱、密碼和用戶端名稱的 JSON 物件傳送給您的自訂授權方。

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

密碼必須為 base64 編碼。下列範例顯示如何在類似 Unix 環境中編碼密碼。

```
echo -n PASSWORD | base64
```

# 管理自訂授權方
<a name="custom-auth-manage"></a>

 您可以使用下列 API 來管理授權方。
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html)：顯示您帳戶中的所有授權方。
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)：顯示所指定授權方的屬性。這些值包括建立日期、上次修改日期和其他屬性。
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html)：指定 AWS IoT Core 資料端點的預設授權方。如果裝置未傳遞 AWS IoT Core 登入資料，且未指定授權方，則 AWS IoT Core 使用此授權方。如需使用 AWS IoT Core 登入資料的詳細資訊，請參閱 [用戶端身分驗證](client-authentication.md)。
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html)：變更所指定授權方的狀態、字符金鑰名稱或公有金鑰。
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html)：刪除指定的授權方。

**注意**  
 您無法更新授權方的簽署需求。這表示您無法在需要簽署的現有授權方中停用簽署。您也無法在不需要簽署的現有授權方中要求簽署。

# 使用 X.509 用戶端憑證進行自訂身分驗證
<a name="custom-auth-509cert"></a>

將裝置連線至 時 AWS IoT Core，您有多種身分[驗證類型](protocols.md#connection-protocol-auth-mode)可用。您可以使用 X.[509 用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html)來驗證用戶端和裝置連線，或定義[自訂授權方](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html)來管理自己的用戶端身分驗證和授權邏輯。本主題說明如何搭配 X.509 用戶端憑證使用自訂身分驗證。

如果您已經使用 X.509 憑證對裝置進行身分驗證，並想要執行額外的驗證和自訂授權，則使用自訂身分驗證搭配 X.509 憑證可能會有所幫助。例如，如果您在 X.509 用戶端憑證中存放裝置的資料，例如其序號，則在 AWS IoT Core 驗證 X.509 用戶端憑證之後，您可以使用自訂授權方，根據憑證的 CommonName 欄位中存放的資訊來識別特定裝置。將裝置連線至 時，搭配 X.509 憑證使用自訂身分驗證可增強裝置安全管理， AWS IoT Core 並提供管理身分驗證和授權邏輯的更多彈性。 AWS IoT Core 支援搭配 X.509 憑證的自訂身分驗證，其使用 X.509 憑證和自訂授權方身分驗證類型，同時適用於 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) 通訊協定和 [HTTPS](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) 通訊協定。如需裝置端點支援的身分驗證類型和應用程式通訊協定 AWS IoT Core 的詳細資訊，請參閱[裝置通訊協定](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)。

**注意**  
 AWS GovCloud (US) 區域不支援使用 X.509 用戶端憑證的自訂身分驗證。

**重要**  
您必須使用使用[網域組態](iot-custom-endpoints-configurable.md)建立的端點。此外，用戶端在連線至 時必須提供[伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 延伸 AWS IoT Core。

**Topics**
+ [步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core](#custom-auth-509cert-client)
+ [步驟 2：建立 Lambda 函數](#custom-auth-509cert-lambda)
+ [步驟 3：建立自訂授權方](#custom-auth-509cert-authorizer)
+ [步驟 4：在網域組態中設定身分驗證類型和應用程式通訊協定](#custom-auth-509cert-domainconfig)

## 步驟 1：向 註冊您的 X.509 用戶端憑證 AWS IoT Core
<a name="custom-auth-509cert-client"></a>

如果您尚未這麼做，請註冊並啟用 [X.509 用戶端憑證。](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) AWS IoT Core否則，跳至下一步。

若要使用 註冊和啟用您的用戶端憑證 AWS IoT Core，請遵循下列步驟：

1. 如果您[直接使用 建立用戶端憑證 AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html)。這些用戶端憑證會自動向 註冊 AWS IoT Core。

1. 如果您[建立自己的用戶端憑證](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html)，請依照[這些指示向 註冊 AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html)憑證。

1. 若要啟用您的用戶端憑證，請遵循[這些指示](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html)。

## 步驟 2：建立 Lambda 函數
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core 使用自訂授權方來實作自訂身分驗證和授權機制。自訂授權方與 Lambda 函數相關聯，該函數會判斷裝置是否經過身分驗證，以及允許裝置執行哪些操作。當裝置連線到 時 AWS IoT Core， 會 AWS IoT Core 擷取授權方詳細資訊，包括授權方名稱和相關聯的 Lambda 函數，並叫用 Lambda 函數。Lambda 函數會收到事件，其中包含具有裝置 X.509 用戶端憑證資料的 JSON 物件。您的 Lambda 函數使用此事件 JSON 物件來評估身分驗證請求、決定要採取的動作，以及傳送回應。

### Lambda 函數事件範例
<a name="custom-auth-509cert-event"></a>

下列範例 JSON 物件包含可以包含的所有可能欄位。實際 JSON 物件只會包含與特定連線請求相關的欄位。

```
{
	"token": "aToken",
	"signatureVerified": true,
	"protocols": [
		"tls",
		"mqtt"
	],
	"protocolData": {
		"tls": {
			"serverName": "serverName",
			"x509CertificatePem": "x509CertificatePem",
			"principalId": "principalId"
		},
		"mqtt": {
			"clientId": "myClientId",
                     "username": "myUserName",
                     "password": "myPassword"
		}
	},
	"connectionMetadata": {
		"id": "UUID"
	}
}
```

`signatureVerified`  
布林值，指出在叫用授權方的 Lambda 函數之前，是否驗證授權方中設定的字符簽章。如果授權方設定為停用權杖簽署，則此欄位將為 false。

`protocols`  
包含請求預期通訊協定的陣列。

`protocolData`  
包含連線中所用通訊協定資訊的物件。它提供通訊協定特定的詳細資訊，可用於身分驗證、授權等。  
`tls` - 此物件會保留與 TLS (Transport Layer Security) 通訊協定相關的資訊。  
+ `serverName` - [伺服器名稱指示 (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 主機名稱字串。 AWS IoT Core 要求裝置將 [SNI 延伸](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)模組傳送至 Transport Layer Security (TLS) 通訊協定，並在 `host_name`欄位中提供完整的端點地址。
+ `x509CertificatePem` - PEM 格式的 X.509 憑證，用於 TLS 連線中的用戶端身分驗證。
+ `principalId` - TLS 連線中與用戶端相關聯的主體識別符。
`mqtt` - 此物件會保留 MQTT 通訊協定的相關資訊。  
+ `clientId` - 字串只需要包含在裝置傳送此值的事件中。
+ `username` - MQTT Connect 封包中提供的使用者名稱。
+ `password` - MQTT Connect 封包中提供的密碼。

`connectionMetadata`  
連線的中繼資料。  
`id` - 用於記錄和故障診斷的連線 ID。

**注意**  
在此事件中，JSON 物件 `x509CertificatePem`和 `principalId`是請求中的兩個新欄位。的值`principalId`與 的值相同`certificateId`。如需詳細資訊，請參閱[憑證](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html)。

### Lambda 函數回應範例
<a name="custom-auth-509cert-response"></a>

Lambda 函數應使用事件 JSON 物件中的資訊來驗證傳入連線，並決定連線中允許哪些動作。

下列 JSON 物件包含 Lambda 函數可以傳送的範例回應。

```
{
	"isAuthenticated": true,
	"principalId": "xxxxxxxx",
	"disconnectAfterInSeconds": 86400,
	"refreshAfterInSeconds": 300,
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Effect": "Allow",
					"Action": "iot:Publish",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting"
				}
			]
		}
	]
}
```

在此範例中，此函數應該傳送包含下列值的回應。

`isAuthenticated`  
布林值，指出是否驗證請求。

`principalId`  
英數字串，可做為自訂授權請求所傳送字符的識別符。值必須是至少包含一個英數字串，且不超過 128 個字元。它會識別日誌中的連線。的值`principalId`必須與事件 JSON 物件`principalId`中的 值相同 （即 X.509 憑證的 certificateId)。

`policyDocuments`  
JSON 格式 AWS IoT Core 政策文件的清單。此值為選用，並支援[物件政策變數](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html)和[憑證政策變數](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html)。政策文件的數量上限為 10。每份政策文件最多可包含 2,048 個字元。如果您將多個政策連接到用戶端憑證和 Lambda 函數，則許可是所有政策的集合。如需建立 AWS IoT Core 政策的詳細資訊，請參閱 [政策](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)。

`disconnectAfterInSeconds`  
整數，指定與 AWS IoT Core 閘道連線的最長持續時間 （以秒為單位）。最小值為 300 秒，最大值為 86，400 秒。 `disconnectAfterInSeconds`是連線的生命週期，不會在連續政策重新整理時重新整理。

`refreshAfterInSeconds`  
整數，指定政策重新整理之間的間隔。當此間隔通過時， 會 AWS IoT Core 叫用 Lambda 函數以允許政策重新整理。最小值為 300 秒，最大值為 86,400 秒。

### Lambda 函數範例
<a name="custom-auth-509cert-js-example"></a>

以下是 Node.js Lambda 函數的範例。函數會檢查用戶端的 X.509 憑證，並擷取相關資訊，例如序號、指紋和主體名稱。如果擷取的資訊符合預期值，則會授予用戶端連線的存取權。此機制可確保只有具有有效憑證的授權用戶端才能建立連線。

```
const crypto = require('crypto');

exports.handler = async (event) => {
    
    // Extract the certificate PEM from the event
    const certPem = event.protocolData.tls.x509CertificatePem;
    
    // Parse the certificate using Node's crypto module
    const cert = new crypto.X509Certificate(certPem);
    
    var effect = "Deny";
    // Allow permissions only for a particular certificate serial, fingerprint, and subject
    if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial
       && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint
       && cert.subject === "allow.example.com") {
      effect = "Allow";
    }
    
    return generateAuthResponse(event.protocolData.tls.principalId, effect);
};


// Helper function to generate the authorization response.
function generateAuthResponse(principalId, effect) {
    const authResponse = {
        isAuthenticated: true,
        principalId,
        disconnectAfterInSeconds: 3600,
        refreshAfterInSeconds: 300,
        policyDocuments: [
          {
            Version: "2012-10-17",		 	 	 
            Statement: [
              {
                Action: ["iot:Connect"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:client/myClientName"
                ]
              },
              {
                Action: ["iot:Publish"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Subscribe"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Receive"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              }
            ]
          }
        ]
      };

  return authResponse;
}
```

上述 Lambda 函數在收到具有預期序列、指紋和主體的憑證時，會傳回下列 JSON。的值`x509CertificatePem`將是 TLS 交握中提供的用戶端憑證。如需詳細資訊，請參閱[定義 Lambda 函數](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda)。

```
{
	"isAuthenticated": true,
	"principalId": "principalId in the event JSON object",
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Action": "iot:Connect",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName"
				},
				{
					"Action": "iot:Publish",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				},
				{
					"Action": "iot:Subscribe",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
				},
				{
					"Action": "iot:Receive",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				}
			]
		}
	],
	"disconnectAfterInSeconds": 3600,
	"refreshAfterInSeconds": 300
}
```

## 步驟 3：建立自訂授權方
<a name="custom-auth-509cert-authorizer"></a>

[定義 Lambda 函數](#custom-auth-509cert-lambda)之後，請建立自訂授權方來管理您自己的用戶端身分驗證和授權邏輯。您可以遵循[步驟 3：建立客戶授權方資源及其授權](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer)中的詳細說明。如需詳細資訊，請參閱[建立 授權方](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html)。

在建立自訂授權方的過程中，您必須授予 AWS IoT 許可，才能在 Lambda 函數建立之後叫用該函數。如需詳細說明，請參閱[授權 AWS IoT 叫用您的 Lambda 函數](custom-auth-authorize.md)。

## 步驟 4：在網域組態中設定身分驗證類型和應用程式通訊協定
<a name="custom-auth-509cert-domainconfig"></a>

若要使用自訂身分驗證搭配 X.509 用戶端憑證來驗證裝置，您必須在網域組態中設定身分驗證類型和應用程式通訊協定，而且必須傳送 SNI 延伸。的值`authenticationType`必須是 `CUSTOM_AUTH_X509`，而 的值`applicationProtocol`可以是 `SECURE_MQTT`或 `HTTPS`。

### 在網域組態 (CLI) 中設定身分驗證類型和應用程式通訊協定
<a name="custom-auth-509cert-cli"></a>

如果您沒有網域組態，請使用 [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html)命令來建立組態。的值`authenticationType`必須是 `CUSTOM_AUTH_X509`，而 的值`applicationProtocol`可以是 `SECURE_MQTT`或 `HTTPS`。

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \ 
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

如果您已有網域組態，`applicationProtocol`請視需要使用[https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html)命令更新`authenticationType`和 。請注意，您無法變更預設端點 () 上的身分驗證類型或通訊協定`iot:Data-ATS`。

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

`domain-configuration-name`  
網域組態的名稱。

`authentication-type`  
網域組態的身分驗證類型。如需詳細資訊，請參閱[選擇身分驗證類型](protocols.md#connection-protocol-auth-mode)。

`application-protocol`  
裝置用來與之通訊的應用程式通訊協定 AWS IoT Core。如需詳細資訊，請參閱[選擇應用程式通訊協定](protocols.md#protocol-selection)。

`--authorizer-config`  
在網域組態中指定授權方組態的物件。

`defaultAuthorizerName`  
網域組態的授權方名稱。

如需詳細資訊，請參閱 *AWS IoT API 參考*中的 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html) 和 [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)。如需網域組態的詳細資訊，請參閱[網域組態](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html)。

# AWS IoT Core 使用自訂身分驗證連線至
<a name="custom-auth"></a>

 裝置可以使用 AWS IoT Core 自訂身分驗證搭配 AWS IoT Core 支援裝置傳訊的任何通訊協定來連線至 。如需受支援通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。  傳遞至授權方 Lambda 函數的連線資料取決於您使用的通訊協定。如需建立授權方 Lambda 函數的詳細資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。以下各節說明如何使用每個支援的通訊協定來連線，以便進行身分驗證。

## HTTPS
<a name="custom-auth-http"></a>

 AWS IoT Core 使用 [HTTP Publish API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) 將資料傳送到 的裝置，可以透過請求標頭或查詢其 HTTP POST 請求中的參數來傳遞憑證。裝置可以指定要使用 `x-amz-customauthorizer-name` 標頭或查詢參數叫用的授權方。如果您已在授權方中啟用字符簽署，則必須在請求標頭或查詢參數中傳遞 `token-key-name` 和 `x-amz-customauthorizer-signature`。請注意，在瀏覽器中使用 JavaScript 時，`token-signature` 的值必須是 URL 編碼格式。

**注意**  
HTTPS 通訊協定的客戶授權方僅支援發佈操作。如需有關 HTTP 通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。

下列範例請求會顯示如何在請求標頭和查詢參數中傳遞這些參數。

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 AWS IoT Core 使用 MQTT 連線連線至 的裝置可以透過 MQTT 訊息的 `username`和 `password` 欄位傳遞登入資料。此 `username` 值也可以選擇包含一個查詢字串，將其他值 (包括字符、簽章和授權方名稱) 傳遞給您的授權方。如果您想要使用字符型身分驗證結構描述，而不是 `username` 和 `password` 值，則可使用此查詢字串。  

**注意**  
 密碼欄位中的資料由 base64 編碼 AWS IoT Core。您的 Lambda 函數必須將其解碼。

 以下範例包含一個 `username` 字串，其中包含指定字符和簽章的額外參數。  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

若要叫用 授權方， AWS IoT Core 使用 MQTT 和自訂身分驗證連線至 的裝置必須在連接埠 443 上連線。他們也必須傳遞值為 的應用程式層通訊協定交涉 (ALPN) TLS 延伸，`mqtt`以及其 AWS IoT Core 資料端點主機名稱的伺服器名稱指示 (SNI) 延伸。為了避免潛在的錯誤，`x-amz-customauthorizer-signature` 的值必須進行 URL 編碼。我們也強烈建議您對 `x-amz-customauthorizer-name` 和 `token-key-name` 值進行 URL 編碼。如需這些值的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。V2 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md) 可以設定這些延伸模組。 

## MQTT over WebSockets
<a name="custom-auth-websockets"></a>

 AWS IoT Core 透過 WebSockets 使用 MQTT 連線至 的裝置可以透過下列兩種方式之一傳遞登入資料。
+ 透過 HTTP UPGRADE 請求中的請求標頭或查詢參數來建立 WebSockets 連線。
+ 透過 MQTT CONNECT 訊息中的 `username` 和 `password` 欄位。

 如果透過 MQTT CONNECT 訊息傳遞憑證，則需要 ALPN 和 SNI TLS 延伸。如需這些延伸的詳細資訊，請參閱 [MQTT](#custom-auth-mqtt)。下列範例顯示如何透過 HTTP Upgrade 請求傳遞憑證。

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## 簽署字符
<a name="custom-auth-token-signature"></a>

您必須利用您在 `create-authorizer` 呼叫中所使用之公有/私有金鑰對中的私有金鑰簽署字符。下列範例顯示如何使用類似 UNIX 的命令和 JavaScript 來建立字符簽章。它們會使用 SHA-256 雜湊演算法來編碼簽章。

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# 疑難排解您的授權方
<a name="custom-auth-troubleshooting"></a>

 本主題逐步解說可能會在自訂身分驗證工作流程中產生問題的常見問題，以及解決這些問題的步驟。若要最有效地疑難排解問題，請啟用 的 CloudWatch 日誌， AWS IoT Core 並將日誌層級設定為 **DEBUG**。您可以在 AWS IoT Core 主控台中啟用 CloudWatch 日誌 ([https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)：//)。如需針對 AWS IoT Core啟用和設定記錄的詳細資訊，請參閱 [設定 AWS IoT 記錄](configure-logging.md)。

**注意**  
如果您長期將日誌層級保留在 **DEBUG**，CloudWatch 可能會存放大量的記錄資料。這可能會增加您的 CloudWatch 費用。請考慮使用資源型記錄，以增加特定物件群組中僅限裝置的詳細資訊。如需資源型記錄的詳細資訊，請參閱 [設定 AWS IoT 記錄](configure-logging.md)。此外，當您完成疑難排解時，請將日誌層級降低到較不詳細的層級。

開始疑難排解之前，請檢閱 [了解自訂身分驗證工作流程](custom-authorizer.md)，以取得自訂身分驗證程序的高階檢視。這協助您了解可在哪裡尋找問題的來源。

本主題討論下列兩個可供您調查的領域。
+ 與您授權方 Lambda 函數相關的問題。
+ 與您裝置相關的問題。

## 檢查您的授權方 Lambda 函數中的問題
<a name="custom-auth-troubleshooting-lambda"></a>

執行下列步驟，以確定您裝置的連線嘗試正在叫用 Lambda 函數。

1. 確認哪個 Lambda 函數與您的授權方相關聯。

   若要執行此確認，您可以呼叫 [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html) API，或在 AWS IoT Core 主控台的 **Secure** (安全) 區段中按一下所需的授權方。

1. 檢查 Lambda 函數的叫用指標。執行下列步驟來執行此動作。

   1. 開啟 AWS Lambda 主控台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//)，然後選取與您的授權方相關聯的 函數。

   1. 選擇 **Monitor** (監控) 標籤，並檢視與您問題相關之時間範圍的指標。

1. 如果您未看到叫用，請確認 AWS IoT Core 具有叫用 Lambda 函數的許可。如果您看到叫用，請跳到下一個步驟。執行下列步驟來驗證您的 Lambda 函數是否具有必要的許可。

   1. 在 AWS Lambda 主控台中為您的函數選擇**許可**索引標籤。

   1. 在頁面底部尋找 **Resource-based Policy** (資源型政策) 區段。如果您的 Lambda 函數具有必要的許可，政策看起來像下列範例。  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. 此政策會將函數的`InvokeFunction`許可授予 AWS IoT Core 委託人。如果您沒有看到它，您必須使用 [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) API 來新增它。下列範例顯示如何使用 AWS CLI來做到這一點。

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. 如果您看到叫用，請確認沒有錯誤。錯誤可能表示 Lambda 函數未正確處理 AWS IoT Core 傳送給它的連線事件。

   如需在 Lambda 函數中處理事件的相關資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。您可以使用 AWS Lambda 主控台中的測試功能 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//) 在函數中硬式編碼測試值，以確保函數正確處理事件。

1. 如果您看到叫用沒有錯誤，但您的裝置無法連接 (或發佈、訂閱和接收訊息)，問題可能是您 Lambda 函數傳回的政策未對您裝置正在嘗試採取的動作提供許可。執行下列步驟，以判斷函數傳回的政策是否發生任何錯誤。

   1. 使用 Amazon CloudWatch Logs Insights 查詢，來掃描短時間內的記錄以檢查是否發生失敗。下列範例查詢會依時間戳記排序事件並尋找失敗。

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. 更新您的 Lambda 函數以記錄其傳回的資料， AWS IoT Core 以及觸發函數的事件。您可以使用這些記錄來檢查函數建立的政策。

1. 如果您看到叫用沒有錯誤，但您的裝置無法連接 (或發佈、訂閱和接收訊息)，另一個原因可能是您 Lambda 函數超過逾時限制。自訂授權方的 Lambda 函數逾時限制為 5 秒。您可以在 CloudWatch 日誌或指標中查看函數持續時間。

## 調查裝置問題
<a name="custom-auth-troubleshooting-investigate"></a>

如果您發現叫用 Lambda 函數沒有問題，函數傳回的政策也沒有問題，請尋找裝置嘗試連線方面的問題。格式不正確的連線請求可能會導致 AWS IoT Core 不觸發您的授權方。在 TLS 和應用程式層可能會同時發生連線問題。

**可能的 TLS 層問題：**
+ 客戶必須在所有自訂身分驗證請求中傳遞主機名稱標頭 (HTTP、MQTT over WebSockets) 或伺服器名稱指示 TLS 延伸 (HTTP、MQTT over WebSockets、MQTT)。在這兩種情況下，傳遞的值必須符合您帳戶的其中一個 AWS IoT Core 資料端點。這些是當您執行下列 CLI 命令時傳回的端點。
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data` (適用於舊式 VeriSign 端點)
+ 使用自訂身分驗證進行 MQTT 連線的裝置也須傳遞應用程式層通訊協定交涉 (ALPN) TLS 延伸 (其值為 `mqtt`)。
+ 自訂身分驗證目前僅適用於連接埠 443。

**可能的應用程式層問題：**
+ 如果已啟用簽署 (在您的授權方中，`signingDisabled` 欄位是 false)，請尋找下列簽章問題。
  + 確定您是在 `x-amz-customauthorizer-signature` 標頭或在查詢字串參數中傳遞字符簽章。
  + 確定服務不是簽署字符以外的值。
  + 確定您在標頭或查詢參數中傳遞字符，而此標頭或查詢參數是您在授權方的 `token-key-name` 欄位中所指定的。
+ 確定您在 `x-amz-customauthorizer-name` 標頭或查詢字串參數中傳遞的授權方名稱是有效的，或者您已為您的帳戶定義預設授權方。