高度な失効シナリオ
より複雑な証明書失効の要件については、次の追加の設定を検討してください。
トピック
証明書失効リスト (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
ステップ 1 の説明に従って、フォーマットされたファイルを S3 にアップロードし、KeyValueStore を作成します。
複数の認証局を処理する
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 に保存できるエントリの合計数が少なくなる可能性があります。
接続ログにカスタムデータを追加する
接続関数は、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 の更新を管理する
認証局は 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 容量を計画する
KeyValueStore の合計サイズ制限は 5 MB で、最大 1,000 万個のキーと値のペアをサポートします。キー形式とデータサイズに基づいて、失効リストの容量を計画します。
-
シリアル番号のみ: シンプルな失効チェックのための効率的なストレージ
-
発行者識別子とシリアル番号: マルチ CA 環境のための長いキー
大規模な失効リストの場合は、異なる証明書カテゴリまたは期間に対して別々の KeyValueStores を維持する階層型アプローチの実装を検討してください。