高级吊销场景 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

高级吊销场景

对于更复杂的证书吊销要求,请考虑以下其他配置:

将证书吊销列表(CRL)转换为 KeyValueStore 格式

如果您拥有证书吊销列表(CRL)文件,则可以使用 OpenSSL 和 jq 将其转换为 KeyValueStore JSON 格式:

将 CRL 转换为 KeyValueStore 格式

从 CRL 文件中提取序列号:

openssl crl -text -noout -in rfc5280_CRL.crl | \ awk '/Serial Number:/ {print $3}' | \ cut -d'=' -f2 | \ sed 's/../&:/g;s/:$//' >> serialnumbers.txt

将序列号转换为 KeyValueStore JSON 格式:

jq -R -s 'split("\n") | map(select(length > 0)) | {data: map({"key": ., "value": ""})}' \ serialnumbers.txt >> serialnumbers_kvs.json

将格式化的文件上传到 S3,然后按照第 1 步的说明创建 KeyValueStore。

处理多个证书颁发机构

当您的 TrustStore 包含多个证书颁发机构(CA)时,请在您的 KeyValueStore 键中包含颁发者信息,以避免来自不同 CA 的序列号相同的证书之间发生冲突。

对于多 CA 场景,请使用颁发者的 SHA1 哈希和序列号的组合作为键:

import cf from 'cloudfront'; async function connectionHandler(connection) { const kvsHandle = cf.kvs(); const clientCert = connection.clientCertInfo; // Create composite key with issuer hash and serial number const issuer = clientCert.issuer.replace(/[^a-zA-Z0-9]/g, '').substring(0, 20); const serialno = clientCert.serialNumber; const compositeKey = `${issuer}_${serialno}`; const cert_revoked = await kvsHandle.exists(compositeKey); if (cert_revoked) { console.log(`Blocking revoked cert: ${serialno} from issuer: ${issuer}`); connection.deny(); } else { connection.allow(); } }
注意

使用颁发者标识符 + 序列号可创建较长的键,这可能会减少可存储在 KeyValueStore 中的条目总数。

将自定义数据添加到连接日志

连接函数可以使用 logCustomData 方法将自定义数据添加到 CloudFront 连接日志。这使您能够在日志中包含吊销检查结果、证书信息或其他相关数据。

async function connectionHandler(connection) { const kvsHandle = cf.kvs(); const clientSerialNumber = connection.clientCertInfo.serialNumber; const serialNumberExistsInKvs = await kvsHandle.exists(clientSerialNumber); if (serialNumberExistsInKvs) { // Log revocation details to connection logs connection.logCustomData(`REVOKED:${clientSerialNumber}:DENIED`); console.log("Connection denied - certificate revoked"); return connection.deny(); } // Log successful validation connection.logCustomData(`VALID:${clientSerialNumber}:ALLOWED`); console.log("Connection allowed"); return connection.allow(); }

自定义数据的限制为 800 字节的有效 UTF-8 文本。如果超过此限制,CloudFront 会将数据截断至最近的有效 UTF-8 边界。

注意

仅在为分配启用连接日志时,自定义数据日志记录才起作用。如果未配置连接日志,则 logCustomData 方法将不执行任何操作。

管理 CRL 更新

证书颁发机构可颁发两种类型的 CRL:

  • 完整 CRL:包含所有已吊销证书的完整列表

  • Delta CRL:仅列出自上次完整 CRL 以来吊销的证书

对于完整 CRL 更新,使用更新后的数据创建一个新的 KeyValueStore,然后将连接函数关联重定向至此新的 KeyValueStore。这种方法比计算差异并执行增量更新更加简单。

对于 delta CRL 更新,使用 update-keys 命令将新的已吊销证书添加到现有 KeyValueStore:

aws cloudfront update-key-value-store \ --name "revoked-serials-kvs" \ --if-match "current-etag" \ --put file://delta-revoked-serials.json

规划 KeyValueStore 容量

KeyValueStore 的大小限制为 5 MB,并且最多支持 1000 万个键值对。根据您的键格式和数据大小规划吊销列表容量:

  • 仅序列号:高效存储,用于进行简单吊销检查

  • 颁发者标识符 + 序列号:用于多 CA 环境的较长键

对于大型吊销列表,可以考虑实施分层方法,为不同的证书类别或时段维护单独的 KeyValueStore。