CloudFront 接続Connection Function と KVS を使用した取り消し
CloudFront Connection Functions と KeyValueStore を組み合わせて、相互 TLS 認証に証明書失効チェックを実装できます。このアプローチは、CloudFront の組み込み証明書検証を補完するスケーラブルでリアルタイムの証明書失効メカニズムを提供します。
Connection Functions は、CloudFront エッジロケーションでの TLS 接続の確立中に実行される JavaScript 関数で、mTLS 認証用のカスタム証明書検証ロジックを実装できます。Connection Functions の詳細については、「CloudFront Connection Function を関連付ける」を参照してください。
Connection Functions での証明書失効の仕組み
CloudFront の標準証明書検証は、証明書チェーン、署名、有効期限を検証しますが、組み込みの証明書失効チェックは含みません。Connection Functions を使用すると、TLS ハンドシェイク中にカスタム失効チェックを実装できます。
証明書の失効プロセスは次のように機能します。
-
失効した証明書のシリアル番号を CloudFront KeyValueStore に保存します。
-
クライアントが証明書を提示すると、Connection Function が呼び出されます。
-
関数は、証明書のシリアル番号と KeyValueStore を照合します。
-
シリアル番号がストアで見つかった場合、証明書は失効しています。
-
関数は、失効した証明書の接続を拒否します。
このアプローチは、CloudFront のグローバルエッジネットワーク全体でほぼリアルタイムの失効チェックを提供します。
失効した証明書の KeyValueStore を設定する
まず、失効した証明書のシリアル番号を保存する KeyValueStore を作成します。
KeyValueStore を作成するには (コンソール)
AWS マネジメントコンソールにサインインし、https://console.aws.amazon.com/cloudfront/v4/home
で CloudFront コンソールを開きます。 -
ナビゲーションペインで、[キーバリューストア] を選択します。
-
[キーバリューストアを作成] を選択します。
-
キーバリューストアを作成の名前を入力します (revoked-certificates など)。
-
(オプション) 説明を入力します。
-
[キーバリューストアを作成] を選択します。
KeyValueStore を作成するには (AWS CLI)
次の例は、KeyValueStore を作成する方法を示します。
aws cloudfront create-key-value-store \ --name "revoked-certificates" \ --comment "Store for revoked certificate serial numbers"
失効した証明書のシリアル番号をインポートする
KeyValueStore を作成した後、失効した証明書のシリアル番号をインポートする必要があります。
失効データを準備する
失効した証明書のシリアル番号を使用して JSON ファイルを作成します。
{ "data": [ { "key": "ABC123DEF456", "value": "" }, { "key": "789XYZ012GHI", "value": "" } ] }
S3 からのインポート
-
S3 バケットに JSON ファイルをアップロードする
-
ファイルを KeyValueStore にインポートします。
aws cloudfront create-key-value-store \ --name "revoked-certificates" \ --import-source '{ "SourceType": "S3", "SourceARN": "arn:aws:s3:::amzn-s3-demo-bucket1/revoked-serials.json" }'
失効チェックの Connection Function を作成する
証明書のシリアル番号と KeyValueStore を照合する Connection Function を作成します。
Connection Function のコード例
次の例は、証明書失効チェックを実行する Connection Function を示します。
import cf from 'cloudfront'; async function connectionHandler(connection) { const kvsHandle = cf.kvs(); // Get client certificate serial number const clientSerialNumber = connection.clientCertificate.certificates.leaf.serialNumber; // Check if the serial number exists in the KeyValueStore const isRevoked = await kvsHandle.exists(clientSerialNumber.replaceAll(':', '')); if (isRevoked) { console.log(`Certificate ${clientSerialNumber} is revoked. Denying connection.`); connection.logCustomData(`REVOKED:${clientSerialNumber}`); connection.deny(); } else { console.log(`Certificate ${clientSerialNumber} is valid. Allowing connection.`); connection.allow(); } }
Connection Function を作成するには (AWS CLI)
次の例は、Connection Function と KeyValueStore の関連付けを作成方法を示します。
aws cloudfront create-connection-function \ --name "revocation-checker" \ --connection-function-config '{ "Comment": "Certificate revocation checking function", "Runtime": "cloudfront-js-2.0", "KeyValueStoreAssociations": { "Quantity": 1, "Items": [ { "KeyValueStoreARN": "arn:aws:cloudfront::123456789012:key-value-store/revoked-certificates" } ] } }' \ --connection-function-code fileb://revocation-checker.js
関数をディストリビューションに関連付ける
Connection Function を作成して公開した後、「CloudFront Connection Function を関連付ける」セクションの説明に従って、mTLS 対応の CloudFront ディストリビューションに関連付けます。