

# 高度な失効シナリオ
<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
```

ステップ 1 の説明に従って、フォーマットされたファイルを S3 にアップロードし、KeyValueStore を作成します。

## 複数の認証局を処理する
<a name="handle-multiple-cas"></a>

TrustStore に複数の認証局 (CA) が含まれている場合は、同じシリアル番号を持つ異なる CA からの証明書間の競合を避けるために、KeyValueStore キーに発行者情報を含めます。

マルチ 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();
}
```

カスタムデータは、有効な UTF-8 テキスト 800 バイトに制限されています。この制限を超えると、CloudFront はデータを最も近い有効な UTF-8 境界に切り捨てます。

**注記**  
カスタムデータログ記録は、ディストリビューションで接続ログが有効になっている場合にのみ機能します。接続ログが設定されていない場合、logCustomData メソッドは no-op です。

## CRL の更新を管理する
<a name="manage-crl-updates"></a>

認証局は 2 種類の CRL を発行できます。
+ **完全な CRL**: 失効したすべての証明書の完全なリストを含みます
+ **デルタ CRL**: 前回の完全な CRL 以降に失効した証明書のみを一覧表示します

完全な CRL を更新するには、更新されたデータを使用して新しい KeyValueStore を作成し、Connection Function の関連付けを新しい 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 を維持する階層型アプローチの実装を検討してください。