本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
進階撤銷案例
如需更複雜的憑證撤銷要求,請考慮下列其他組態:
將憑證撤銷清單 (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,並建立 KeyValueStore,如步驟 1 所述。
處理多個憑證授權機構
當您的 TrustStore 包含多個憑證授權機構 CAs) 時,請在 KeyValueStore 金鑰中包含發行者資訊,以避免不同 CAs的憑證之間發生可能具有相同序號的衝突。
對於多 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 更新
憑證授權機構可以發出兩種類型的 CRLs:
-
完整 CRLs:包含所有已撤銷憑證的完整清單
-
Delta CRLs:僅列出自上次完整 CRL 以來撤銷的憑證
如需完整的 CRL 更新,請使用更新的資料建立新的 KeyValueStore,並將連線函數關聯重新導向至新的 KeyValueStore。這種方法比計算差異和執行增量更新更簡單。
對於差異 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,並支援最多 1,000 萬個鍵值對。根據您的金鑰格式和資料大小來規劃撤銷清單容量:
-
僅限序號:簡單撤銷檢查的高效儲存
-
發行者識別符 + 序號:多 CA 環境的較長金鑰
對於大型撤銷清單,請考慮實作分層方法,在其中針對不同的憑證類別或期間維護個別的 KeyValueStores。