

# CloudFront による相互 TLS 認証 (Viewer mTLS)
<a name="mtls-authentication"></a>

相互 TLS 認証 (相互 Transport Layer Security 認証 - mTLS) は、双方向証明書ベースの認証を要求することで標準 TLS 認証を拡張するセキュリティプロトコルです。クライアントとサーバーの両方が、安全な接続を確立する前に ID を証明する必要があります。相互 TLS を使用すると、信頼される TLS 証明書を提示するクライアントのみが CloudFront ディストリビューションにアクセスできるようになります。

## 仕組み
<a name="how-mtls-works"></a>

標準の TLS ハンドシェイクでは、サーバーのみがクライアントに ID を証明する証明書を提示します。相互 TLS では、認証プロセスは双方向になります。クライアントが CloudFront ディストリビューションに接続しようとすると、CloudFront は TLS ハンドシェイク中にクライアント証明書をリクエストします。クライアントは、安全な接続を確立する前に、CloudFront が設定されたトラストストアに対して検証する有効な X.509 証明書を提示する必要があります。

CloudFront は、AWS エッジロケーションでこの証明書の検証を実行し、CloudFront のグローバルパフォーマンスの利点を維持しながら、オリジンサーバーから認証の複雑さをオフロードします。mTLS は、検証モード (すべてのクライアントが有効な証明書を提示する必要がある) またはオプションモード (提示されたときに証明書を検証するが、証明書のない接続も許可する) の 2 つのモードで設定できます。

## ユースケース
<a name="mtls-use-cases"></a>

CloudFront による相互 TLS 認証は、従来の認証方法では不足していたいくつかの重要なセキュリティシナリオに対処します。
+ **コンテンツキャッシュによるデバイス認証** - ファームウェアの更新、ゲームのダウンロード、または内部リソースへのアクセスを許可する前に、ゲームコンソール、IoT デバイス、または企業ハードウェアを認証することができます。各デバイスには、CloudFront のキャッシュ機能のメリットを享受しながら、その信頼性を証明する一意の証明書が含まれています。
+ **API-to-API 認証** - 信頼されるビジネスパートナー、支払いシステム、マイクロサービス間のマシン間通信を保護できます。証明書ベースの認証により、自動データ交換に強力な ID 検証を提供しながら、共有シークレットや API キーが不要になります。

**Topics**
+ [

## 仕組み
](#how-mtls-works)
+ [

## ユースケース
](#mtls-use-cases)
+ [

# トラストストアと証明書の管理
](trust-stores-certificate-management.md)
+ [

# CloudFront ディストリビューションの相互 TLS を有効にする
](enable-mtls-distributions.md)
+ [

# CloudFront Connection Function を関連付ける
](connection-functions.md)
+ [

# その他の設定
](configuring-additional-settings.md)
+ [

# オリジンに転送されるキャッシュポリシーの mTLS ヘッダービューワー
](viewer-mtls-headers.md)
+ [

# CloudFront 接続Connection Function と KVS を使用した取り消し
](revocation-connection-function-kvs.md)
+ [

# 接続ログを使用したオブザーバビリティ
](connection-logs.md)

# トラストストアと証明書の管理
<a name="trust-stores-certificate-management"></a>

トラストストアの作成と設定は、CloudFront との相互 TLS 認証を実装するための必須要件です。トラストストアには、認証プロセス中に CloudFront がクライアント証明書を検証するために使用する認証局 (CA) の証明書が含まれています。

## トラストストアとは
<a name="what-is-trust-store"></a>

トラストストアは、相互 TLS 認証中に CloudFront がクライアント証明書を検証するために使用する CA 証明書のリポジトリです。トラストストアには、クライアント証明書を認証するための信頼チェーンを形成するルート CA 証明書と中間 CA 証明書が含まれています。

CloudFront で相互 TLS を実装する場合、トラストストアは、有効なクライアント証明書を発行するために信頼する認証局を定義します。CloudFront は、TLS ハンドシェイク中に各クライアント証明書と信頼ストアを照合します。トラストストアのいずれかの CA にチェーンされる証明書を提示するクライアントのみが、正常に認証されます。

CloudFront のトラストストアは、複数のディストリビューションに関連付けることができるアカウントレベルのリソースです。これにより、CA 証明書の管理を簡素化しながら、CloudFront のデプロイ全体で整合性のある証明書検証ポリシーを維持できます。

## 認証局のサポート
<a name="ca-support"></a>

CloudFront は、AWS プライベート認証局とサードパーティーのプライベート認証局の両方によって発行された証明書をサポートします。この柔軟性により、組織の要件に基づいて、既存の証明書インフラストラクチャを使用したり、AWS マネージド証明書サービスを活用したりできます。
+ **AWS プライベート認証局:** マネージドプライベート認証局サービスを提供する AWS プライベート CA によって発行された証明書を使用できます。この統合により、証明書のライフサイクル管理が簡素化され、他の AWS サービスとシームレスに統合できます。
+ **サードパーティーのプライベート認証局:** エンタープライズ CA や他のサードパーティーの証明書プロバイダーを含め、既存のプライベート認証局インフラストラクチャからの証明書を使用することもできます。これにより、CloudFront の mTLS 機能を追加しながら、現在の証明書管理プロセスを維持できます。

## 証明書の要件と仕様
<a name="certificate-requirements"></a>

トラストストアには、含められる CA 証明書に特定の要件があります。

### CA 証明書形式の要件
<a name="ca-cert-format-requirements"></a>
+ **形式:** PEM (Privacy Enhanced Mail) 形式
+ **コンテンツの境界:** 証明書は -----BEGIN CERTIFICATE----- と -----END CERTIFICATE----- の境界で囲まれている必要があります
+ **コメント:** 先頭に \$1 を付け、- 文字を含めることはできません
+ **改行:** 証明書間に空白行は許可されていません

### サポートされている証明書の仕様
<a name="supported-cert-specs"></a>
+ **証明書タイプ:** X.509v3
+ **パブリックキーのタイプ:**
  + RSA 2048、RSA 3072、RSA 4096
  + ECDSA: secp256r1、secp384r1
+ **署名アルゴリズム:**
  + SHA256, SHA384, SHA512 with RSA
  + SHA256, SHA384, SHA512 with EC
  + SHA256, SHA384, SHA512 with RSASSA-PSS with MGF1

### 証明書バンドル形式の例
<a name="example-cert-bundle"></a>

複数の証明書 (PEM エンコード):

```
# Root CA Certificate
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKoK/OvD/XqiMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTcwNzEyMTU0NzQ4WhcNMjcwNzEwMTU0NzQ4WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuuExKvY1xzHFylsHiuowqpmzs7rEcuuylOuEszpFp+BtXh0ZuEtts9LP
-----END CERTIFICATE-----
# Intermediate CA Certificate
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKoK/OvD/XqjMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTcwNzEyMTU0NzQ4WhcNMjcwNzEwMTU0NzQ4WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuuExKvY1xzHFylsHiuowqpmzs7rEcuuylOuEszpFp+BtXh0ZuEtts9LP
-----END CERTIFICATE-----
```

## トラストストアを作成する
<a name="create-trust-store"></a>

トラストストアを作成する前に、CA 証明書バンドルを PEM 形式で Amazon S3 バケットにアップロードする必要があります。証明書バンドルには、クライアント証明書の検証に必要な信頼されるルート CA 証明書と中間 CA 証明書がすべて含まれている必要があります。

CA 証明書バンドルは、トラストストアを作成するときに S3 から 1 回だけ読み取られます。今後、CA 証明書バンドルが変更される場合は、トラストストアを手動で更新する必要があります。トラストストアと S3 CA 証明書バンドル間の同期は維持されません。

### 前提条件
<a name="trust-store-prerequisites"></a>
+ Amazon S3 バケットにアップロードされた認証局 (CA) からの証明書バンドル
+ CloudFront リソースを作成するために必要なアクセス許可

### トラストストアを作成するには (コンソール)
<a name="create-trust-store-console"></a>

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで **[トラストストア]** を選択します。

1. **[トラストストアを作成]** を選択します。

1. **[トラストストアの名前]** に、トラストストアの名前を入力します。

1. **[認証局 (CA) バンドル]** に、PEM 形式の CA 証明書バンドルへの Amazon S3 パスを入力します。

1. **[トラストストアを作成]** を選択します。

### トラストストアを作成するには (AWS CLI)
<a name="create-trust-store-cli"></a>

```
aws cloudfront create-trust-store \
  --name MyTrustStore \
  --certificate-authority-bundle-s3-location Bucket=my-bucket,Key=ca-bundle.pem \
  --tags Items=[{Key=Environment,Value=Production}]
```

## トラストストアをディストリビューションに関連付ける
<a name="associate-trust-store"></a>

トラストストアを作成した後、相互 TLS 認証を有効にするために CloudFront ディストリビューションに関連付ける必要があります。

### 前提条件
<a name="associate-prerequisites"></a>
+ HTTPS のみのビューワープロトコルポリシーが有効で、HTTP3 サポートが無効になっている既存の CloudFront ディストリビューション。

### トラストストアを関連付けるには (コンソール)
<a name="associate-trust-store-console"></a>

CloudFront コンソール内でトラストストアを関連付けるには、トラストストアの詳細ページから、またはディストリビューション設定ページからの 2 つの方法があります。

**トラストストアの詳細ページを介したトラストストアの関連付け:**

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで **[トラストストア]** を選択します。

1. 関連付けるトラストストアの名前を選択します。

1. **[ディストリビューションに関連付ける]** を選択します。

1. 使用可能なビューワーの mTLS オプションを設定します。
   + **クライアント証明書の検証モード:** 必須モードとオプションモードから選択します。必須モードでは、すべてのクライアントが証明書を提示する必要があります。オプションモードでは、証明書を提示するクライアントは検証され、証明書を提示しないクライアントにはアクセスが許可されます。
   + **トラストストア CA 名をアドバタイズする:** TLS ハンドシェイク中にトラストストアの CA 名をクライアントにアドバタイズするかどうかを選択します。
   + **証明書の有効期限を無視する:** 有効期限が切れた証明書を使用した接続を許可するかどうかを選択します (他の検証基準も適用されます)。
   + **Connection Function:** オプションの Connection Function を関連付けて、他のカスタム条件に基づいて接続を許可/拒否できます。

1. トラストストアに関連付ける 1 つ以上のディストリビューションを選択します。ビューワー mTLS をサポートできるのは、HTTP3 が無効になっているディストリビューションと HTTPS のみのキャッシュ動作を持つディストリビューションのみです。

1. **関連付ける** を選択してください。

**ディストリビューション設定のページからのトラストストアの関連付け:**

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. 関連付けるディストリビューションを選択します。

1. **[全般]** タブの **[設定]** コンテナで、右上の **[編集]** を選択します。

1. ページを最下部までスクロールし、**[接続]** コンテナ内で **[ビューワーの mTLS]** スイッチをオンに切り替えます。

1. 使用可能なビューワーの mTLS オプションを設定します。
   + **クライアント証明書の検証モード:** 必須モードとオプションモードから選択します。必須モードでは、すべてのクライアントが証明書を提示する必要があります。オプションモードでは、証明書を提示するクライアントは検証され、証明書を提示しないクライアントにはアクセスが許可されます。
   + **トラストストア CA 名をアドバタイズする:** TLS ハンドシェイク中にトラストストアの CA 名をクライアントにアドバタイズするかどうかを選択します。
   + **証明書の有効期限を無視する:** 有効期限が切れた証明書を使用した接続を許可するかどうかを選択します (他の検証基準も適用されます)。
   + **Connection Function:** オプションの Connection Function を関連付けて、他のカスタム条件に基づいて接続を許可/拒否できます。

1. 右下の **[変更の保存]** を選択します。

### トラストストアを関連付けるには (AWS CLI)
<a name="associate-trust-store-cli"></a>

トラストストアは、DistributionConfig.ViewerMtlsConfig プロパティを介してディストリビューションに関連付けることができます。つまり、まずディストリビューション設定を取得し、後続の UpdateDistribution リクエストで ViewerMtlsConfig を指定する必要があります。

```
// First fetch the distribution
aws cloudfront get-distribution {DISTRIBUTION_ID}

// Update the distribution config, for example:
Distribution config, file://distConf.json: 
{
  ...other fields,
  ViewerMtlsConfig: {
    Mode: 'required',
    TrustStoreConfig: {
        AdvertiseTrustStoreCaNames: false,
        IgnoreCertificateExpiry: true,
        TrustStoreId: {TRUST_STORE_ID}
    }
  }
}

aws cloudfront update-distribution \
   --id {DISTRIBUTION_ID} \
   --if-match {ETAG} \
   --distribution-config file://distConf.json
```

## トラストストアを管理する
<a name="manage-trust-stores"></a>

### トラストストアの詳細を表示する
<a name="view-trust-store-details"></a>

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで **[トラストストア]** を選択します。

1. トラストストアの名前を選択して、詳細ページを表示します。

詳細ページには以下が表示されます。
+ トラストストアの名前と ID
+ CA 証明書の数
+ 作成日と最後に変更された日付
+ 関連付けられたディストリビューション
+ タグ

### トラストストアを変更する
<a name="modify-trust-store"></a>

CA 証明書バンドルを置き換えるには

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで **[トラストストア]** を選択します。

1. トラストストアの名前を選択します。

1. **[アクション]**、**[編集]** の順に選択します。

1. **認証局 (CA) バンドル**の場合、更新された CA バンドル PEM ファイルの Amazon S3 の場所を入力します。

1. **[トラストストアを更新]** を選択します。

### トラストストアを削除する
<a name="delete-trust-store"></a>

**前提条件:** まず、すべての CloudFront ディストリビューションからトラストストアの関連付けを解除する必要があります。

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで **[トラストストア]** を選択します。

1. トラストストアの名前を選択します。

1. **[トラストストアを削除]** を選択します。

1. [**Delete**] を選択して確定します。

### 次のステップ
<a name="trust-store-next-steps"></a>

トラストストアを作成して CloudFront ディストリビューションに関連付けると、ディストリビューションで相互 TLS 認証を有効にし、証明書ヘッダーをオリジンに転送するなどの追加設定を行うことができます。ディストリビューションで mTLS を有効にする詳細な手順については、「[CloudFront ディストリビューションの相互 TLS を有効にする](enable-mtls-distributions.md)」を参照してください。

# CloudFront ディストリビューションの相互 TLS を有効にする
<a name="enable-mtls-distributions"></a>

## 前提条件と要件
<a name="mtls-prerequisites-requirements"></a>

CloudFront の相互 TLS 検証モードでは、すべてのクライアントが TLS ハンドシェイク中に有効な証明書を提示する必要があり、有効な証明書がない接続を拒否します。CloudFront ディストリビューションで相互 TLS を有効にする前に、以下を確認してください。
+ 認証局証明書を含むトラストストアを作成した
+ トラストストアを CloudFront ディストリビューションに関連付けた
+ すべての分散キャッシュ動作が HTTPS のみのビューワープロトコルポリシーを使用していることを確認した
+ ディストリビューションが HTTP/2 を使用していることを確認した (デフォルト設定、ビューワー mTLS は HTTP/3 ではサポートされていません)

**注記**  
相互 TLS 認証には、ビューワーと CloudFront 間で HTTPS 接続が必要です。HTTP 接続をサポートするキャッシュ動作を持つディストリビューションで mTLS を有効にすることはできません。

## 相互 TLS を有効にする (コンソール)
<a name="enable-mtls-console"></a>

### 新しいディストリビューションの場合
<a name="enable-mtls-new-distributions"></a>

CloudFront コンソールで新しいディストリビューションを作成するプロセスでビューワー mTLS を設定することはできません。まず、任意の方法 (コンソール、CLI、API) でディストリビューションを作成し、ディストリビューション設定を編集して、以下の既存のディストリビューションの手順に従ってビューワー mTLS を有効にします。

### 既存のディストリビューションの場合
<a name="enable-mtls-existing-distributions"></a>

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ディストリビューションリストから、変更するディストリビューションを選択します。

1. すべてのキャッシュ動作についてビューワープロトコルポリシーが **[HTTP を HTTPS にリダイレクト]** または **[HTTPS のみ]** に設定されている必要があります。(**[キャッシュ動作]** タブを選択すると、HTTP プロトコルポリシーでキャッシュ動作を表示および更新できます。)

1. **[General]** (全般) タブを選択します。

1. **設定** セクションで、**編集** を選択します。

1. **[接続]** セクションで、**ビューワー相互認証 (mTLS)** を検索します。

1. **[相互認証を有効にする]** をオンに切り替えます。

1. **[クライアント証明書の検証モード]** で、**[必須]** (すべてのクライアントが証明書を提示する必要がある) または **[オプション]** (クライアントはオプションで証明書を提示できる) を選択します。

1. **[トラストストア]** で、以前に作成したトラストストアを選択します。

1. (オプション) CloudFront が TLS ハンドシェイク中に CA 名をクライアントに送信する場合は、**[トラストストア CA 名をアドバタイズ]** を切り替えます。

1. (オプション) 有効期限が切れた証明書を使用した接続を許可する場合は、**証明書の有効期限を無視**します。

1. **[Save changes]** (変更の保存) をクリックします。

## 相互 TLS を有効にする (AWS CLI)
<a name="enable-mtls-cli"></a>

### 新しいディストリビューションの場合
<a name="enable-mtls-cli-new"></a>

次の例は、mTLS 設定を含むディストリビューション設定ファイル (distribution-config.json) を作成する方法を示します。

```
{
  "CallerReference": "cli-example-1",
  "Origins": {
    "Quantity": 1,
    "Items": [
      {
        "Id": "my-origin",
        "DomainName": "example.com",
        "CustomOriginConfig": {
          "HTTPPort": 80,
          "HTTPSPort": 443,
          "OriginProtocolPolicy": "https-only"
        }
      }
    ]
  },
  "DefaultCacheBehavior": {
    "TargetOriginId": "my-origin",
    "ViewerProtocolPolicy": "https-only",
    "MinTTL": 0,
    "ForwardedValues": {
      "QueryString": false,
      "Cookies": {
        "Forward": "none"
      }
    }
  },
  "ViewerCertificate": {
    "CloudFrontDefaultCertificate": true
  },
  "ViewerMtlsConfig": {
    "Mode": "required", 
    "TrustStoreConfig": {
        "TrustStoreId": {TRUST_STORE_ID},
        "AdvertiseTrustStoreCaNames": true,
        "IgnoreCertificateExpiry": true
    }
  },
  "Enabled": true
}
```

次のコマンド例を使用し、mTLS を有効にしてディストリビューションを作成します。

```
aws cloudfront create-distribution --distribution-config file://distribution-config.json
```

### 既存のディストリビューションの場合
<a name="enable-mtls-cli-existing"></a>

次のコマンド例を使用し、現在のディストリビューション設定を取得します。

```
aws cloudfront get-distribution-config --id E1A2B3C4D5E6F7 --output json > dist-config.json
```

ファイルを編集して mTLS 設定を追加します。次の例のセクションをディストリビューション設定に追加します。

```
"ViewerMtlsConfig": {
    "Mode": "required", 
    "TrustStoreConfig": {
        "TrustStoreId": {TRUST_STORE_ID},
        "AdvertiseTrustStoreCaNames": true,
        "IgnoreCertificateExpiry": true
    }
}
```

ファイルから ETag フィールドを削除しますが、その値は個別に保存します。

次のコマンド例を使用し、新しい設定でディストリビューションを更新します。

```
aws cloudfront update-distribution \
    --id E1A2B3C4D5E6F7 \
    --if-match YOUR-ETAG-VALUE \
    --distribution-config file://dist-config.json
```

## ビューワープロトコルポリシー
<a name="viewer-protocol-policies"></a>

相互 TLS を使用する場合、すべてのディストリビューションキャッシュ動作を HTTPS のみのビューワープロトコルポリシーで設定する必要があります。
+ **HTTP を HTTPS にリダイレクト** - 証明書の検証を実行する前に HTTP リクエストを HTTPS にリダイレクトします。
+ **HTTPS のみ** - HTTPS リクエストのみを受け入れて証明書の検証を実行します。

**注記**  
HTTP 接続では証明書の検証を実行できないため、HTTP および HTTPS ビューワープロトコルポリシーは相互 TLS ではサポートされません。

## 次のステップ
<a name="enable-mtls-next-steps"></a>

CloudFront ディストリビューションでビューワー TLS を有効にしたら、Connection Functions を関連付けてカスタム証明書検証ロジックを実装できます。Connection Functions により、カスタム検証ルール、証明書失効チェック、ログ記録を使用して、組み込み mTLS 認証機能を拡張できます。Connection Functions の作成と関連付けの詳細については、「[CloudFront Connection Function を関連付ける](connection-functions.md)」を参照してください。

# CloudFront Connection Function を関連付ける
<a name="connection-functions"></a>

CloudFront Connection Functions により、TLS ハンドシェイク中にカスタム証明書検証ロジックを実装し、組み込みの mTLS 認証機能を拡張できます。

## Connection Functions とは
<a name="what-are-connection-functions"></a>

Connection Functions は、クライアント証明書の検証後、TLS ハンドシェイク中に実行される JavaScript 関数です。検証されたクライアント証明書は Connection Function に渡され、その時点で Connection Function はアクセスを許可するかどうかをさらに判断します。Connection Functions の詳細については、「[CloudFront Functions を使用してエッジでカスタマイズする](cloudfront-functions.md)」を参照してください。

## Connection Functions と mTLS の連携方法
<a name="how-connection-functions-work"></a>

クライアントが CloudFront ディストリビューションへの mTLS 接続を確立しようとすると、次のシーケンスが発生します。

1. クライアントが CloudFront エッジロケーションで TLS ハンドシェイクを開始します。

1. CloudFront はクライアント証明書をリクエストして受信します。

1. CloudFront は、トラストストアに対して標準証明書検証を実行します。

1. 証明書が標準検証に合格すると、CloudFront は Connection Function を呼び出します。**ViewerMtlsConfig** 内で **IgnoreCertificateExpiry** が有効になっている場合、期限切れ (ただし、他は有効) の証明書も Connection Function に渡されます。クライアント証明書が無効の場合、Connection Functions は呼び出されません。

1. Connection Function は、解析された証明書情報と接続の詳細を受け取ります。

1. 関数は、カスタムロジックに基づいて許可/拒否の決定を行います。

1. CloudFront は、お客様の決定に基づいて TLS 接続を完了または終了します。

Connection Functions は、検証モードとオプションモード (クライアントが証明書を提示する場合) の両方で呼び出されます。

## Connection Function を作成する
<a name="create-connection-function"></a>

CloudFront コンソールまたは CLI AWS を使用して Connection Functions を作成できます。

### Connection Function を作成するには (コンソール)
<a name="create-connection-function-console"></a>

1. AWS マネジメントコンソール にサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで、[**Functions**] (関数) を選択します。

1. **[Connection Functions]** タブを選択し、**[Connection Functions を作成]** を選択します。

1. AWS アカウント内で一意の関数名を入力します。

1. [**続行**] をクリックしてください。

1. 関数エディタで、証明書検証用の JavaScript コードを記述します。関数ハンドラーは許可または拒否のいずれかを呼び出す必要があります。

1. オプション: KeyValue ストアを Connection Function に関連付けると、失効制御を実装できます。

1. **[Save changes]** (変更の保存) をクリックします。

### Connection Function を作成するには (AWS CLI)
<a name="create-connection-function-cli"></a>

次の例は、Connection Function の作成方法を示しています。

code.js など、関数コードを個別のファイルに記述します。

```
function connectionHandler(connection) {
  connection.allow();
}
```

```
aws cloudfront create-connection-function \
  --name "certificate-validator" \
  --connection-function-config '{
      "Comment": "Client certificate validation function",
      "Runtime": "cloudfront-js-2.0"
  }' \
  --connection-function-code fileb://code.js
```

## Connection Function コードの構造
<a name="connection-function-code-structure"></a>

Connection Functions は、証明書と接続情報を含む接続オブジェクトを受信する connectionHandler 関数を実装します。関数は、接続を決定するために `connection.allow()` または `connection.deny()` を使用する必要があります。

### 基本的な Connection Function の例
<a name="basic-connection-function-example"></a>

次の例は、クライアント証明書のサブジェクトフィールドを検証するシンプルな Connection Function を示しています。

```
function connectionHandler(connection) {
    // Only process if a certificate was presented
    if (!connection.clientCertificate) {
        console.log("No certificate presented");
        connection.deny();
    }
    
    // Check the subject field for specific organization
    const subject = connection.clientCertificate.certificates.leaf.subject;
    if (!subject.includes("O=ExampleCorp")) {
        console.log("Certificate not from authorized organization");
       connection.deny();
    } else {
        // All checks passed
        console.log("Certificate validation passed");
        connection.allow();
    }
}
```

接続オブジェクトで使用できるクライアント証明書プロパティの完全な仕様は、こちらで入手できます。

```
{
  "connectionId": "Fdb-Eb7L9gVn2cFakz7wWyBJIDAD4-oNO6g8r3vXDV132BtnIVtqDA==", // Unique identifier for this TLS connection
  "clientIp": "203.0.113.42", // IP address of the connecting client (IPv4 or IPv6)
  "clientCertificate": {
    "certificates": {
      "leaf": {
        "subject": "CN=client.example.com,O=Example Corp,C=US", // Distinguished Name (DN) of the certificate holder
        "issuer": "CN=Example Corp Intermediate CA,O=Example Corp,C=US", // Distinguished Name (DN) of the certificate authority that issued this certificate
        "serialNumber": "4a:3f:5c:92:d1:e8:7b:6c", // Unique serial number assigned by the issuing CA (hexadecimal)
        "validity": {
          "notBefore": "2024-01-15T00:00:00Z", // Certificate validity start date (ISO 8601 format)
          "notAfter": "2025-01-14T23:59:59Z"   // Certificate expiration date (ISO 8601 format)
        },
        "sha256Fingerprint": "a1b2c3d4e5f6...abc123def456", // SHA-256 hash of the certificate (64 hex characters)
      },
    },
  },
}
```

## Connection Function を関連付ける
<a name="associate-connection-function-section"></a>

Connection Function を作成したらライブステージに発行し、ディストリビューションに関連付ける必要があります。

### Connection Function を発行して関連付けるには (コンソール)
<a name="publish-associate-console"></a>

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで、**[関数]** を選択する

1. **[Connection Functions]** タブを選択し、Connection Functions を選択します。

1. **[発行]** を選択して、ライブステージに移動させます。

1. 発行セクションの下にある関連付けられたディストリビューションテーブルの **[関連付けを追加]** を選択します。

1. 関連付けるビューワー mTLS が有効になっているディストリビューションを選択します。

または、発行された Connection Functions をディストリビューションの詳細ページから関連付けることもできます。

1. すべてのディストリビューションが一覧表示されているコンソールのホームページに移動します。

1. 関連付けるディストリビューションを選択します。

1. **[General]** (全般) タブを選択します。

1. **設定** セクションで、**編集** を選択します。

1. **[接続]** セクションで、**ビューワー相互認証 (mTLS)** を検索します。

1. **[Connection Function]** で、関数を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

### Connection Function を関連付けるには (AWS CLI)
<a name="associate-connection-function-cli"></a>

次の例は、Connection Function をディストリビューションに関連付ける方法を示します。

```
// DistributionConfig:
{
   ...other settings,
    "ConnectionFunctionAssociation": {
        "Id": "cf_30c2CV2elHwCoInb3LtcaUJkZeD"
    }
}
```

## Connection Functions のユースケース
<a name="connection-function-use-cases"></a>

Connection Functions は、いくつかの高度な mTLS ユースケースを有効にします。
+ **証明書属性の検証** - 組織単位の要件やサブジェクト代替名パターンなど、クライアント証明書の特定のフィールドを検証します。
+ **証明書失効チェック** - KeyValueStore を使用してカスタム証明書失効チェックを実装し、失効した証明書のシリアル番号を保存します。
+ **IP ベースの証明書ポリシー** - クライアントの IP アドレスまたは地理的制限に基づいて異なる証明書ポリシーを適用します。
+ **マルチテナント検証** - ホスト名または証明書属性に基づいて異なる証明書要件が適用されるテナント固有の検証ルールを実装します。

**注記**  
Connection Functions は、TLS ハンドシェイク中にクライアント接続ごとに 1 回実行されます。  
Connection Functions は接続の許可または拒否のみを行うことができ、HTTP リクエストとレスポンスを変更することはできません。  
ディストリビューションに関連付けることができるのは、ライブステージにある関数 (発行済み) のみです。  
各ディストリビューションに含めることができる Connection Function は、最大 1 つまでです。

## 次のステップ
<a name="connection-function-next-steps"></a>

Connection Function を CloudFront ディストリビューションに関連付けた後、オプションの設定で mTLS 実装の動作をカスタマイズできます。オプションのクライアント証明書検証モードなど、追加設定の詳細な手順については、「[その他の設定](configuring-additional-settings.md)」を参照してください。

# その他の設定
<a name="configuring-additional-settings"></a>

基本的な相互 TLS 認証を有効にした後、追加の設定を構成して、特定のユースケースと要件の認証動作をカスタマイズできます。

## クライアント証明書の検証オプションのモード
<a name="optional-mode"></a>

CloudFront は、提示されたクライアント証明書を検証する代替オプションのクライアント証明書検証モードを提供しますが、証明書を提示しないクライアントへのアクセスを許可します。

### オプションモードの動作
<a name="optional-mode-behavior"></a>
+ 有効な証明書を持つクライアントへの接続を許可します (無効な証明書は拒否されます)。
+ 証明書のないクライアントの接続を許可する
+ 単一のディストリビューションを通じて混合クライアント認証シナリオを許可します。

オプションモードは、mTLS 認証への段階的な移行、証明書を持つクライアントと証明書のないクライアントのサポート、レガシークライアントとの下位互換性の維持に最適です。

**注記**  
オプションモードでは、クライアントが証明書を提示しなくても Connection Functions が呼び出されます。これにより、クライアントの IP アドレスのログ記録や、証明書が提示されるかどうかに基づく異なるポリシーの適用などのカスタムロジックを実装できます。

### オプションモードを設定するには (コンソール)
<a name="configure-optional-mode-console"></a>

1. ディストリビューション設定で、**[全般]** タブに移動し、**[編集]** を選択します。

1. **[接続]** コンテナ内の **[ビューワー相互認証 (mTLS)]** セクションまでスクロールします。

1. **[クライアント証明書の検証モード]** で、**[オプション]** を選択します。

1. 変更の保存。

### オプションモードを設定するには (AWS CLI)
<a name="configure-optional-mode-cli"></a>

次の例は、オプションモードの設定方法を示しています。

```
"ViewerMtlsConfig": {
   "Mode": "optional",
   ...other settings
}
```

## 認証局のアドバタイズ
<a name="ca-advertisement"></a>

AdvertiseTrustStoreCaNames フィールドは、TLS ハンドシェイク中に CloudFront が信頼される CA 名のリストをクライアントに送信するかどうかを制御し、クライアントが該当する証明書を選択するのに役立ちます。

### CA のアドバタイズを設定するには (コンソール)
<a name="configure-ca-advertisement-console"></a>

1. ディストリビューション設定で、**[全般]** タブに移動し、**[編集]** を選択します。

1. **[接続]** コンテナ内の **[ビューワー相互認証 (mTLS)]** セクションまでスクロールします。

1. **[トラストストアの CA 名のアドバタイズ]** チェックボックスをオンまたはオフにします。

1. **[Save changes]** (変更の保存) をクリックします。

### CA アドバタイズを設定するには (AWS CLI)
<a name="configure-ca-advertisement-cli"></a>

次の例は、CA アドバタイズを有効にする方法を示しています。

```
"ViewerMtlsConfig": {
   "Mode": "required", // or "optional"
   "TrustStoreConfig": {
      "AdvertiseTrustStoreCaNames": true,
      ...other settings
   } 
}
```

## 証明書の有効期限の処理
<a name="certificate-expiration-handling"></a>

IgnoreCertificateExpiry プロパティは、CloudFront が期限切れのクライアント証明書に応答する方法を決定します。デフォルトでは、CloudFront は期限切れのクライアント証明書を拒否しますが、必要に応じて受け入れるように設定できます。これは通常、すぐに更新できない期限切れの証明書を持つデバイスに対して有効です。

### 証明書の有効期限の処理を設定するには (コンソール)
<a name="configure-expiration-console"></a>

1. ディストリビューション設定で、**[全般]** タブに移動し、**[編集]** を選択します。

1. **[接続]** コンテナの **[ビューワー相互認証 (mTLS)]** セクションまでスクロールします。

1. **[証明書の有効期限を無視]** チェックボックスを選択または選択解除します。

1. **[Save changes]** (変更の保存) をクリックします。

### 証明書の有効期限の処理を設定するには (AWS CLI)
<a name="configure-expiration-cli"></a>

次の例は、証明書の有効期限を無視する方法を示します。

```
"ViewerMtlsConfig": {
  "Mode": "required", // or "optional"
  "TrustStoreConfig": {
     "IgnoreCertificateExpiry": false,
     ...other settings
  }
}
```

**注記**  
**IgnoreCertificateExpiry** は証明書の有効期限にのみ適用されます。他のすべての証明書検証チェックは引き続き適用されます (信頼チェーン、署名の検証)。

## 次のステップ
<a name="additional-settings-next-steps"></a>

追加の設定を行った後、オリジンに証明書情報を渡すようにヘッダー転送を設定して Connection Functions と KeyValueStore を使用して証明書失効を実装し、モニタリング用の接続ログを有効にすることができます。証明書情報をオリジンに転送する方法の詳細については、[「オリジンへヘッダーを転送する](viewer-mtls-headers.md)」を参照してください。

# オリジンに転送されるキャッシュポリシーの mTLS ヘッダービューワー
<a name="viewer-mtls-headers"></a>

相互 TLS 認証を使用する場合、CloudFront はクライアント証明書から情報を抽出し、HTTP ヘッダーとしてオリジンに転送できます。これにより、オリジンサーバーは証明書の検証ロジックを実装せずに証明書の詳細にアクセスできます。

キャッシュ動作を作成するために、次のヘッダーを使用できます。


| ヘッダー名 | 説明 | 値の例 | 
| --- | --- | --- | 
| CloudFront-Viewer-Cert-Serial-Number | 証明書のシリアル番号の 16 進数表現 | 4a:3f:5c:92:d1:e8:7b:6c | 
| CloudFront-Viewer-Cert-Issuer | 発行者の識別名 (DN) の RFC2253 文字列表現 | CN=rootcamtls.com、OU=rootCA、O=mTLS、L=Seattle、ST=Washington、C=US | 
| CloudFront-Viewer-Cert-Subject | サブジェクトの識別名 (DN) の RFC2253 文字列表現 | CN=client\$1.com、OU=client-3、O=mTLS、ST=Washington、C=US | 
| CloudFront-Viewer-Cert-Present | 証明書が存在するかどうかを示す 1 (存在する) または 0 (存在しない)。この値は、必須モードでは常に 1 です。 | 1 | 
| CloudFront-Viewer-Cert-Sha256 | クライアント証明書の SHA256 ハッシュ | 01fbf94fef5569753420c349f49adbfd80af5275377816e3ab1fb371b29cb586 | 

オリジンリクエストの場合、キャッシュ動作に使用できる上記のヘッダーに加えて、2 つのヘッダーが追加されます。


| ヘッダー名 | 説明 | 値の例 | 
| --- | --- | --- | 
| CloudFront-Viewer-Cert-Validity | notBefore および notAfter date の ISO8601 形式 | CloudFront-Viewer-Cert-Validity: NotBefore=2023-09-21T01:50:17Z;NotAfter=2024-09-20T01:50:17Z | 
| CloudFront-Viewer-Cert-Pem | リーフ証明書の URL エンコードされた PEM 形式 | CloudFront-Viewer-Cert-Pem: -----BEGIN%20CERTIFICATE-----%0AMIIG<...reduced...>NmrUlw%0A-----END%20CERTIFICATE-----%0A | 

## ヘッダー転送を設定する
<a name="configure-header-forwarding"></a>

### コンソール
<a name="configure-headers-console"></a>

検証モードでは、CloudFront はすべてのビューワーリクエストに CloudFront-Viewer-Cert-\$1 ヘッダーを自動的に追加します。これらのヘッダーをオリジンに転送するには

1. メインリストのディストリビューションページから、ビューワー mTLS が有効なディストリビューションを選択し、**[動作]** タブに移動します。

1. キャッシュ動作を選択し、**[編集]** を選択します。

1. **[オリジンのリクエストポリシー]** セクションで、**[ポリシーを作成]** を選択するか、既存のポリシーを選択します。

1. オリジンリクエストポリシーに次のヘッダーが含まれていることを確認します。
   + CloudFront-Viewer-Cert-Serial-Number
   + CloudFront-Viewer-Cert-Issuer
   + CloudFront-Viewer-Cert-Subject
   + CloudFront-Viewer-Cert-Present
   + Cloudfront-Viewer-Cert-Sha256
   + CloudFront-Viewer-Cert-Validity
   + CloudFront-Viewer-Cert-Pem

1. **[作成]** (新しいポリシーの場合) または **[保存]** (既存のポリシーの場合) を選択します。

1. キャッシュ動作内のポリシーを選択し、変更を保存する

### AWS CLI を使用する
<a name="configure-headers-cli"></a>

次の例は、検証モード用の mTLS ヘッダーを含むオリジンリクエストポリシーの作成方法を示しています。

```
aws cloudfront create-origin-request-policy \
  --origin-request-policy-config '{
    "Name": "MTLSHeadersPolicy",
    "HeadersConfig": {
      "HeaderBehavior": "whitelist",
      "Headers": {
        "Quantity": 5,
        "Items": [
          "CloudFront-Viewer-Cert-Serial-Number",
          "CloudFront-Viewer-Cert-Issuer",
          "CloudFront-Viewer-Cert-Subject",
          "CloudFront-Viewer-Cert-Validity",
          "CloudFront-Viewer-Cert-Pem"
        ]
      }
    },
    "CookiesConfig": {
      "CookieBehavior": "none"
    },
    "QueryStringsConfig": {
      "QueryStringBehavior": "none"
    }
  }'
```

## ヘッダー処理に関する考慮事項
<a name="header-processing-considerations"></a>

証明書ヘッダーを使用する場合、次のベストプラクティスを検討してください。
+ **ヘッダーの検証:** オリジンの証明書ヘッダー値を追加のセキュリティ対策として検証する
+ **ヘッダーサイズの制限:** PEM 証明書ヘッダーを大きくすることができます。オリジンサーバーが処理できることを確認してください
+ **キャッシュに関する考慮事項:** キャッシュキーで証明書ヘッダーを使用すると、キャッシュのフラグメント化が進みます
+ **クロスオリジンリクエスト:** アプリケーションが CORS を使用している場合、証明書ヘッダーを許可するように設定する必要がある場合があります

## 次のステップ
<a name="headers-next-steps"></a>

ヘッダー転送を設定したら、CloudFront Connection Functions と KeyValueStore を使用して証明書失効チェックを実装できます。失効チェックの実装の詳細については、「[CloudFront 接続Connection Function と KVS を使用した取り消し](revocation-connection-function-kvs.md)」を参照してください。

# CloudFront 接続Connection Function と KVS を使用した取り消し
<a name="revocation-connection-function-kvs"></a>

CloudFront Connection Functions と KeyValueStore を組み合わせて、相互 TLS 認証に証明書失効チェックを実装できます。このアプローチは、CloudFront の組み込み証明書検証を補完するスケーラブルでリアルタイムの証明書失効メカニズムを提供します。

Connection Functions は、CloudFront エッジロケーションでの TLS 接続の確立中に実行される JavaScript 関数で、mTLS 認証用のカスタム証明書検証ロジックを実装できます。Connection Functions の詳細については、「[CloudFront Connection Function を関連付ける](connection-functions.md)」を参照してください。

## Connection Functions での証明書失効の仕組み
<a name="how-revocation-works"></a>

CloudFront の標準証明書検証は、証明書チェーン、署名、有効期限を検証しますが、組み込みの証明書失効チェックは含みません。Connection Functions を使用すると、TLS ハンドシェイク中にカスタム失効チェックを実装できます。

証明書の失効プロセスは次のように機能します。

1. 失効した証明書のシリアル番号を CloudFront KeyValueStore に保存します。

1. クライアントが証明書を提示すると、Connection Function が呼び出されます。

1. 関数は、証明書のシリアル番号と KeyValueStore を照合します。

1. シリアル番号がストアで見つかった場合、証明書は失効しています。

1. 関数は、失効した証明書の接続を拒否します。

このアプローチは、CloudFront のグローバルエッジネットワーク全体でほぼリアルタイムの失効チェックを提供します。

## 失効した証明書の KeyValueStore を設定する
<a name="setup-kvs-revoked-certs"></a>

まず、失効した証明書のシリアル番号を保存する KeyValueStore を作成します。

### KeyValueStore を作成するには (コンソール)
<a name="create-kvs-console"></a>

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ナビゲーションペインで、**[キーバリューストア]** を選択します。

1. **[キーバリューストアを作成]** を選択します。

1. キーバリューストアを作成の名前を入力します (revoked-certificates など)。

1. (オプション) 説明を入力します。

1. **[キーバリューストアを作成]** を選択します。

### KeyValueStore を作成するには (AWS CLI)
<a name="create-kvs-cli"></a>

次の例は、KeyValueStore を作成する方法を示します。

```
aws cloudfront create-key-value-store \
  --name "revoked-certificates" \
  --comment "Store for revoked certificate serial numbers"
```

## 失効した証明書のシリアル番号をインポートする
<a name="import-revoked-serials"></a>

KeyValueStore を作成した後、失効した証明書のシリアル番号をインポートする必要があります。

### 失効データを準備する
<a name="prepare-revocation-data"></a>

失効した証明書のシリアル番号を使用して JSON ファイルを作成します。

```
{
  "data": [
    {
      "key": "ABC123DEF456",
      "value": ""
    },
    {
      "key": "789XYZ012GHI",
      "value": ""
    }
  ]
}
```

### S3 からのインポート
<a name="import-from-s3"></a>

1. S3 バケットに JSON ファイルをアップロードする

1. ファイルを 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 を作成する
<a name="create-revocation-connection-function"></a>

証明書のシリアル番号と KeyValueStore を照合する Connection Function を作成します。

### Connection Function のコード例
<a name="revocation-function-example"></a>

次の例は、証明書失効チェックを実行する 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)
<a name="create-revocation-function-cli"></a>

次の例は、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
```

## 関数をディストリビューションに関連付ける
<a name="associate-revocation-function"></a>

Connection Function を作成して公開した後、「[CloudFront Connection Function を関連付ける](connection-functions.md)」セクションの説明に従って、mTLS 対応の CloudFront ディストリビューションに関連付けます。

# 接続ログを使用したオブザーバビリティ
<a name="connection-logs"></a>

CloudFront 接続ログは相互 TLS 認証イベントを詳細に可視化するため、証明書の検証のモニタリング、接続試行の追跡、認証問題のトラブルシューティングを行うことができます。

## 接続ログとは
<a name="what-are-connection-logs"></a>

接続ログは、相互 TLS 対応ディストリビューションの TLS ハンドシェイクと証明書の検証に関する詳細情報をキャプチャします。HTTP リクエスト情報を記録する標準アクセスログとは異なり、接続ログは、以下を含む TLS 接続確立フェーズに特に重点を置いています。
+ 接続ステータス (成功/失敗)
+ クライアント証明書の詳細
+ TLS プロトコルと暗号情報
+ 接続タイミングのメトリクス
+ Connection Functions からのカスタムデータ

これらのログは、証明書ベースの認証イベントを包括的に可視化し、セキュリティのモニタリング、問題のトラブルシューティングを行い、コンプライアンス要件を満たすのに役立ちます。

## 接続ログを有効にする
<a name="enable-connection-logs"></a>

接続ログは、相互 TLS 認証が有効になっているディストリビューションでのみ利用可能です。CloudWatch Logs、Amazon Data Firehose、Amazon S3 など、複数の宛先に接続ログを送信できます。

### 前提条件
<a name="connection-logs-prerequisites"></a>

接続ログを有効にする前に
+ CloudFront ディストリビューションの相互 TLS を設定します
+ CloudFront ディストリビューションの接続ログを有効にします
+ 選択したログ記録先に必要なアクセス許可があることを確認します
+ クロスアカウント配信の場合、適切な IAM ポリシーを設定します

### 接続ログを有効にするには (コンソール)
<a name="enable-connection-logs-console"></a>

1. AWS マネジメントコンソールにサインインし、[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) で CloudFront コンソールを開きます。

1. ディストリビューションリストから、mTLS 対応ディストリビューションを選択します。

1. **[Logging]** (ログ) タブを選択します。

1. **[Add]** (追加) を選択します。

1. ログを受信するサービスを選択します。
   + **CloudWatch Logs**
   + **Firehose** – 
   + **Amazon S3**

1. **[送信先]** で、選択したサービスのリソースを選択します。
   + CloudWatch Logs の場合は、**[ロググループ名]** に入力します。
   + Firehose の場合、**[Firehose 配信ストリーム]** を選択します。
   + Amazon S3 の場合、**[バケット名]** を入力します (オプションでプレフィックスを使用)。

1. (オプション) 追加の設定を行います。
   + **フィールドの選択:** 含める特定のログフィールドを選択します。
   + **出力形式:** JSON、プレーン、w3c、Raw、または Parquet (S3 のみ) から選択します。
   + **フィールド区切り文字:** ログフィールドを区切る方法を指定します。

1. **[変更を保存]** を選択します。

### 接続ログを有効にするには (AWS CLI)
<a name="enable-connection-logs-cli"></a>

次の例は、CloudWatch API を使用して接続ログを有効にする方法を示します。

```
# Step 1: Create a delivery source
aws logs put-delivery-source \
  --name "cf-mtls-connection-logs" \
  --resource-arn "arn:aws:cloudfront::123456789012:distribution/E1A2B3C4D5E6F7" \
  --log-type CONNECTION_LOGS

# Step 2: Create a delivery destination
aws logs put-delivery-destination \
  --name "s3-destination" \
  --delivery-destination-configuration \
  "destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket1"

# Step 3: Create the delivery
aws logs create-delivery \
  --delivery-source-name "cf-mtls-connection-logs" \
  --delivery-destination-arn "arn:aws:logs:us-east-1:123456789012:delivery-destination:s3-destination"
```

**注記**  
CloudWatch API を使用する場合、他のリージョンにログを配信する場合でも、米国東部 (バージニア北部) リージョン (us-east-1) を指定する必要があります。

## 接続ログのフィールド
<a name="connection-log-fields"></a>

接続ログには、各 TLS 接続試行に関する詳細情報が含まれます。


| フィールド | 説明 | 例 | 
| --- | --- | --- | 
| eventTimestamp | 接続が確立または失敗したときの ISO 8601 タイムスタンプ | 1731620046814 | 
| connectionId | TLS 接続の一意の識別子 | oLHiEKbQSn8lkvJfA3D4gFowK3\$1iZ0g4i5nMUjE1Akod8TuAzn5nzg== | 
| connectionStatus |  mTLS 接続試行のステータス。  | Success-または-Failed | 
| clientIp | 接続しているクライアントの IP アドレス | 2001:0db8:85a3:0000:0000:8a2e:0370:7334 | 
| clientPort | クライアントが使用するポート | 12137 | 
| serverIp | CloudFront エッジサーバーの IP アドレス | 99.84.71.136 | 
| distributionId | CloudFront ディストリビューション ID | E2DX1SLDPK0123 | 
| distributionTenantId | CloudFront ディストリビューションテナント ID (該当する場合) | dt\$12te1Ura9X3R2iCGNjW123 | 
| tlsProtocol | 使用されている TLS プロトコルバージョン | TLSv1.3 | 
| tlsCipher | 接続に使用される TLS 暗号スイート | TLS\$1AES\$1128\$1GCM\$1SHA256 | 
| tlsHandshakeDuration | TLS ハンドシェイクの期間 (ミリ秒単位) | 153 | 
| tlsSni | TLS ハンドシェイクからの Server Name Indication の値 | d111111abcdef8.cloudfront.net | 
| clientLeafCertSerialNumber | クライアントの証明書のシリアル番号 | 00:b1:43:ed:93:d2:d8:f3:9d | 
| clientLeafCertSubject | クライアントの証明書のサブジェクトフィールド | C=US, ST=WA, L=Seattle, O=Amazon.com, OU=CloudFront, CN=client.test.mtls.net | 
| clientLeafCertIssuer | クライアントの証明書の発行者フィールド | C=US, ST=WA, L=Seattle, O=Amazon.com, OU=CloudFront, CN=test.mtls.net | 
| clientLeafCertValidity | クライアントの証明書の有効期間 | NotBefore=2025-06-05T23:28:21Z;NotAfter=2125-05-12T23:28:21Z | 
| connectionLogCustomData | Connection Functions を介して追加されたカスタムデータ | REVOKED:00:b1:43:ed:93:d2:d8:f3:9d | 

## 接続エラーコード
<a name="connection-error-codes"></a>

```
Failed:ClientCertMaxChainDepthExceeded
Failed:ClientCertMaxSizeExceeded
Failed:ClientCertUntrusted
Failed:ClientCertNotYetValid
Failed:ClientCertExpired
Failed:ClientCertTypeUnsupported
Failed:ClientCertInvalid
Failed:ClientCertIntentInvalid
Failed:ClientCertRejected
Failed:ClientCertMissing
Failed:TcpError
Failed:TcpTimeout
Failed:ConnectionFunctionError
Failed:ConnectionFunctionDenied
Failed:Internal
Failed:UnmappedConnectionError
```

接続が失敗すると、CloudFront は特定の理由コードを記録します。


| コード | 説明 | 
| --- | --- | 
| ClientCertMaxChainDepthExceeded | 証明書チェーンの最大深度を超えました | 
| ClientCertMaxSizeExceeded | 最大証明書サイズを超えました | 
| ClientCertUntrusted | 証明書は信頼されていません | 
| ClientCertNotYetValid | 証明書はまだ有効ではありません | 
| ClientCertExpired | 証明書の有効期限が切れています | 
| ClientCertTypeUnsupported | 証明書のタイプがサポートされていません | 
| ClientCertInvalid | 証明書が無効です | 
| ClientCertIntentInvalid | 証明書のインテントが無効です | 
| ClientCertRejected | カスタム検証によって拒否された証明書 | 
| ClientCertMissing | 証明書がありません | 
| TcpError |  接続確立の試行中にエラーが発生しました  | 
| TcpTimeout |  タイムアウト期間内に接続を確立できませんでした  | 
| ConnectionFunctionError |  Connection Function の実行中に、キャッチされない例外がスローされました  | 
| 内部 |  内部サービスエラーが発生しました。  | 
| UnmappedConnectionError |  他のいずれのカテゴリにも該当しないエラーが発生しました  | 