

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

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

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

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

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

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

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

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

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

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

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

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

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

**Lambda 函數事件範例**

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

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

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

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

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

**Lambda 函數回應範例**

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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