

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 身份验证
<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 持有一个或多个名为 CA 证书的特殊证书，它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书。X.509 证书链既用于客户端进行的服务器身份验证，又用于服务器进行的客户端身份验证。

# 服务器身份验证
<a name="server-authentication"></a>

当您的设备或其他客户端尝试连接时 AWS IoT Core， AWS IoT Core 服务器将发送一个 X.509 证书，您的设备将使用该证书对服务器进行身份验证。身份验证通过验证 [X.509 证书链](x509-client-certs.md)在 TLS 层进行。这与浏览器在您访问 HTTPS URL 时使用的方法相同。如果要使用您自己的证书颁发机构提供的证书，请参阅 [管理 CA 证书](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`终端节点出示由[亚马逊信任服务](https://www.amazontrust.com/repository/) CA 签署的服务器证书。

ATS 端点提供的证书由 Starfield 进行交叉签名。某些 TLS 客户端实现要求验证信任根，并要求将 Starfield CA 证书安装到客户端的信任存储中。

**警告**  
建议不要使用对整个证书（包括颁发者名称等）进行哈希处理的证书固定方法，因为这将导致证书验证失败，因为我们提供的 ATS 证书由 Starfield 进行交叉签名并具有其它颁发者名称。

**重要**  
使用 `iot:Data-ATS` 端点。赛门铁克和威瑞信证书已被弃用，不再受其支持。 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 SDK 创建
<a name="java-client"></a>

要创建使用 `iot:Data-ATS` 端点的 `IotDataPlaneClient`，您必须执行以下操作。
+ 使用 [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();
}
```

## 用于服务器身份验证的 CA 证书
<a name="server-authentication-certs"></a>

根据您使用的数据端点类型和协商的密码套件， AWS IoT Core 服务器身份验证证书由以下根 CA 证书之一签名：

**Amazon Trust Services 端点（首选）**

**注意**  
您可能需要右键单击这些链接，然后选择**将链接另存为...** 将这些证书另存为文件。
+ 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 根 CA 证书](https://www.amazontrust.com/repository/SFSRootCAG2.pem)进行交叉签名。自 2018 年 5 月 9 日在亚太 AWS IoT Core 地区（孟买）地区推出以来，所有新地区仅提供 ATS 证书。 AWS IoT Core 

**VeriSign 终端节点（旧版）**
+ RSA 2048 位密钥：[3 VeriSign 类公共主要 G5](https://www.digicert.com/kb/digicert-root-certificates.htm) 根 CA 证书

## 服务器身份验证指南
<a name="server-authentication-guidelines"></a>

有很多变量会影响设备验证 AWS IoT Core 服务器身份验证证书的能力。例如，设备的内存可能太有限，无法容纳所有可能的根 CA 证书，或者设备可能会实施非标准的证书验证方法。由于这些原因，我们建议遵循以下准则：
+ 我们建议您使用 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) 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 证书。您可能需要右键单击这些链接，然后选择**将链接另存为...** 将这些证书另存为文件。
+ 如果在连接到 ATS 端点时遇到服务器证书验证问题，请尝试将相关的交叉签名的 Amazon Root CA 证书添加到您的信任存储中。您可能需要右键单击这些链接，然后选择**将链接另存为...** 将这些证书另存为文件。
  + [交叉签名 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/)。

**注意**  
CA 证书具有一个过期日期，在该日期后，这些证书将无法用于验证服务器的证书。可能必须在 CA 证书的过期日期前替换这些证书。请确保可以更新所有设备或客户端上的根 CA 证书，以确保持续的连接并保持最新的安全最佳实践。

**注意**  
在设备代码 AWS IoT Core 中连接时，请将证书传递到您用于连接的 API。您使用的 API 因 SDK 而异。有关更多信息，请参阅[AWS IoT Core 设备 SDKs](iot-sdks.md)。

# 客户端身份验证
<a name="client-authentication"></a>

AWS IoT 支持三种类型的身份主体进行设备或客户端身份验证：
+ [X.509 客户端证书](x509-client-certs.md)
+ [IAM 用户、组和角色](iam-users-groups-roles.md)
+ [Amazon Cognito Identity](cognito-identities.md)

这些身份可与设备、移动、Web 或桌面应用程序结合使用。用户甚至可以键入 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 账户 s 中注册 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 要求客户端向传输层安全 [(TLS) 协议发送服务器名称指示 (SNI) 扩展](https://tools.ietf.org/html/rfc3546#section-3.1)。有关配置 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 Root CA 的客户端证书，并可以使用您自己的由其它证书颁发机构（CA）签发的客户端证书。有关使用 AWS IoT 控制台创建使用 Amazon 根 CA 的证书的更多信息，请参阅[创建 AWS IoT 客户证书](device-certs-create.md)。有关使用您自己的 X.509 证书的更多信息，请参阅 [创建您自己的客户端证书](device-certs-your-own.md)。

对于 CA 证书签发的证书过期日期和时间，将在创建 CA 证书时设置。由此生成的 X.509 证书将于世界标准时间 2049 年 12 月 31 日午夜 AWS IoT 到期（2049-12-31T23：59:59 Z）。

AWS IoT Device Defender 可以对您的 AWS 账户 和支持常见物联网安全最佳实践的设备进行审计。这包括管理由您的 CA 或 Amazon Root 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 博客上，[如何使用管理物联网设备证书轮换，深入探讨了设备证书轮换的管理和](https://aws.amazon.com/blogs/iot/how-to-manage-iot-device-certificate-rotation-using-aws-iot/)安全最佳实践 AWS IoT。

## 在多账户注册中使用多个 AWS 账户 X.509 客户端证书
<a name="multiple-account-cert"></a>

多账户注册能够在同一区域或不同区域的 AWS 账户之间移动设备。您可以在预生产账户中注册、测试和配置设备，然后在生产账户中注册并使用相同的设备和设备证书。您也可以在设备上注册客户端证书，或者在没有注册的 CA 的情况下注册设备证书 AWS IoT。有关更多信息，请参阅 [Register a client certificate signed by an unregistered CA (CLI)](manual-cert-registration.md#manual-cert-registration-noca-cli)（注册由未注册的 CA 签发的客户端证书（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)发送到传输层安全 (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 (RSSASSA-PSS)
+ SHA384WITHRSAANDMGF1 (RSSASSA-PSS)
+ SHA512WITHRSAANDMGF1 (RSSASSA-PSS)
+ DSA\$1WITH\$1 SHA256
+ 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）必须包含公有密钥。该密钥可以是长度至少为 2048 位的 RSA 密钥，或者是来自 NIST P-256、NIST P-384 或 NIST P-521 曲线的 ECC 密钥。有关更多信息，请参阅 [CreateCertificateFromCsr API 参考指南](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCertificateFromCsr.html) 中的 *AWS IoT *。

## 支持的密钥算法 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 Root 证书颁发机构签发的客户端证书，以及如何下载证书文件。创建客户端证书文件后，您必须在客户端上安装这些文件。

**注意**  
提供的每个 X.509 客户端证书都 AWS IoT 包含您在创建证书时设置的颁发者和主题属性。只有在创建证书后，证书属性才是不可改变的。

您可以使用 AWS IoT 控制台或创建由 Amazon 根 AWS IoT 证书颁发机构签名的证书。 AWS CLI 

## 创建 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. 选择**一键式创建证书（建议）**，然后选择**创建证书**。

1. 从**已创建证书**页面，将事物、公有密钥和私有密钥的客户端证书文件下载到安全位置。由 AWS IoT 生成的这些证书只能用于 AWS IoT 服务。

   如果您还需要 Amazon Root 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 提供了创建由 Amazon 根证书颁发机构签名的客户证书的**[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)**命令。但是，此命令不会下载 Amazon Root CA 证书文件。您可以从下载 Amazon Root CA 证书文件 [用于服务器身份验证的 CA 证书](server-authentication.md#server-authentication-certs)。

此命令创建私钥、公钥和 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 证书验证证书的所有权。要使用由非亚马逊 CA 的 CA 签名的设备证书，必须注册 CA 的证书， AWS IoT 这样我们才能验证设备证书的所有权。

AWS IoT 支持多种自带证书的方式 (BYOC)：
+ 首先，注册用于签署客户端证书的 CA，然后注册各个客户端证书。如果要在设备或客户端首次连接时将其注册到其客户端证书 AWS IoT （也称为[即时配置），则必须向注册签名 CA AWS IoT 并激活自动](https://docs.aws.amazon.com//iot/latest/developerguide/jit-provisioning.html)注册。
+ 如果您无法注册签名 CA，则可以选择在没有 CA 的情况下注册客户端证书。对于未使用 CA 注册的设备，当您将它们连接到 AWS IoT时，您需要出示[服务器名称指示（SNI）](https://www.rfc-editor.org/rfc/rfc3546#section-3.1)。

**注意**  
要使用 CA 注册客户端证书，必须向注册签名 CA AWS IoT，而不是向层次结构 CAs 中的任何其他证书注册。

**注意**  
在 `DEFAULT` 模式下，一个 CA 证书只能由一个区域中的一个账户注册。在 `SNI_ONLY` 模式下，一个 CA 证书可以由一个区域中的多个账户注册。

有关使用 X.509 证书支持多个设备的更多信息，请参阅 [设备预调配](iot-provision.md) 以查看 AWS IoT 支持的不同证书管理和预调配选项。

**Topics**
+ [

# 管理 CA 证书
](manage-your-CA-certs.md)
+ [

# 使用您的 CA 证书创建客户端证书
](create-device-cert.md)

# 管理 CA 证书
<a name="manage-your-CA-certs"></a>

本节介绍管理您自己的证书颁发机构（CA）证书的常见任务。

 AWS IoT 如果您使用的是由 AWS IoT 无法识别的 CA 签名的客户端证书，则可以向注册证书颁发机构 (CA)。

如果您希望客户端在首次连接 AWS IoT 时自动向其注册其客户端证书，则必须向注册签署客户端证书的 CA AWS IoT。否则，您不需要注册对客户端证书签发的 CA 证书。

**注意**  
在 `DEFAULT` 模式下，一个 CA 证书只能由一个区域中的一个账户注册。在 `SNI_ONLY` 模式下，一个 CA 证书可以由一个区域中的多个账户注册。

**Topics**
+ [

## 创建 CA 证书
](#create-your-CA-cert)
+ [

## 注册 CA 证书
](#register-CA-cert)
+ [

## 停用 CA 证书
](#deactivate-ca-cert)

## 创建 CA 证书
<a name="create-your-CA-cert"></a>

如果没有 CA 证书，则可以使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具创建一个。

**注意**  
您无法在 AWS IoT 控制台中执行此过程。

**使用 [OpenSSL v1.1.1i](https://www.openssl.org/) 工具创建 CA 证书**

1. 生成密钥对。

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

1. 使用密钥对中的私有密钥生成 CA 证书。

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

## 注册 CA 证书
<a name="register-CA-cert"></a>

这些程序描述了如何注册来自非亚马逊 CA 的证书颁发机构 (CA) 的证书。 AWS IoT Core 使用 CA 证书验证证书的所有权。要使用由非亚马逊 CA 的 CA 签名的设备证书，您必须向注册 CA 证书， AWS IoT Core 这样它才能验证设备证书的所有权。

### 注册 CA 证书（控制台）
<a name="register-CA-cert-console"></a>

**注意**  
若要在控制台中注册 CA 证书，请在控制台中的 [Register CA certificate](https://console.aws.amazon.com//iot/home#/create/cacertificate)（注册 CA 证书）处开始注册。您可以在多账户模式下注册您的 CA，而无需提供验证证书或访问私有密钥的权限。在多账户模式下，多个 AWS 账户 可以在同一个 AWS 区域中注册 CA。您可以通过提供验证证书和 CA 私有密钥的所有权证明，在单账户模式下注册您的 CA。

### 注册 CA 证书（CLI）
<a name="register-CA-cert-cli"></a>

您可以在 `DEFAULT` 模式或 `SNI_ONLY` 模式下注册 CA 证书。CA 可以一对一 AWS 账户 地在`DEFAULT`模式下注册 AWS 区域。一个 CA 可以在同一个`SNI_ONLY`模式下通过多个 AWS 账户 CA 进行注册 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)。

### 创建 CA 验证证书以在控制台中注册 CA 证书
<a name="create-CA-verification-cert"></a>

**注意**  
此过程仅适用于从 AWS IoT 控制台注册 CA 证书的情况。  
如果您不是从控制台进入此过程，请在 AWS IoT 控制台的 Register 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 命令后，您应该准备好这些文件，以便在返回控制台时使用。
   + 您的 CA 证书文件（上一条命令中使用的 `root_CA_cert_filename.pem`）
   + 您在上一步中创建的验证证书（在上一个命令中*verification\$1cert\$1filename.pem*使用）

## 停用 CA 证书
<a name="deactivate-ca-cert"></a>

启用证书颁发机构 (CA) 证书进行自动客户端证书注册后， AWS IoT 会检查 CA 证书以确保 CA 已启用`ACTIVE`。如果 CA 证书是`INACTIVE`，则 AWS IoT 不允许注册客户端证书。

通过将 CA 证书设置为 `INACTIVE`，可防止该 CA 颁发的任何新客户端证书自动注册。

**注意**  
除非您明确吊销由受损的 CA 证书签发的每个已注册客户端证书，否则所有此类证书均将继续工作。

### 停用 CA 证书（控制台）
<a name="deactivate-ca-cert-console"></a>

**使用控制台停用 CA 证书 AWS IoT**

1. 登录 AWS 管理控制台 并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择 “**安全**”，选择**CAs**。

1. 在证书颁发机构列表中，找到要停用的证书颁发机构，然后选择省略号图标以打开选项菜单。

1. 在选项菜单上，选择**停用**。

证书颁发机构应在列表中显示为**停用**。

**注意**  
 AWS IoT 控制台不提供列出由您停用的 CA 签署的证书的方法。有关列出这些证书的 AWS CLI 选项，请参阅 [停用 CA 证书（CLI）](#deactivate-ca-cert-cli)。

### 停用 CA 证书（CLI）
<a name="deactivate-ca-cert-cli"></a>

 AWS CLI 提供了停用 CA 证书的[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)命令。

```
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 签名的所有已注册客户端证书的列表。对于由指定 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 证书的状态。

# 使用您的 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 为在客户端首次连接时自动注册。

 如果您希望客户端和设备在首次连接时注册其客户端证书，则必须在要使用的区域中拥有使用 AWS IoT 签署客户端证书所需的 [注册 CA 证书](manage-your-CA-certs.md#register-CA-cert)。Amazon Root CA 将自动向注册 AWS IoT。

客户证书可以由 AWS 账户 和地区共享。在您要使用客户端证书的每个账户和区域中，必须执行这些主题中的流程。在一个账户或区域中注册的客户端证书，不会在另一个账户或区域中自动识别。

**注意**  
使用传输层安全性（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 账户 s 和 Regions 共享。

## 注册由已注册的 CA（控制台）签发的客户端证书
<a name="manual-cert-registration-console"></a>

**注意**  
在执行此过程之前，请确保您拥有客户端证书的.pem 文件，并且该客户端证书由您[注册](manage-your-CA-certs.md#register-CA-cert)的 CA 签名。 AWS IoT

**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. 在 **Certificates to upload**（要上载的证书）对话框的 **Register certificate**（注册证书）页上，执行以下操作：
   + 选择 **CA 注册到 AWS IoT**。
   + 从 **Choose a CA certificate**（选择 CA 证书）中，选择您的 **Certification authority**（证书颁发机构）。
     + 选择 **Register a new CA**（注册新 CA）以注册未向 AWS IoT注册的新 **Certification authority**（证书颁发机构）。
     + 如果 **Amazon Root certificate authority**（Amazon 根证书颁发机构）是您的证书颁发机构，请将 **Choose a CA certificate**（选择 CA 证书）留空。
   + 最多选择 10 个证书进行上传和注册 AWS IoT。
     + 使用您在 [创建 AWS IoT 客户证书](device-certs-create.md) 和 [使用您的 CA 证书创建客户端证书](create-device-cert.md) 中创建的证书文件。
   + 选择 **Activate**（激活）或 **Deactivate**（停用）。如果选择**停用**，[激活或停用客户端证书](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. 在左侧的导航窗格中，选择**安全**，选择**证书**，然后选择**创建**。

1. 在 **Create a certificate**（创建证书）上，找到 **Use my certificate**（使用我的证书）条目，然后选择 **Get started**（入门）。

1. 在 **Select CA**（选择 CA）上，选择 **Next**（下一步）。

1.  在 **Register exsiting 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 文件。客户端证书必须由您[注册](manage-your-CA-certs.md#register-CA-cert)的证书颁发机构 (CA) 签名 AWS IoT。

使用 [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。

要在客户端首次连接时注册客户端证书，必须启用 CA 证书进行自动注册，并将客户端的第一个连接配置为提供所需的证书。 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. 在左侧导航窗格中，选择 “**安全**”，选择**CAs**。

1. 在证书颁发机构列表中，找到要启用自动注册的颁发机构，然后使用省略号图标打开选项菜单。

1. 在选项菜单上，选择**启用自动注册**。

**注意**  
证书颁发机构列表中不显示自动注册状态。要查看证书颁发机构的自动注册状态，您必须打开证书颁发机构的**详细信息**页面。

## 配置 CA 证书以支持自动注册（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)命令将 CA 证书设置为`autoRegistrationStatus``ENABLE`。

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

如果您要在注册 CA 证书时启用 `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 连接时，在传输层安全 (TLS) 握手期间，由您的 CA 证书签名的客户端证书必须存在于客户端上。

当客户端连接到时 AWS IoT，使用您在创建客户端证书或[创建自己的 AWS IoT 客户端证书](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-create.html)[中创建的客户端证书](https://docs.aws.amazon.com/iot/latest/developerguide/device-certs-your-own.html)。 AWS IoT 将 CA 证书识别为已注册的 CA 证书，注册客户端证书，并将其状态设置为`PENDING_ACTIVATION`。这意味着，已自动注册客户端证书，该证书正在等待激活。客户端证书的状态必须为 `ACTIVE`，然后才能将其用于连接到 AWS IoT。有关激活客户端证书的信息，请参阅 [激活或停用客户端证书](activate-or-deactivate-device-cert.md)。

**注意**  
您可以使用 AWS IoT Core just-in-time注册 (JITR) 功能配置设备，而不必在设备首次连接时发送整个信任链。 AWS IoT Core可以出示 CA 证书，但连接时设备需要发送[服务器名称指示（SNI）](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1)扩展。

当 AWS IoT 自动注册证书或客户端提供`PENDING_ACTIVATION`状态为证书时，会向以下 MQTT 主题 AWS IoT 发布一条消息：

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

其中 `caCertificateId` 是颁发客户端证书的 CA 证书的 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 规则的更多信息，请参阅[just-in-time 注册客户证书](https://aws.amazon.com/blogs/iot/just-in-time-registration-of-device-certificates-on-aws-iot/)。 AWS IoT

如果在自动注册客户端证书的过程中出现任何错误或异常，则会在日志中 AWS IoT 将事件或消息发送到您的日 CloudWatch 志。有关为您的账户设置日志的更多信息，请参阅 [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. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要激活的证书，然后使用省略号图标打开选项菜单。

1. 在选项菜单中，选择**激活**。

证书应在证书列表中显示为**活动**。

## 停用客户端证书（控制台）
<a name="deactivate-device-cert-console"></a>

**使用控制台停用客户端证书 AWS IoT**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要停用的证书，然后使用省略号图标打开选项菜单。

1. 在选项菜单中，选择**停用**。

证书应在证书列表中显示为**停用**。

## 激活客户端证书（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. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要附加策略的证书，选择省略号图标以打开证书的选项菜单，然后选择**附加事物**。

1. 在弹出窗口中，找到要附加到证书的事物的名称，选中其复选框，然后选择 **Attach**（附上）。

现在，事物对象应显示在证书详细信息页面上的事物列表中。

## 将策略附加到客户端证书（控制台）
<a name="attach-to-cert-policy-console"></a>

您需要策略对象的名称才能完成此流程。

**将策略对象附加到已注册的证书**

1. 登录 AWS 管理控制台并打开[AWS IoT 控制台](https://console.aws.amazon.com/iot/home)。

1. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要附加策略的证书，选择省略号图标以打开证书的选项菜单，然后选择**附加策略**。

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. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

1. 在证书列表中，找到要吊销的证书，然后使用省略号图标打开选项菜单。

1. 在选项菜单中，选择**吊销**。

如果证书已成功吊销，它将在证书列表中显示为**已吊销**。

## 吊销客户端证书（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. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

   选择您打算传输并带有 **Active**（活动）或者 **Inactive**（非活动）状态的证书并打开其详细信息页面。

1. 在证书**详细信息**页面的**操作**菜单中，如果**停用**选项可用，则选择**停用**选项来停用证书。

1. 在证书的 **Details**（详细信息）页面中，在左侧菜单中，选择 **Policies**（策略）。

1. 在证书的 **Policies**（策略）页面上，如果证书附加了任何策略，请打开策略的选项菜单，然后选择 **Detach**（分离）以分离各个证书。

   在您继续操作前，该证书不能附加有任何策略。

1. 在证书的 **Policies**（策略）页面中，在左侧菜单中，选择 **Thins**（事物）。

1. 在证书的 **Things**（事物）页面，如果证书附加了任何事物，请打开事物的选项菜单并选择 **Detach**（分离）以分离各个事物。

   在您继续操作前，该证书不能附加有任何事物。

1. 在证书的 **Things**（事物）页面中，在左侧菜单中，选择 **Details**（详细信息）。

1. 在证书**详细信息**页面的**操作**菜单中，选择**开始传输**来打开**开始传输**对话框。

1. 在 “**开始转移**” 对话框中，输入要接收证书的账户号和一条可选的短消息。 AWS 账户 

1. 选择 **Start transfer**（开始传输）以传输证书。

控制台应显示一条消息，指示传输成功或失败。如果传输开始，证书的状态将更新为 **Transferred**（已传输）。

### 开始证书传输（CLI）
<a name="transfer-cert-init-cli"></a>

要完成此过程，您需要要转移*certificateArn*的证书的*certificateId*和。

在带有要传输证书的账户执行此流程。

**开始将证书转移到另一个 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. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

   选择您想要接受或拒绝且状态为 **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. 在左侧导航窗格中，选择**安全**，然后选择**证书**。

   选择状态为 **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）](https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol)或[证书吊销列表（CRL）](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)发送到传输层安全性（TLS）协议，并在 `host_name` 字段中提供完整的端点地址。

`clientCertificateChain`  
代表客户端 X.509 证书链的字符串数组。

**Lambda 函数响应示例**

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

`isAuthenticated`  
一个布尔值，指示是否已对请求进行身份验证。

**注意**  
在 Lambda 响应中，`isAuthenticated` 必须为 `true`，才能继续进行进一步身份验证和授权。否则，会禁用物联网客户端证书，并会阻止 X.509 客户端证书进行自定义身份验证，从而无法进行进一步的身份验证和授权。

## 第 3 步：授权调用您 AWS IoT 的 Lambda 函数
<a name="customize-client-configuration-grant-permission"></a>

创建 Lambda 函数后，必须使用 add-permissi AWS IoT on CLI 命令授予调用该函数的[权限](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html)。请注意，每当尝试连接到您配置的端点时，都将调用此 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 层中 AWS IoT 调用的 Lambda 函数的亚马逊资源名称 (ARN)。要自定义客户端身份验证以执行自定义客户端证书验证，您必须添加您在上一步中创建的 Lambda 函数的 ARN。

有关更多信息，请参阅 *AWS IoT API 参考[UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)*中的[CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.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 允许与亚马逊 DynamoDB 进行交互。有关更多信息，请参阅 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)。

对于通过 HTTP 的消息代理连接，使用签名版本 4 签名过程对用户、群组和角色 AWS IoT 进行身份验证。有关信息，请参阅[签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)。

将 AWS 签名版本 4 与一起使用时 AWS IoT，客户端必须在 TLS 实现中支持以下内容：
+ TLS 1.2
+ SHA-256 RSA 证书签名验证
+ 来自 TLS 密码套件支持部分的密码套件之一

有关信息，请参阅 [的身份和访问管理 AWS IoT](security-iam.md)。

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

Amazon Cognito Identity 允许您创建临时的、有限的权限 AWS 凭证，以便在移动和网络应用程序中使用。在使用 Amazon Cognito Identity 时，请创建身份池，这些身份池将为您的用户创建唯一身份并通过 Login with Amazon、Facebook 和 Google 这样的身份提供者对其进行身份验证。您还可以将 Amazon Cognito Identity 与您自己的经开发人员验证的身份结合使用。有关更多信息，请参阅 [Amazon Cognito Identity](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)。

要使用 Amazon Cognito Identity，您需要定义与 IAM 角色相关联的 Amazon Cognito Identity 池。IAM 角色与一个 IAM 策略相关联，该策略向您的身份池中的身份授予访问 AWS 资源（如调用 AWS 服务）的权限。

Amazon Cognito Identity 可创建未经身份验证的身份和经过身份验证的身份。未经身份验证的身份用于希望在不登录的情况下使用该应用程序的移动或 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 Identity，则经过身份验证的用户将无法在中进行授权， AWS IoT 并且无法访问 AWS IoT 资源和操作。有关为 Amazon Cognito Identity 创建策略的更多信息，请参阅 [发布/订阅策略示例](pub-sub-policy.md) 和 [使用 Amazon Cognito Identity 的授权](cog-iot-policies.md)。

![\[应用程序使用 Amazon Cognito Identity 访问设备。\]](http://docs.aws.amazon.com/zh_cn/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_cn/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core 自定义身份验证和授权工作流程
<a name="custom-authentication-workflow"></a>

下面的列表说明了自定义身份验证和授权工作流中的每个步骤。

1. 设备使用支持的终端连接到客户 AWS IoT Core 的数据端点[设备通信协议](protocols.md)。设备在请求的标头字段或查询参数（针对基于协议的 HTTP 发布或 MQTT），或者在 MQTT CONNECT 消息的用户名和密码字段（适用于 WebSockets 协议上的 MQTT 和 MQTT）中传递凭证。 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说明创建自定义授权方，请参阅[教程：为创建自定义授权方](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html)。 AWS IoT Core

各授权方均包括以下组件：
+  *名称*：用户定义的唯一字符串，用于标识授权方。
+  *Lambda 函数 ARN*：Lambda 函数的 Amazon 资源名称（ARN），用于实现授权和身份验证逻辑。  
+  *令牌密钥名称*：用于从 HTTP 标头、查询参数或 MQTT CONNECT 用户名中提取令牌以执行签名验证的键名称。如果在授权方中启用了签名，则需要此值。
+  *签名禁用标志（可选）*：指定是否禁用凭证签名要求的布尔值。这对于签名凭证没有意义的情况非常有用，例如使用 MQTT 用户名和密码的身份验证方案。默认值为 `false`，因此默认情况下签名将处于启用状态。
+  *令牌签名公有密钥*： AWS IoT Core 用于验证令牌签名的公有密钥。其最小长度为 2048 位。如果在授权方中启用了签名，则需要此值。  

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 调用您的授权方时，它会使用包含以下 JSON 对象的事件触发与授权方关联的 Lambda。示例 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`：字母数字字符串，它充当自定义授权请求发送的令牌的标识符。该值必须是包含至少一个字符且不超过 128 个字符的字母数字字符串，并与此正则表达式（正则表达式）模式匹配：`([a-zA-Z0-9]){1,128}`。不允许在 in `principalId` 中 AWS IoT Core使用非字母数字的特殊字符。如果允许使用非字母数字特殊字符，请参阅其他 AWS 服务的文档。`principalId`
+  `policyDocuments`：JSON 格式的 AWS IoT Core 策略文档列表有关创建 AWS IoT Core 策略的更多信息，请参阅。[AWS IoT Core 政策](iot-policies.md)策略文档的数量最多为 10 个。每个策略文档最多可以包含 2048 个字符。
+  `disconnectAfterInSeconds`：指定与 AWS IoT Core 网关的连接的最大持续时间（以秒为单位）的整数。最小值为 300 秒，最大值为 86400 秒。默认值是 86,400。
**注意**  
`disconnectAfterInSeconds` 的值（由 Lambda 函数返回）在建立连接时设置。在后续策略刷新 Lambda 调用过程中，将无法修改此值。
+  `refreshAfterInSeconds`：指定策略刷新之间间隔的整数。当此时间间隔过去时， AWS IoT Core 将调用 Lambda 函数以允许策略刷新。最小值为 300 秒，最大值为 86400 秒。

  以下 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)。 在 TLS 上的 MQTT 和通过 WebSockets连接的 MQ AWS IoT Core TT 中，在字段值中指定的间隔内缓存此策略。`refreshAfterInSeconds`在 HTTP 连接的情况下，每个授权请求都会调用 Lambda 函数，除非您的设备使用 HTTP 持久连接（也称为 HTTP 保持活动状态或 HTTP 连接重用），否则您可以在配置授权方时选择启用缓存。在此间隔内， AWS IoT Core 授权在已建立的连接中针对此缓存策略执行操作，而无需再次触发您的 Lambda 函数。如果在自定义身份验证期间出现故障，则 AWS IoT Core 终止连接。 AWS IoT Core 如果连接的打开时间超过`disconnectAfterInSeconds`参数中指定的值，也会终止该连接。

 以下内容 JavaScript 包含一个 Node.js Lambda 函数示例，该函数在 MQTT Connect 消息中查找值为`test`的密码，并返回一个策略，该策略授予使用`myClientName`名为的客户端进行连接 AWS IoT Core 并发布到包含相同客户端名称的主题的权限。如果未找到预期密码，则返回拒绝这两个操作的策略。

```
// 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 Connect 消息的值。

```
{
  "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>

 您可以使用 [CreateAuthorizerAP](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) I 创建授权方。 以下示例描述了该命令。

```
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 服务权限才能代表您调用该函数。 您可以使用以下命令执行此操作。

**注意**  
默认的物联网端点可能不支持将自定义授权方与 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>

 您可以使用以下 APIs方法来管理您的授权者。
+ [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 客户端证书中，则在对 X.509 客户端证书 AWS IoT Core 进行身份验证后，您可以使用自定义授权方根据证书字段中存储的信息来识别特定设备。 CommonName 将自定义身份验证与 X.509 证书配合使用可以增强设备在连接设备时的安全管理，并为管理身份验证 AWS IoT Core 和授权逻辑提供更大的灵活性。 AWS IoT Core [https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html)有关 AWS IoT Core 设备端点支持的身份验证类型和应用程序协议的更多信息，请参阅[设备通信协议](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)。

**注意**  
各区域不支持使用 X.509 客户端证书进行自定义身份验证。 AWS GovCloud (US) 

**重要**  
您必须使用通过[域配置](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 函数会收到一个事件，其中包含一个 JSON 对象以及设备的 X.509 客户端证书数据。您的 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（传输层安全性）协议相关的信息。  
+ `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)发送到传输层安全性（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 个。每个策略文档最多可以包含 2048 个字符。如果您的客户端证书和 Lambda 函数附加了多个策略，则该权限是所有策略的集合。有关创建 AWS IoT Core 策略的更多信息，请参阅[策略](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)。

`disconnectAfterInSeconds`  
一个整数，它指定 AWS IoT Core 网关连接的最大持续时间（以秒为单位）。最小值为 300 秒，最大值为 86400 秒。`disconnectAfterInSeconds` 在连接的生命周期内有效，连续刷新策略时不会刷新。

`refreshAfterInSeconds`  
指定策略刷新之间间隔的整数。此间隔过后， AWS IoT Core 调用 Lambda 函数以允许刷新策略。最小值为 300 秒，最大值为 86400 秒。

### 示例 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
    }'
```

如果您已经有域配置，请根据需要使用 [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` 和 `applicationProtocol`。请注意，您不能更改默认端点 (`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 参考[UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)*中的[CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.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>

使用 [HTTP 发布 API 向 AWS IoT Core 其发送数据的设备可以在其 HTTP P](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) OST 请求中通过请求标头或查询参数传递凭证。设备可以使用 `x-amz-customauthorizer-name` 标头或查询参数指定要调用的授权方。如果您在授权方中启用了令牌签名，则必须使用请求标头或查询参数传递 `token-key-name` 和 `x-amz-customauthorizer-signature`。请注意，在`token-signature`浏览器中使用 JavaScript 该值时必须经过网址编码。

**注意**  
HTTPS 协议的客户授权方仅支持发布操作。有关 HTTPS 协议的更多信息，请参阅[设备通信协议](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>

 使用 MQTT 连接连接的设备可以通过 MQTT 消息的`username`和`password`字段传递凭证。 AWS IoT Core `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
```

要调用授权方，使用 MQTT 和自定义身份验证连接的设备必须 AWS IoT Core 通过端口 443 进行连接。它们还必须通过应用层协议协商 (ALPN) TLS 扩展（值为）`mqtt`和服务器名称指示 (SNI) 扩展名及其 AWS IoT Core 数据端点的主机名。为避免潜在的错误，`x-amz-customauthorizer-signature` 的值应采用 URL 编码。我们还强烈建议 `x-amz-customauthorizer-name` 和 `token-key-name` 的值采用 URL 编码。有关这些值的更多信息，请参阅 [设备通信协议](protocols.md)。V2 [AWS IoT Device SDK、Mobile SDK 和 AWS IoT Device Client](iot-sdks.md) 可以配置这两个扩展。 

## MQTT 结束了 WebSockets
<a name="custom-auth-websockets"></a>

 使用 MQTT 连接的设备 WebSockets 可以通过以下两种方式之一传递证书。 AWS IoT Core 
+ 通过 HTTP UPGRADE 请求中的请求标头或查询参数来建立 WebSockets 连接。
+ 通过 `username` 和 `password` 字段中的 MQTT CONNECT 消息。

 如果您通过 MQTT 连接消息传递凭证，则需要使用 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 控制台的 “**安全**” 部分中单击所需的授权者来执行此操作。

1. 检查 Lambda 函数的调用指标。为此，请执行以下步骤。

   1. 打开 AWS Lambda 控制台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/))，然后选择与您的授权方关联的功能。

   1. 选择**监控**选项卡并查看与您的问题相关的时间范围的指标。

1. 如果您没有看到任何调用，请验证是否 AWS IoT Core 有权调用您的 Lambda 函数。如果您看到调用，则跳到下一步。执行以下步骤以验证 Lambda 函数是否具有所需的权限。

   1. 在 AWS Lambda 控制台中为您的函数选择 “**权限**” 选项卡。

   1. 在页面底部找到**基于资源的策略**部分。如果您的 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 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` 标头或查询字符串参数传递的授权方名称是有效的，或者您已为您的账户定义了默认授权方。