

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

# 自定义客户证书验证
<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)。