使用 CloudFront 连接函数和 KVS 实施吊销 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 CloudFront 连接函数和 KVS 实施吊销

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

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

证书吊销如何与连接函数结合使用

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

证书吊销流程如下所述:

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

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

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

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

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

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

针对已吊销的证书设置 KeyValueStore

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

创建 KeyValueStore(控制台)

  1. 登录 Amazon Web Services 管理控制台,并通过以下网址打开 CloudFront 控制台:https://console.amazonaws.cn/cloudfront/v4/home

  2. 在导航窗格中,选择键值存储

  3. 选择创建键值存储

  4. 输入键值存储的名称(例如,revoked-certificates)。

  5. (可选)添加描述。

  6. 选择创建键值存储

创建 KeyValueStore(Amazon CLI)

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

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

导入已吊销证书的序列号

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

准备吊销数据

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

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

从 S3 导入

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

  2. 将该文件导入 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" }'

创建用于吊销检查的连接函数

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

连接函数代码示例

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

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(); } }

创建连接函数(Amazon CLI)

以下示例演示如何创建连接函数与 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

将函数与分配关联

创建并发布连接函数后,将其与已启用 mTLS 的 CloudFront 分配相关联,如关联 CloudFront 连接函数部分中所述。