

# 使用 CloudFront 连接函数和 KVS 实施吊销
<a name="revocation-connection-function-kvs"></a>

您可以将 CloudFront 连接函数与 KeyValueStore 结合使用，来实施双向 TLS 身份验证的证书吊销检查。此方法提供了一种可扩展的实时证书吊销机制，可作为 CloudFront 的内置证书验证的有力补充。

连接函数是指在 TLS 连接建立过程中，在 CloudFront 边缘站点运行的 JavaScript 函数，此类函数可用于为 mTLS 身份验证实施自定义证书验证逻辑。有关连接函数的详细信息，请参阅[关联 CloudFront 连接函数](connection-functions.md)。

## 证书吊销如何与连接函数结合使用
<a name="how-revocation-works"></a>

CloudFront 的标准证书验证功能可验证证书链、签名和到期日期，但不包括内置的证书吊销检查。通过使用连接函数，您可以在 TLS 握手过程中实施自定义吊销检查。

证书吊销流程如下所述：

1. 将已吊销证书的序列号存储在 CloudFront KeyValueStore 中。

1. 当客户端提供证书时，系统将调用您的连接函数。

1. 该函数会根据 KeyValueStore 中的数据核对证书序列号。

1. 如果在存储中找到了序列号，则证书将被吊销。

1. 您的函数拒绝已吊销证书的连接。

此方法可在 CloudFront 的全球边缘网络中提供近乎实时的吊销检查。

## 针对已吊销的证书设置 KeyValueStore
<a name="setup-kvs-revoked-certs"></a>

首先，创建一个 KeyValueStore 来存储已吊销证书的序列号：

### 创建 KeyValueStore（控制台）
<a name="create-kvs-console"></a>

1. 登录 AWS 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 在导航窗格中，选择**键值存储**。

1. 选择**创建键值存储**。

1. 输入键值存储的名称（例如，revoked-certificates）。

1. （可选）添加描述。

1. 选择**创建键值存储**。

### 创建 KeyValueStore（AWS CLI）
<a name="create-kvs-cli"></a>

以下示例演示如何创建 KeyValueStore：

```
aws cloudfront create-key-value-store \
  --name "revoked-certificates" \
  --comment "Store for revoked certificate serial numbers"
```

## 导入已吊销证书的序列号
<a name="import-revoked-serials"></a>

创建 KeyValueStore 之后，您需要导入已吊销证书的序列号：

### 准备吊销数据
<a name="prepare-revocation-data"></a>

创建包含已吊销证书序列号的 JSON 文件：

```
{
  "data": [
    {
      "key": "ABC123DEF456",
      "value": ""
    },
    {
      "key": "789XYZ012GHI",
      "value": ""
    }
  ]
}
```

### 从 S3 导入
<a name="import-from-s3"></a>

1. 将 JSON 文件上传到 S3 存储桶

1. 将该文件导入 KeyValueStore：

   ```
   aws cloudfront create-key-value-store \
     --name "revoked-certificates" \
     --import-source '{
       "SourceType": "S3",
       "SourceARN": "arn:aws:s3:::amzn-s3-demo-bucket1/revoked-serials.json"
     }'
   ```

## 创建用于吊销检查的连接函数
<a name="create-revocation-connection-function"></a>

创建连接函数，来根据 KeyValueStore 中的数据核对证书序列号：

### 连接函数代码示例
<a name="revocation-function-example"></a>

以下示例演示连接函数如何执行证书吊销检查：

```
import cf from 'cloudfront';

async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();
    
    // Get client certificate serial number
    const clientSerialNumber = connection.clientCertificate.certificates.leaf.serialNumber;
    
    // Check if the serial number exists in the KeyValueStore
    const isRevoked = await kvsHandle.exists(clientSerialNumber.replaceAll(':', ''));
    
    if (isRevoked) {
        console.log(`Certificate ${clientSerialNumber} is revoked. Denying connection.`);
        connection.logCustomData(`REVOKED:${clientSerialNumber}`);
        connection.deny();
    } else {
        console.log(`Certificate ${clientSerialNumber} is valid. Allowing connection.`);
        connection.allow();
    }
    
}
```

### 创建连接函数（AWS CLI）
<a name="create-revocation-function-cli"></a>

以下示例演示如何创建连接函数与 KeyValueStore 关联：

```
aws cloudfront create-connection-function \
  --name "revocation-checker" \
  --connection-function-config '{
      "Comment": "Certificate revocation checking function",
      "Runtime": "cloudfront-js-2.0",
      "KeyValueStoreAssociations": {
          "Quantity": 1,
          "Items": [
              {
                  "KeyValueStoreARN": "arn:aws:cloudfront::123456789012:key-value-store/revoked-certificates"
              }
          ]
      }
  }' \
  --connection-function-code fileb://revocation-checker.js
```

## 将函数与分配关联
<a name="associate-revocation-function"></a>

创建并发布连接函数后，将其与已启用 mTLS 的 CloudFront 分配相关联，如[关联 CloudFront 连接函数](connection-functions.md)部分中所述。