

# 署名付き URL を使用する


署名付き URL には、有効期限切れ日時など、追加の情報も含まれており、コンテンツへのアクセスをより詳細に制御できます。この追加情報は、既定ポリシーまたはカスタムポリシーに基づくポリシーステートメントに含まれます。既定ポリシーとカスタムポリシーの違いを以下の 2 つのセクションで説明します。

**注記**  
既定ポリシーを使用して一部の署名付き URL を作成し、同じディストリビューションで、カスタムポリシーを使用して一部の署名付き URL を作成することができます。

**Topics**
+ [

## 署名付き URL に既定ポリシーとカスタムポリシーのどちらを使用するかを決定する
](#private-content-choosing-canned-custom-policy)
+ [

## 署名付き URL の仕組み
](#private-content-how-signed-urls-work)
+ [

## 署名付き URL の有効期間を決定する
](#private-content-overview-choosing-duration)
+ [

## CloudFront が署名付き URL の有効期限切れの日時を確認するタイミング
](#private-content-check-expiration)
+ [

## サンプルコードおよびサードパーティーツール
](#private-content-overview-sample-code)
+ [

# 既定ポリシーを使用して署名付き URL を作成する
](private-content-creating-signed-url-canned-policy.md)
+ [

# カスタムポリシーを使用して署名付き URL を作成する
](private-content-creating-signed-url-custom-policy.md)

## 署名付き URL に既定ポリシーとカスタムポリシーのどちらを使用するかを決定する


署名付き URL を作成する場合、URL の有効期間など、署名付き URL で制限を指定する JSON 形式のポリシーステートメントを作成します。既定ポリシーまたはカスタムポリシーのいずれかを使用できます。既定ポリシーとカスタムポリシーの比較を以下に示します。


****  

| 説明 | 既定ポリシー | カスタムポリシー | 
| --- | --- | --- | 
| ポリシーステートメントを複数のファイル用に再利用できる。ポリシーステートメントを再利用するには、`Resource` オブジェクトでワイルドカード文字を使用する必要があります。(詳しくは、「[カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-statement-values)」を参照してください)。 | いいえ | はい | 
| ユーザーがコンテンツへのアクセスを開始できる日時を指定できる。 | いいえ | はい (オプション) | 
| ユーザーがコンテンツにアクセスできなくなる日時を指定できる。 | はい | はい | 
| コンテンツにアクセスできるユーザーの IP アドレスまたは IP アドレス範囲を指定できる。 | いいえ | はい (オプション) | 
| 署名付き URL にポリシーの base64 エンコードされたバージョンが含まれているため、URL が長くなる。 | いいえ | はい | 

*既定*ポリシーを使用して署名付き URL を作成する方法については、「[既定ポリシーを使用して署名付き URL を作成する](private-content-creating-signed-url-canned-policy.md)」を参照してください。

*カスタム*ポリシーを使用して署名付き URL を作成する方法については、「[カスタムポリシーを使用して署名付き URL を作成する](private-content-creating-signed-url-custom-policy.md)」を参照してください。

## 署名付き URL の仕組み


署名付き URL 用の CloudFront と Amazon S3 の設定方法と、ユーザーが署名付き URL を使用してファイルをリクエストしたときの CloudFront の応答方法の概要を次に示します。

1. CloudFront ディストリビューションで、1 つ以上の信頼されたキーグループを指定します。指定したグループには、CloudFront が URL 署名の検証に使用できるパブリックキーが含まれている必要があります。対応するプライベートキーを使用して URL に署名します。

   CloudFront は、RSA 2048 および ECDSA 256 キー署名を使用した署名 URL をサポートしています。

   詳細については、「[署名付き URL と署名付き Cookie を作成できる署名者を指定する](private-content-trusted-signers.md)」を参照してください。

1. アプリケーションを開発して、ユーザーがコンテンツへのアクセス許可を持つかどうかを決定し、アプリケーションでアクセスを制限するファイルまたは部分用に署名付き URL を作成するかを決定します。詳細については、以下のトピックを参照してください。
   + [既定ポリシーを使用して署名付き URL を作成する](private-content-creating-signed-url-canned-policy.md)
   + [カスタムポリシーを使用して署名付き URL を作成する](private-content-creating-signed-url-custom-policy.md)

1. 署名付き URL を必要とするファイルをユーザーが要求します。

1. アプリケーションは、ファイルにアクセスするための資格がユーザーにあることを検証します。たとえば、ユーザーがサインインしていること、コンテンツへのアクセス料を支払っていること、他のいくつかのアクセス要件を満たしていることを検証します。

1. アプリケーションは署名付き URL を作成してエンドユーザーに返します。

1. 署名付き URL を使用すると、ユーザーはコンテンツのダウンロードやストリーミングができます。

   このステップは自動で実行されます。ユーザーは、コンテンツにアクセスする以外に、何も行う必要はありません。たとえば、ユーザーがウェブブラウザでコンテンツにアクセスすると、アプリケーションは署名付き URL をブラウザに返します。ブラウザは、直ちに、署名付き URL を使用して CloudFront エッジキャッシュ内のファイルにアクセスします。ユーザーからの介入はありません。

1. CloudFront はパブリックキーを使用して署名を検証し、URL が改ざんされていないことを確認します。署名が無効である場合、リクエストは拒否されます。

   署名が有効である場合、CloudFront は URL のポリシーステートメントを参照して (または既定ポリシーを使用している場合はポリシーステートメントを作成して)、リクエストがまだ有効であることを確認します。たとえば、URL の開始日時と終了日時を指定した場合、CloudFront は、アクセスが許可されている期間にユーザーがコンテンツへのアクセスを試みていることを確認します。

   リクエストがポリシーステートメントの要件を満たしている場合、CloudFront は標準の操作を実行します。つまり、ファイルがエッジキャッシュにすでに存在するかどうかを確認し、必要に応じてリクエストをオリジンに転送して、ファイルをユーザーに返します。

**注記**  
署名なし URL にクエリ文字列パラメータが含まれている場合は、署名する URL にそれらのパラメータを含めてください。URL への署名後にその URL にクエリ文字列を追加すると、HTTP 403 ステータスが返されます。

## 署名付き URL の有効期間を決定する


短期間 (おそらく数分) のみ有効な署名付き URL を使用してプライベートコンテンツを配信できます。このように短期間有効な署名付き URL は、特定の目的で、コンテンツをユーザーにオンザフライで配信する場合に適しています。たとえば、映画レンタルや音楽ダウンロードをカスタマーにオンデマンドで配信する場合に適しています。署名付き URL を短期間だけ有効にする場合、開発したアプリケーションを使用して、署名付き URL を自動生成することが必要になる場合があります。ユーザーがファイルのダウンロードまたはメディアファイルの再生を開始すると、CloudFront は、URL 内の有効期限切れ時刻と現在の時刻を比較して、URL が依然として有効かどうかを判別します。

これよりも有効期間の長い (おそらく数年間の) 署名付き URL を使用して、プライベートコンテンツを配信できます。有効期間の長い署名付き URL は、プライベートコンテンツを既知のユーザーに配信する場合に役立ちます。たとえば、事業計画を投資家に配信したり、教育資料を従業員に配信したりする場合に役立ちます。これらの長期的な署名付き URL を生成するアプリケーションを開発できます。

## CloudFront が署名付き URL の有効期限切れの日時を確認するタイミング


CloudFront は、HTTP リクエスト時に署名付き URL の有効期限切れ日時を確認します。有効期限切れ時刻の直前にクライアントが大きなファイルのダウンロードを開始した場合、ダウンロード中に有効期限切れ時刻が経過してもダウンロードは完了します。TCP 接続が中断し、有効期限切れ時刻が経過した後にクライアントがダウンロードを再開した場合、ダウンロードは失敗します。

クライアントが、ファイルを断片的に取得するレンジ GET を使用した場合、有効期限切れ時刻が経過した後に実行された GET リクエストは失敗します。レンジ GET の詳細については、「[CloudFront がオブジェクトの部分的リクエスト (レンジ GET) を処理する方法](RangeGETs.md)」を参照してください。

## サンプルコードおよびサードパーティーツール


署名付き URL の、ハッシュ化および署名されたパートを作成するサンプルコードについては、以下のトピックを参照してください。
+ [Perl を使用して URL 署名を作成する](CreateURLPerl.md)
+ [PHP を使用して URL 署名を作成する](CreateURL_PHP.md)
+ [C\$1 と .NET Framework を使用して URL 署名を作成する](CreateSignatureInCSharp.md)
+ [Java を使用して URL 署名を作成する](CFPrivateDistJavaDevelopment.md)

# 既定ポリシーを使用して署名付き URL を作成する


既定ポリシーを使用して署名付き URL を作成するには、以下の手順を実行します。<a name="private-content-creating-signed-url-canned-policy-procedure"></a>

**既定ポリシーを使用して署名付き URL を作成するには**

1. .NET または Java を使用して署名付き URL を作成しており、キーペアのプライベートキーをデフォルトの .pem 形式から .NET または Java 対応の形式に変更していない場合は、それを変換します。詳細については、「[プライベートキーの形式を変更する (.NET および Java のみ)](private-content-trusted-signers.md#private-content-reformatting-private-key)」を参照してください。

1. 以下の値を連結します。この署名付き URL の例に示す形式を使用できます。

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Expires=1767290400&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F
   ```

   すべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。すべての値の型は `String` です。  
**1. *ファイルのベース URL***  
ベース URL は、署名付き URL を使用しなかった場合にファイルへのアクセスに使用する CloudFront URL であり、独自のクエリ文字列パラメータを含みます (ある場合)。前の例で、ベース URL は `https://d111111abcdef8.cloudfront.net/image.jpg` です。ディストリビューション用の URL 形式の詳細については、「[CloudFront でファイルの URL 形式をカスタマイズする](LinkFormat.md)」を参照してください。  
   + 以下の CloudFront URL は、ディストリビューション内のイメージファイルの URL です (CloudFront ドメイン名を使用)。`image.jpg` は `images` ディレクトリにあります。URL 内のファイルへのパスは、HTTP サーバーまたは Amazon S3 バケットのファイルへのパスに一致する必要があります。

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + 以下の CloudFront URL には、クエリ文字列が含まれます。

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + 以下の CloudFront URL は、ディストリビューション内のイメージファイルの URL です。どちらも代替ドメイン名を使用します。2 番目にはクエリ文字列が含まれています。

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + 以下の CloudFront URL は、代替ドメイン名と HTTPS プロトコルを使用するディストリビューション内のイメージファイルの URL です。

     `https://www.example.com/images/image.jpg`  
** 2. `?` **  
`?` は、クエリパラメータがベース URL の後に続くことを示します。クエリパラメータを指定しない場合でも、`?` を含めます。  
以下のクエリパラメータは任意の順序で指定できます。  
**3. *クエリ文字パラメータ (ある場合*`&`**  
(オプション) 独自のクエリ文字列パラメータを入力できます。これを行うには、各パラメータ間にアンパサンド (`&`) を追加します (例: `color=red&size=medium`)。クエリ文字列パラメータは、URL 内に任意の順序で指定できます。  
クエリ文字列パラメータに `Expires`、`Signature`、または `Key-Pair-Id` という名前を付けることはできません。  
** 4.`Expires=`*Unix 時間形式 (秒単位) および協定世界時 (UTC) の日時***  
URL によるファイルへのアクセスの許可を停止する日付と時刻。  
有効期限切れ日時を Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。例えば、このトピックの冒頭にある例に示すように、2026 年 1 月 1 日午前 10:00 UTC は Unix 時間形式で `1767290400` に変換されます。  
エポック時間を使用するには、`9223372036854775807` (2262 年 4 月 11 日金曜日の 23:47:16.854 UTC) 以前の日付に 64 ビット整数を指定します。  
  
UTC の詳細については、[RFC 3339, Date and Time on the Internet: Timestamps](https://tools.ietf.org/html/rfc3339) を参照してください。  
** 5. `&Signature=`*ハッシュ化および署名されたバージョンのポリシーステートメント***  
ハッシュ化され、署名された base64 エンコードバージョンの JSON ポリシーステートメント。詳細については、「[既定ポリシーを使用する署名付き URL の署名を作成する](#private-content-canned-policy-creating-signature)」を参照してください。  
** 6. `&Key-Pair-Id=`*署名の生成に使用しているプライベートキーに対応する CloudFront パブリックキーのパブリックキー ID***  
CloudFront パブリックキーの ID (`K2JCJMDEHXQW5F` など)。パブリックキー ID は、署名付き URL の検証に使用するパブリックキーを CloudFront に通知します。CloudFront は、署名内の情報をポリシーステートメント内の情報と比較して、URL が改ざんされていないことを確認します。  
このパブリックキーは、ディストリビューションの信頼された署名者であるキーグループに属している必要があります。詳細については、「[署名付き URL と署名付き Cookie を作成できる署名者を指定する](private-content-trusted-signers.md)」を参照してください。

## 既定ポリシーを使用する署名付き URL の署名を作成する


既定ポリシーを使用する署名付き URL の署名を作成するには、以下の手順を実行します。

**Topics**
+ [

### 既定ポリシーを使用する署名付き URL のポリシーステートメントを作成する
](#private-content-canned-policy-creating-policy-statement)
+ [

### 既定ポリシーを使用する署名付き URL の署名を作成する
](#private-content-canned-policy-signing-policy-statement)

### 既定ポリシーを使用する署名付き URL のポリシーステートメントを作成する


既定ポリシーを使用して署名付き URL を作成する場合、`Signature` パラメータは、ポリシーステートメントのハッシュ化および署名されたバージョンです。カスタムポリシーを使用する署名付き URL とは異なり、既定ポリシーを使用する署名付き URL では、URL にポリシーステートメントを含めません。ポリシーステートメントを作成するには、以下の手順を実行します。<a name="private-content-canned-policy-creating-policy-statement-procedure"></a>

**既定ポリシーを使用する署名付き URL のポリシーステートメントを作成するには**

1. 以下の JSON 形式および UTF-8 文字エンコードを使用してポリシーステートメントを構築します。すべての句読点および他のリテラル値を、指定されたとおりに正確に含めます。`Resource` および `DateLessThan` パラメータの詳細については、「[既定ポリシーを使用する署名付き URL のポリシーステートメントで指定する値](#private-content-canned-policy-statement-values)」を参照してください。

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. ポリシーステートメントからすべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。

#### 既定ポリシーを使用する署名付き URL のポリシーステートメントで指定する値


既定ポリシーのポリシーステートメントを作成する場合、以下の値を指定します。

**リソース**  
`Resource` の値は 1 つだけ指定できます。
クエリ文字列 (ある場合) が含まれるベース URL。ただし、CloudFront の `Expires`、`Signature`、および `Key-Pair-Id` パラメータが除外されます。次に例を示します。  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
次の点に注意してください。  
+ **プロトコル** – 値は `http://` または `https://` で始まっている必要があります。
+ **クエリ文字列パラメータ** – クエリ文字列パラメータがない場合は、疑問符を省略します。
+ **代替ドメイン名** – URL で代替ドメイン名 (CNAME) を指定する場合は、ウェブページまたはアプリケーション内のファイルを参照するときに代替ドメイン名を指定する必要があります。オブジェクトの Amazon S3 URL を指定しないでください。

**DateLessThan**  
URL の有効期限切れ日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。例えば、UTC の 2026 年 1 月 1 日午前 10 時 00 分は、Unix 時間形式の 1767290400 に変換されます。  
この値は、署名付き URL 内の `Expires` クエリ文字列パラメータの値と一致する必要があります。値を引用符で囲まないでください。  
詳細については、「[CloudFront が署名付き URL の有効期限切れの日時を確認するタイミング](private-content-signed-urls.md#private-content-check-expiration)」を参照してください。

#### 既定ポリシーを使用する署名付き URL のポリシーステートメントの例


署名付き URL 内の既定ポリシーの以下のポリシーステートメントの例を使用すると、ユーザーは、UTC の 2026 年 1 月 1 日午前 10 時 00 分までファイル `https://d111111abcdef8.cloudfront.net/horizon.jpg` にアクセスできます。

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### 既定ポリシーを使用する署名付き URL の署名を作成する


署名付き URL の `Signature` パラメータの値を作成するには、「[既定ポリシーを使用する署名付き URL のポリシーステートメントを作成する](#private-content-canned-policy-creating-policy-statement)」で作成したポリシーステートメントをハッシュ化して署名します。

ポリシーステートメントのハッシュ化、署名、およびエンコードを行う方法の詳細および例については、以下の各資料を参照してください。
+ [Linux コマンドおよび OpenSSL を使用した Base64 エンコードおよび暗号化](private-content-linux-openssl.md)
+ [署名付き URL の署名を作成するためのコード例](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-canned-policy-creating-signature-download-procedure"></a>

**オプション 1: 既定ポリシーを使用して署名を作成するには**

1. 「[既定ポリシーを使用する署名付き URL のポリシーステートメントを作成するには](#private-content-canned-policy-creating-policy-statement-procedure)」の手順で作成したポリシーステートメントを、SHA-1 ハッシュ関数と生成した RSA または ECDSA プライベートキーを使用してハッシュ化し、署名します。空白を含まないバージョンのポリシーステートメントを使用します。

   ハッシュ関数に必要なプライベートキーには、対応するパブリックキーがディストリビューション内のアクティブな信頼されたキーグループにあるものを使用してください。
**注記**  
ポリシーステートメントをハッシュ化および署名するための方法は、プログラミング言語およびプラットフォームによって異なります。サンプルコードについては、「[署名付き URL の署名を作成するためのコード例](PrivateCFSignatureCodeAndExamples.md)」を参照してください。

1. ハッシュ化および署名された文字列から、空白 (タブや改行文字を含む) を削除します。

1. MIME base64 エンコーディングを使用して文字列を Base64 エンコードします。詳細については、*RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies* の [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) を参照してください。

1. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html)

1. 結果の値を署名付き URL の `&Signature=` の後に付加し、「[既定ポリシーを使用して署名付き URL を作成するには](#private-content-creating-signed-url-canned-policy-procedure)」に戻って、署名付き URL の各パートの連結を終了します。

# カスタムポリシーを使用して署名付き URL を作成する


カスタムポリシーを使用して署名付き URL を作成するには、次の手順を実行します。<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**カスタムポリシーを使用して署名付き URL を作成するには**

1. .NET または Java を使用して署名付き URL を作成しており、キーペアのプライベートキーをデフォルトの .pem 形式から .NET または Java 対応の形式に変更していない場合は、それを変換します。詳細については、「[プライベートキーの形式を変更する (.NET および Java のみ)](private-content-trusted-signers.md#private-content-reformatting-private-key)」を参照してください。

1. 以下の値を連結します。この署名付き URL の例に示す形式を使用できます。

   

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F
   ```

   すべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。すべての値の型は `String` です。  
**1. *ファイルのベース URL***  
ベース URL は、署名付き URL を使用しなかった場合にファイルへのアクセスに使用する CloudFront URL であり、独自のクエリ文字列パラメータを含みます (ある場合)。前の例で、ベース URL は `https://d111111abcdef8.cloudfront.net/image.jpg` です。ディストリビューション用の URL 形式の詳細については、「[CloudFront でファイルの URL 形式をカスタマイズする](LinkFormat.md)」を参照してください。  
以下の例は、ディストリビューションで指定する値を示しています。  
   + 以下の CloudFront URL は、ディストリビューション内のイメージファイルの URL です (CloudFront ドメイン名を使用)。`image.jpg` は `images` ディレクトリにあります。URL 内のファイルへのパスは、HTTP サーバーまたは Amazon S3 バケットのファイルへのパスに一致する必要があります。

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + 以下の CloudFront URL には、クエリ文字列が含まれます。

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + 以下の CloudFront URL は、ディストリビューション内のイメージファイルの URL です。両方の URL で代替ドメイン名が使用されており、2 番目の URL にはクエリ文字列が含まれています。

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + 以下の CloudFront URL は、代替ドメイン名と HTTPS プロトコルを使用するディストリビューション内のイメージファイルの URL です。

     `https://www.example.com/images/image.jpg`  
**2. `?` **  
`?` は、クエリ文字列パラメータがベース URL の後に続くことを示します。クエリパラメータを指定しない場合でも、`?` を含めます。  
以下のクエリパラメータは任意の順序で指定できます。  
**3. *クエリ文字パラメータ (ある場合*`&`**  
(オプション) 独自のクエリ文字列パラメータを入力できます。これを行うには、各パラメータ間にアンパサンド (&) を追加します (例: `color=red&size=medium`)。クエリ文字列パラメータは、URL 内に任意の順序で指定できます。  
クエリ文字列パラメータに `Policy`、`Signature`、または `Key-Pair-Id` という名前を付けることはできません。
独自のパラメータを追加する場合は、各パラメータの後に `&` を付加します (最後のパラメータにも付加します)。  
**4. `Policy=`*ポリシーステートメントの base64 エンコードバージョン***  
空白が削除されて base64 エンコードされた、JSON 形式のポリシーステートメント。詳細については、「[カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成する](#private-content-custom-policy-statement)」を参照してください。  
ポリシーステートメントは、署名付き URL によってユーザーに許可されるアクセスをコントロールします。これには、ファイルの URL、有効期限切れ日時、URL が有効になる日時 (オプション)、ファイルへのアクセスが許可されている IP アドレスまたは IP アドレス範囲 (オプション) が含まれます。  
**5. `&Signature=`*ハッシュ化および署名されたバージョンのポリシーステートメント***  
ハッシュ化され、署名された base64 エンコードバージョンの JSON ポリシーステートメント。詳細については、「[カスタムポリシーを使用する署名付き URL の署名を作成する](#private-content-custom-policy-creating-signature)」を参照してください。  
**6. `&Key-Pair-Id=`*署名の生成に使用しているプライベートキーに対応する CloudFront パブリックキーのパブリックキー ID***  
CloudFront パブリックキーの ID (`K2JCJMDEHXQW5F` など)。パブリックキー ID は、署名付き URL の検証に使用するパブリックキーを CloudFront に通知します。CloudFront は、署名内の情報をポリシーステートメント内の情報と比較して、URL が改ざんされていないことを確認します。  
このパブリックキーは、ディストリビューションの信頼された署名者であるキーグループに属している必要があります。詳細については、「[署名付き URL と署名付き Cookie を作成できる署名者を指定する](private-content-trusted-signers.md)」を参照してください。

## カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成する


カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには、以下の手順を実行します。

さまざまな方法でファイルへのアクセスを制御するポリシーステートメントの例については、「[カスタムポリシーを使用する署名付き URL のポリシーステートメントの例](#private-content-custom-policy-statement-examples)」を参照してください。<a name="private-content-custom-policy-creating-policy-procedure"></a>

**カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには**

1. 以下の JSON 形式を使用してポリシーステートメントを構築します。小なり記号 (`<`) と大なり記号 (`>`)、およびそれらの中の説明は、独自の値に置き換えます。詳細については、「[カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値](#private-content-custom-policy-statement-values)」を参照してください。

   ```
   {
       "Statement": [
           {
               "Resource": "<Optional but recommended: URL of the file>",
               "Condition": {
                   "DateLessThan": {
   	                "AWS:EpochTime": <Required: ending date and time in Unix time format and UTC>
                   },
                   "DateGreaterThan": {
   	                "AWS:EpochTime": <Optional: beginning date and time in Unix time format and UTC>
                   },
                   "IpAddress": {
   	                "AWS:SourceIp": "<Optional: IP address>"
                   }
               }
           }
       ]
   }
   ```

   次の点に注意してください。
   + ポリシーには、1 つのステートメントのみを含めることができます。
   + UTF-8 文字エンコードを使用します。
   + すべての句読点およびパラメータ名を、指定されたとおりに正確に含めます。パラメータ名の省略形は受け付けられません。
   + `Condition` セクションのパラメータの順序は問題ではありません。
   + `Resource`、`DateLessThan`、`DateGreaterThan`、および `IpAddress` の値については、「[カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値](#private-content-custom-policy-statement-values)」を参照してください。

1. ポリシーステートメントからすべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。

1. MIME base64 エンコーディングを使用してポリシーステートメントを Base64 エンコードします。詳細については、*RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies* の [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) を参照してください。

1. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. 結果の値を署名付き URL の `Policy=` の後に付加します。

1. ポリシーステートメントのハッシュ化、署名、および base64 エンコードを行って、署名付き URL の署名を作成します。詳細については、「[カスタムポリシーを使用する署名付き URL の署名を作成する](#private-content-custom-policy-creating-signature)」を参照してください。

### カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値


カスタムポリシーのポリシーステートメントを作成する場合、以下の値を指定します。

**リソース**  
クエリ文字列 (ある場合) が含まれる URL。ただし、CloudFront の `Policy`、`Signature`、および `Key-Pair-Id` パラメータが除外されます。例えば、次のようになります。  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes`  
`Resource` の URL の値は 1 つだけ指定できます。  
ポリシーで、`Resource` パラメータを省略できますが、その場合、署名付き URL を持つすべてのユーザーが、署名付き URL の作成に使用するキーペアに関連付けられた*あらゆる*ディストリビューションの*すべての*ファイルにアクセスできることになります。
次の点に注意してください。  
+ **プロトコル** – 値は `http://`、`https://`、または `*://` で始まっている必要があります。
+ **クエリ文字列パラメータ** - URL にクエリ文字列パラメータがある場合は、バックスラッシュ文字 (`\`) を使用してクエリ文字列の最初の疑問符 (`?`) をエスケープします。例えば、次のようになります。

  `https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`
+ **ワイルドカード文字** – ポリシーの URL にはワイルドカード文字を使用できます。次のワイルドカード文字がサポートされています。
  + アスタリスク (`*`) は、0 個以上の文字に一致します
  + 疑問符 (`?`) は、1 つの文字に一致します

  CloudFront がポリシー内の URL を HTTP リクエスト内の URL と照合すると、ポリシー内の URL は次のように 4 つのセクション (プロトコル、ドメイン、パス、クエリ文字列) に分割されます。

  `[protocol]://[domain]/[path]\?[query string]`

  ポリシーの URL にワイルドカード文字を使用する場合、ワイルドカードマッチングはワイルドカードを含むセクションの境界内でのみ適用されます。例えば、次のようなポリシーの URL を考えてみます。

  `https://www.example.com/hello*world`

  この例では、アスタリスクワイルドカード (`*`) はパスセクション内にのみ適用されるため、URL `https://www.example.com/helloworld` や `https://www.example.com/hello-world` には一致しますが、URL `https://www.example.net/hello?world` には一致しません。

  ワイルドカードマッチングのセクションの境界には、次の例外が適用されます。
  + パスセクションの末尾にアスタリスクがある場合、クエリ文字列セクションにアスタリスクが付いていることを意味します。例えば、`http://example.com/hello*` と `http://example.com/hello*\?*` は同じです。
  + ドメインセクションの末尾にアスタリスクがある場合、パスセクションとクエリ文字列セクションの両方にアスタリスクが付いていることを意味します。例えば、`http://example.com*` と `http://example.com*/*\?*` は同じです。
  + ポリシーの URL では、プロトコルセクションを省略し、ドメインセクションをアスタリスクで始めることができます。その場合、プロトコルセクションは暗黙的にアスタリスクに設定されます。例えば、ポリシーの URL `*example.com` は `*://*example.com/` と同等です。
  + アスタリスク (`"Resource": "*"`) 単独の場合は、どの URL にも一致します。

  例えば、ポリシーの値 `https://d111111abcdef8.cloudfront.net/*game_download.zip*` は、次の URL すべてに一致します。
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **代替ドメイン名** – ポリシーの URL で代替ドメイン名 (CNAME) を指定する場合、HTTP リクエストはウェブページまたはアプリケーション内の代替ドメイン名を使用する必要があります。ポリシーのファイルの Amazon S3 URL を指定しないでください。

**DateLessThan**  
URL の有効期限切れ日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。ポリシーでは、値を引用符で囲まないでください。UTC の詳細については、「[Date and Time on the Internet: Timestamps](https://tools.ietf.org/html/rfc3339)」を参照してください。  
たとえば、UTC の 2023 年 1 月 31 日午前 10 時 00 分は、Unix 時間形式の 1675159200 に変換されます。  
これは、`Condition` セクションにおける唯一の必須パラメータです。CloudFront では、プライベートコンテンツへの永久的なアクセスがユーザーに許可されることのないよう、この値の指定が要求されます。  
詳細については、[CloudFront が署名付き URL の有効期限切れの日時を確認するタイミング](private-content-signed-urls.md#private-content-check-expiration)を参照してください。

**DateGreaterThan (オプション)**  
オプションの URL 開始日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。ユーザーは、指定された日時が過ぎるまでファイルにアクセスできません。値を引用符で囲まないでください。

**IpAddress (オプション)**  
HTTP リクエストを実行するクライアントの IP アドレス。次の点に注意してください。  
+ ファイルへのアクセスをすべての IP アドレスに許可するには、`IpAddress` パラメータを省略します。
+ IP アドレスまたは IP アドレス範囲を 1 つ指定できます。2 つの別々の範囲のどちらかにクライアントの IP アドレスが入っている場合にアクセスを許可するようなポリシーを使用することはできません。
+ 1 つの IP アドレスからのアクセスを許可するには、以下のように指定します。

  `"`*IPv4 IP アドレス*`/32"`
+ IP アドレス範囲は標準の IPv4 CIDR 形式 (`192.0.2.0/24` など) で指定する必要があります。詳細については、「[Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan](https://tools.ietf.org/html/rfc4632)」を参照してください。
**重要**  
IPv6 形式の IP アドレス (例: 2001:0db8:85a3::8a2e:0370:7334) はサポートされていません。

  `IpAddress` を含むカスタムポリシーを使用する場合、ディストリビューションで IPv6 は有効にしません。一部のコンテンツへのアクセスを IP アドレスによって制限し、他のコンテンツで IPv6 リクエストをサポートする場合、2 つのディストリビューションを作成します。詳細については、トピック「[すべてのディストリビューション設定リファレンス](distribution-web-values-specify.md)」の「[IPv6 を有効にする (ビューワーリクエスト)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6)」を参照してください。

## カスタムポリシーを使用する署名付き URL のポリシーステートメントの例


以下のポリシーステートメントの例は、特定のファイル、ディレクトリ内のすべてのファイル、またはキーペア ID に関連付けられたすべてのファイルへのアクセスを制御する方法を示しています。また、この例は、個々の IP アドレスまたは IP アドレス範囲からのアクセスを制御する方法、および指定された日時以降にユーザーが署名付き URL を使用することを禁止する方法も示しています。

これらの例のいずれかをコピーして貼り付ける場合は、すべての空白 (タブと改行文字を含む) を削除し、値を独自の値に置き換えて、右の中かっこ (`}`) の後に改行文字を含めます。

詳細については、「[カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値](#private-content-custom-policy-statement-values)」を参照してください。

**Topics**
+ [

### ポリシーステートメントの例: IP アドレス範囲から 1 つのファイルにアクセスする
](#private-content-custom-policy-statement-example-one-object)
+ [

### ポリシーステートメントの例: IP アドレス範囲からディレクトリ内のすべてのファイルにアクセスする
](#private-content-custom-policy-statement-example-all-objects)
+ [

### ポリシーステートメントの例: キーペア ID に関連付けられたすべてのファイルに 1 つの IP アドレスからアクセスする
](#private-content-custom-policy-statement-example-one-ip)

### ポリシーステートメントの例: IP アドレス範囲から 1 つのファイルにアクセスする


次の署名付き URL 内のカスタムポリシーの例では、UTC の 2023 年 1 月 31 日午前 10 時 00 分まで、範囲 `192.0.2.0/24` の IP アドレスから、ユーザーがファイル `https://d111111abcdef8.cloudfront.net/game_download.zip` にアクセスできることを指定しています。

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

### ポリシーステートメントの例: IP アドレス範囲からディレクトリ内のすべてのファイルにアクセスする


以下のカスタムポリシーの例では、`Resource` パラメータのアスタリスクワイルドカード文字 (`*`) が示すとおり、`training` ディレクトリ内のあらゆるファイルを対象とする署名付き URL を作成できます。UTC の 2023 年 1 月 31 日午前 10 時 00 分まで、範囲 `192.0.2.0/24` の IP アドレスから、ユーザーはファイルにアクセスできます。

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

このポリシーを使用する各署名付き URL には、次のように、特定のファイルを識別する URL があります。

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### ポリシーステートメントの例: キーペア ID に関連付けられたすべてのファイルに 1 つの IP アドレスからアクセスする


以下のカスタムポリシーの例では、`Resource` パラメータのアスタリスクワイルドカード文字 (`*`) が示すとおり、あらゆるディストリビューションに関連付けられたあらゆるファイルを対象とする署名付き URL を作成できます。署名付き URL には、`http://` ではなく `https://` プロトコルを使用する必要があります。ユーザーは IP アドレス `192.0.2.10/32` を使用する必要があります。(CIDR 表記の値 `192.0.2.10/32` は 1 つの IP アドレス `192.0.2.10` を参照します)。ファイルは、UTC の 2023 年 1 月 31 日午前 10 時 00 分から UTC の 2023 年 2 月 2 日午前 10 時 00 分まで使用できます。

```
{
    "Statement": [
       {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1675159200
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675332000
                }
            }
        }
    ]
}
```

このポリシーを使用する各署名付き URL には、次のように、特定の CloudFront ディストリビューション内の特定のファイルを識別する URL があります。

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

署名付き URL にはキーペア ID も含まれます。キーペア ID は、URL に指定されたディストリビューション (d111111abcdef8.cloudfront.net) 内の信頼されたキーグループに関連付けられる必要があります。

## カスタムポリシーを使用する署名付き URL の署名を作成する


カスタムポリシーを使用する署名付き URL の署名は、ハッシュ化、署名、および base64 エンコードが行われたバージョンのポリシーステートメントです。カスタムポリシーの署名を作成するには、以下の手順を実行します。

ポリシーステートメントのハッシュ化、署名、およびエンコードを行う方法の詳細および例については、以下の各資料を参照してください。
+ [Linux コマンドおよび OpenSSL を使用した Base64 エンコードおよび暗号化](private-content-linux-openssl.md)
+ [署名付き URL の署名を作成するためのコード例](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**オプション 1: カスタムポリシーを使用して署名を作成するには**

1. 「[カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには](#private-content-custom-policy-creating-policy-procedure)」の手順で作成した JSON ポリシーステートメントを、SHA-1 ハッシュ関数と生成した RSA または ECDSA プライベートキーを使用してハッシュ化し、署名します。空白は含まれていないが、まだ base64 エンコードされていないバージョンのポリシーステートメントを使用します。

   ハッシュ関数に必要なプライベートキーには、対応するパブリックキーがディストリビューション内のアクティブな信頼されたキーグループにあるものを使用してください。
**注記**  
ポリシーステートメントをハッシュ化および署名するための方法は、プログラミング言語およびプラットフォームによって異なります。サンプルコードについては、「[署名付き URL の署名を作成するためのコード例](PrivateCFSignatureCodeAndExamples.md)」を参照してください。

1. ハッシュ化および署名された文字列から、空白 (タブや改行文字を含む) を削除します。

1. MIME base64 エンコーディングを使用して文字列を Base64 エンコードします。詳細については、*RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies* の [Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) を参照してください。

1. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. 結果の値を署名付き URL の `&Signature=` の後に付加し、「[カスタムポリシーを使用して署名付き URL を作成するには](#private-content-creating-signed-url-custom-policy-procedure)」に戻って、署名付き URL の各パートの連結を終了します。