

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

# 進階撤銷案例
<a name="advanced-revocation-scenarios"></a>

如需更複雜的憑證撤銷要求，請考慮下列其他組態：

**Topics**
+ [將憑證撤銷清單 (CRL) 轉換為 KeyValueStore 格式](#convert-crl-kvs-format)
+ [處理多個憑證授權機構](#handle-multiple-cas)
+ [將自訂資料新增至連線日誌](#add-custom-data-logs)
+ [管理 CRL 更新](#manage-crl-updates)
+ [規劃 KeyValueStore 容量](#plan-kvs-capacity)

## 將憑證撤銷清單 (CRL) 轉換為 KeyValueStore 格式
<a name="convert-crl-kvs-format"></a>

如果您有憑證撤銷清單 (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 所述。

## 處理多個憑證授權機構
<a name="handle-multiple-cas"></a>

當您的 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 中的項目總數。

## 將自訂資料新增至連線日誌
<a name="add-custom-data-logs"></a>

連線函數可以使用 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 更新
<a name="manage-crl-updates"></a>

憑證授權機構可以發出兩種類型的 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 容量
<a name="plan-kvs-capacity"></a>

KeyValueStore 的大小限制為 5 MB，並支援最多 1，000 萬個鍵值對。根據您的金鑰格式和資料大小來規劃撤銷清單容量：
+ **僅限序號**：簡單撤銷檢查的高效儲存
+ **發行者識別符 \+ 序號**：多 CA 環境的較長金鑰

對於大型撤銷清單，請考慮實作分層方法，在其中針對不同的憑證類別或期間維護個別的 KeyValueStores。