

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Diffusez du contenu privé avec des cookies signés URLs et signés
<a name="PrivateContent"></a>

De nombreuses entreprises qui distribuent du contenu via Internet veulent limiter l’accès aux documents, données professionnelles, flux multimédias ou contenus destinés à des utilisateurs sélectionnés, tels que ceux qui paient un droit. Pour diffuser en toute sécurité ce contenu privé en utilisant CloudFront, vous pouvez effectuer les opérations suivantes :
+ Exigez que vos utilisateurs accèdent à votre contenu privé en utilisant des cookies spéciaux CloudFront signés URLs ou signés. 
+ Exigez que vos utilisateurs accèdent à votre contenu en utilisant CloudFront URLs, et non URLs en accédant au contenu directement sur le serveur d'origine (par exemple, Amazon S3 ou un serveur HTTP privé). L'exiger CloudFront URLs n'est pas nécessaire, mais nous le recommandons pour empêcher les utilisateurs de contourner les restrictions que vous spécifiez dans les cookies signés URLs ou signés.

Pour de plus amples informations, veuillez consulter [Restriction de l’accès aux fichiers](private-content-overview.md).

## Comment diffuser du contenu privé
<a name="private-content-task-list"></a>

Pour configurer CloudFront afin de diffuser du contenu privé, effectuez les tâches suivantes :

1. (Facultatif mais recommandé) Demandez à vos utilisateurs d'accéder à votre contenu uniquement via CloudFront. La méthode que vos utilisez varie selon que vous recourez aux origines Amazon S3 ou aux origines personnalisées :
   + **Amazon S3** : voir [Restriction de l’accès à une origine Amazon S3](private-content-restricting-access-to-s3.md).
   + **Origine personnalisée** : voir [Restriction de l’accès à des fichiers d’origines personnalisées](private-content-overview.md#forward-custom-headers-restrict-access).

   Les origines personnalisées incluent Amazon EC2, les compartiments Amazon S3 configurés en tant que points de terminaison de site Web, Elastic Load Balancing et vos propres serveurs web HTTP.

1. Spécifiez les *groupes de clés* ou *les signataires approuvés* que vous souhaitez utiliser pour créer des cookies signés URLs ou signés. Nous vous recommandons d’utiliser des groupes de clés approuvés. Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).

1. Rédigez votre application pour répondre aux demandes des utilisateurs autorisés, soit avec des en-têtes signés, URLs soit avec `Set-Cookie` des en-têtes qui définissent des cookies signés. Suivez les étapes décrites dans l’une des rubriques suivantes : 
   + [Utiliser signé URLs](private-content-signed-urls.md)
   + [Utilisation de cookies signés](private-content-signed-cookies.md)

   En cas de doute sur la méthode à utiliser, consultez [Décidez d'utiliser des cookies signés URLs ou signés](private-content-choosing-signed-urls-cookies.md).

**Topics**
+ [

## Comment diffuser du contenu privé
](#private-content-task-list)
+ [

# Restriction de l’accès aux fichiers
](private-content-overview.md)
+ [

# Spécifiez les signataires autorisés à créer des cookies signés URLs et signés
](private-content-trusted-signers.md)
+ [

# Décidez d'utiliser des cookies signés URLs ou signés
](private-content-choosing-signed-urls-cookies.md)
+ [

# Utiliser signé URLs
](private-content-signed-urls.md)
+ [

# Utilisation de cookies signés
](private-content-signed-cookies.md)
+ [

# Utilisation d’une commande Linux et OpenSSL pour le chiffrement et l’encodage en base64
](private-content-linux-openssl.md)
+ [

# Exemples de code pour la création de la signature d’une URL signée
](PrivateCFSignatureCodeAndExamples.md)

# Restriction de l’accès aux fichiers
<a name="private-content-overview"></a>

Vous pouvez contrôler l’accès des utilisateurs à votre contenu privé de deux façons :
+ [Limitez l'accès aux fichiers dans les CloudFront caches](#private-content-overview-edge-caches).
+ Restreignez l’accès aux fichiers dans votre origine en effectuant l’une des actions suivantes :
  + [Configurez un contrôle d'accès à l'origine (OAC) pour votre compartiment Amazon S3](private-content-restricting-access-to-s3.md).
  + [Configurez des en-têtes personnalisés pour un serveur HTTP privé (origine personnalisée)](#forward-custom-headers-restrict-access).

## Restreindre l'accès aux fichiers dans les CloudFront caches
<a name="private-content-overview-edge-caches"></a>

Vous pouvez configurer CloudFront pour obliger les utilisateurs à accéder à vos fichiers à l'aide de *cookies *signés URLs* ou signés*. Vous développez ensuite votre application soit pour créer et distribuer des signatures URLs aux utilisateurs authentifiés, soit pour envoyer `Set-Cookie` des en-têtes qui définissent des cookies signés pour les utilisateurs authentifiés. (Pour permettre à quelques utilisateurs d'accéder à long terme à un petit nombre de fichiers, vous pouvez également créer des fichiers signés URLs manuellement.) 

Lorsque vous créez des cookies signés URLs ou signés pour contrôler l'accès à vos fichiers, vous pouvez définir les restrictions suivantes :
+ Une heure et une date de fin, au-delà desquelles l’URL n’est plus valide. 
+ (Facultatif) L’heure et la date auxquelles l’URL devient valide.
+ (Facultatif) L’adresse IP ou la plage d’adresses IP des ordinateurs qui peuvent être utilisés pour accéder à votre contenu. 

Une partie d’une URL signée ou d’un cookie signé est hachée et signée à l’aide de la clé privée d’une paire de clés publique/privée. Lorsqu'un utilisateur utilise une URL signée ou un cookie signé pour accéder à un fichier, CloudFront compare les parties signées et non signées de l'URL ou du cookie. S'ils ne correspondent pas, CloudFront ne diffuse pas le fichier.

Vous devez utiliser des clés privées RSA 2048 ou ECDSA 256 pour la signature ou les cookies. URLs 

## Restriction de l’accès aux fichiers dans les compartiments Amazon S3
<a name="private-content-overview-s3"></a>

Vous pouvez éventuellement sécuriser le contenu de votre compartiment Amazon S3 afin que les utilisateurs puissent y accéder via la CloudFront distribution spécifiée, mais ne puissent pas y accéder directement via Amazon S3URLs. Cela empêche quelqu'un de contourner CloudFront et d'utiliser l'URL Amazon S3 pour accéder au contenu auquel vous souhaitez restreindre l'accès. Cette étape n'est pas obligatoire pour utiliser SignedURLs, mais nous vous la recommandons.

Pour obliger les utilisateurs à accéder à votre contenu CloudFront URLs, vous devez effectuer les tâches suivantes :
+ Donnez à une autorisation de *contrôle CloudFront d'accès à l'origine* l'autorisation de lire les fichiers du compartiment S3.
+ Créez le contrôle d'accès à l'origine et associez-le à votre CloudFront distribution.
+ Supprimez l'autorisation pour toute autre personne d'utiliser Amazon S3 URLs pour lire les fichiers.

Pour plus d’informations, consultez [Restriction de l’accès à une origine Amazon S3](private-content-restricting-access-to-s3.md) ou [Restreindre l'accès à l'origine d'un point d'accès multirégional Amazon S3](private-content-restricting-access-to-s3-mrap.md).

## Restriction de l’accès à des fichiers d’origines personnalisées
<a name="forward-custom-headers-restrict-access"></a>

Si vous utilisez une origine personnalisée, vous pouvez éventuellement configurer des en-têtes personnalisés pour limiter l’accès. CloudFront Pour obtenir vos fichiers à partir d'une origine personnalisée, ceux-ci doivent être accessibles à l'CloudFront aide d'une requête HTTP (ou HTTPS) standard. Mais en utilisant des en-têtes personnalisés, vous pouvez restreindre davantage l'accès à votre contenu afin que les utilisateurs puissent y accéder uniquement par le biaisCloudFront, et non directement. Cette étape n'est pas obligatoire pour utiliser Signed URLs, mais nous vous la recommandons.

Pour obliger les utilisateurs à accéder au contenu via CloudFront, modifiez les paramètres suivants dans vos CloudFront distributions :

**Origin Custom Headers**  
Configurez CloudFront pour transférer les en-têtes personnalisés vers votre origine. Consultez [Configurer CloudFront pour ajouter des en-têtes personnalisés aux demandes d'origine](add-origin-custom-headers.md#add-origin-custom-headers-configure).

**Viewer Protocol Policy**  
Configurez votre distribution de manière à ce que les utilisateurs emploient HTTPS pour accéder à CloudFront. Consultez [Viewer Protocol Policy](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy). 

**Origin Protocol Policy**  
Configurez votre distribution CloudFront pour exiger l'utilisation du même protocole que les spectateurs pour transmettre les demandes à l'origine. Consultez [Protocole (origines personnalisées uniquement)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy). 

Après avoir apporté ces modifications, mettez à jour votre application sur votre origine personnalisée pour n'accepter que les demandes qui incluent les en-têtes personnalisés que vous avez configurés CloudFront pour envoyer.

La combinaison de la **Politique de protocole d’utilisateur** et de la **Politique de protocole d’origine** garantit que les en-têtes personnalisés sont chiffrés en transit. Cependant, nous vous recommandons de procéder régulièrement comme suit pour faire pivoter les en-têtes personnalisés qui sont CloudFront renvoyés vers votre origine :

1. Mettez à jour votre CloudFront distribution pour commencer à transférer un nouvel en-tête vers votre origine personnalisée.

1. Mettez à jour votre application pour accepter le nouvel en-tête comme confirmation de l'origine de la demande CloudFront.

1. Lorsque les demandes n'incluent plus l'en-tête que vous remplacez, mettez à jour votre application pour qu'elle n'accepte plus l'ancien en-tête comme confirmation de l'origine de la demande CloudFront.

# Spécifiez les signataires autorisés à créer des cookies signés URLs et signés
<a name="private-content-trusted-signers"></a>

**Topics**
+ [

## Choisissez entre des groupes de clés fiables (recommandé) et Comptes AWS
](#choosing-key-groups-or-AWS-accounts)
+ [

## Création de paires de clés pour vos signataires
](#private-content-creating-cloudfront-key-pairs)
+ [

## Reformatage de la clé privée (.NET et Java uniquement)
](#private-content-reformatting-private-key)
+ [

## Ajout d’un signataire à une distribution
](#private-content-adding-trusted-signers)
+ [

## Rotation de paires de clés
](#private-content-rotating-key-pairs)

Pour créer des cookies signés URLs ou signés, vous avez besoin d'un *signataire*. Un signataire est soit un groupe de clés fiables dans lequel vous créez CloudFront, soit un AWS compte contenant une paire de CloudFront clés. Nous vous recommandons d'utiliser des groupes de clés fiables avec des cookies signés URLs et signés. Pour de plus amples informations, veuillez consulter [Choisissez entre des groupes de clés fiables (recommandé) et Comptes AWS](#choosing-key-groups-or-AWS-accounts).

Le signataire a deux finalités :
+ Dès que vous ajoutez le signataire à votre distribution, CloudFront les spectateurs doivent désormais utiliser des cookies signés URLs ou signés pour accéder à vos fichiers.
+ Lorsque vous créez des cookies signés URLs ou signés, vous utilisez la clé privée de la paire de clés du signataire pour signer une partie de l'URL ou du cookie. Lorsqu'un utilisateur demande un fichier restreint, CloudFront compare la signature contenue dans l'URL ou le cookie avec l'URL ou le cookie non signé, afin de vérifier qu'il n'a pas été falsifié. CloudFront vérifie également que l'URL ou le cookie est valide, ce qui signifie, par exemple, que la date et l'heure d'expiration ne sont pas dépassées.

Lorsque vous spécifiez un signataire, vous spécifiez également indirectement les fichiers qui nécessitent des cookies signés URLs ou signés en ajoutant le signataire à un comportement de cache. Si votre distribution n'a qu'un seul comportement de cache, les utilisateurs doivent utiliser des cookies signés URLs ou signés pour accéder à tous les fichiers de la distribution. Si vous créez plusieurs comportements de cache et que vous ajoutez des signataires à certains comportements de cache et pas à d'autres, vous pouvez demander aux utilisateurs d'utiliser des cookies signés URLs ou signés pour accéder à certains fichiers et pas à d'autres.

Pour spécifier les signataires (les clés privées) autorisés à créer des cookies signés URLs ou signés, et pour ajouter les signataires à votre CloudFront distribution, effectuez les tâches suivantes :

1. Décidez si vous souhaitez utiliser un groupe de clés approuvé ou un Compte AWS en tant que signataire. Nous vous recommandons d’utiliser un groupe de clés approuvé. Pour plus d’informations, consultez [Choisissez entre des groupes de clés fiables (recommandé) et Comptes AWS](#choosing-key-groups-or-AWS-accounts).

1. Pour le signataire que vous avez choisi à l’étape 1, créez une paire de clés privées/publiques. Pour de plus amples informations, veuillez consulter [Création de paires de clés pour vos signataires](#private-content-creating-cloudfront-key-pairs).

1. Si vous utilisez .NET ou Java pour créer des cookies signés URLs ou signés, reformatez la clé privée. Pour de plus amples informations, veuillez consulter [Reformatage de la clé privée (.NET et Java uniquement)](#private-content-reformatting-private-key).

1. Dans la distribution pour laquelle vous créez des cookies signés URLs ou signés, spécifiez le signataire. Pour de plus amples informations, veuillez consulter [Ajout d’un signataire à une distribution](#private-content-adding-trusted-signers).

## Choisissez entre des groupes de clés fiables (recommandé) et Comptes AWS
<a name="choosing-key-groups-or-AWS-accounts"></a>

Pour utiliser des cookies signés URLs ou signés, vous avez besoin d'un *signataire*. Un signataire est soit un groupe de clés fiables dans lequel vous créez CloudFront, soit un groupe Compte AWS contenant une paire de CloudFront clés. Nous vous recommandons d’utiliser des groupes de clés approuvés, pour les raisons suivantes :
+ Avec les groupes de CloudFront clés, il n'est pas nécessaire d'utiliser l'utilisateur root du AWS compte pour gérer les clés publiques des cookies CloudFront signés URLs et signés. [AWS les meilleures pratiques](https://docs.aws.amazon.com/general/latest/gr/root-vs-iam.html#aws_tasks-that-require-root) recommandent de ne pas utiliser l'utilisateur root lorsque ce n'est pas nécessaire.
+ Avec les groupes de CloudFront clés, vous pouvez gérer les clés publiques, les groupes de clés et les signataires de confiance à l'aide de l' CloudFront API. Vous pouvez utiliser l’API pour automatiser la création et la rotation des clés. Lorsque vous utilisez l'utilisateur AWS root, vous devez utiliser le AWS Management Console pour gérer les paires de CloudFront clés. Vous ne pouvez donc pas automatiser le processus.
+ Comme vous pouvez gérer des groupes de clés avec l' CloudFront API, vous pouvez également utiliser des politiques d'autorisation Gestion des identités et des accès AWS (IAM) pour limiter ce que les différents utilisateurs sont autorisés à faire. Par exemple, vous pouvez autoriser les utilisateurs à télécharger des clés publiques, mais pas à les supprimer. Vous pouvez également autoriser les utilisateurs à supprimer des clés publiques, mais uniquement lorsque certaines conditions sont remplies, telles que l’utilisation d’une authentification à plusieurs facteurs, l’envoi de la demande à partir d’un réseau particulier ou dans une plage de dates et d’heures spécifiques.
+ Avec les groupes de CloudFront clés, vous pouvez associer un plus grand nombre de clés publiques à votre CloudFront distribution, ce qui vous donne plus de flexibilité dans la manière dont vous utilisez et gérez les clés publiques. Par défaut, vous pouvez associer jusqu’à quatre groupes de clés avec une seule distribution, et vous pouvez avoir jusqu’à cinq clés publiques dans un groupe de clés.

  Lorsque vous utilisez l'utilisateur root du AWS compte pour gérer les paires de CloudFront clés, vous ne pouvez avoir que deux paires de CloudFront clés actives par AWS compte.

## Création de paires de clés pour vos signataires
<a name="private-content-creating-cloudfront-key-pairs"></a>

Chaque signataire que vous utilisez pour créer des cookies CloudFront signés URLs ou signés doit posséder une paire de clés publique-privée. Le signataire utilise sa clé privée pour signer l'URL ou les cookies, et CloudFront utilise la clé publique pour vérifier la signature.

La façon dont vous créez une paire de clés varie selon que vous utilisez un groupe de clés approuvé comme signataire (recommandé) ou une paire de CloudFront clés. Pour plus d’informations, consultez les sections suivantes. La paire de clés que vous créez doit satisfaire aux exigences suivantes :
+ Il doit s’agir d’une paire de clés SSH-2 RSA 2048 ou d’une paire de clés ECDSA 256.
+ Elle doit être au format PEM codé en base64.

Pour aider à sécuriser vos applications, nous vous recommandons d’effectuer une rotation périodique des paires de clés. Pour plus d’informations, consultez [Rotation de paires de clés](#private-content-rotating-key-pairs).

### Création d’une paire de clés pour un groupe de clés approuvé (recommandé)
<a name="create-key-pair-and-key-group"></a>

Pour créer une paire de clés pour un groupe de clés approuvé, effectuez les opérations suivantes :

1. Créez la paire de clés privées/publiques.

1. Téléchargez la clé publique sur CloudFront.

1. Ajoutez la clé publique à un groupe de CloudFront clés.

Pour plus d’informations, consultez les procédures suivantes.<a name="private-content-uploading-cloudfront-public-key-procedure"></a>

**Pour créer une paire de clés**
**Note**  
Les étapes suivantes utilisent OpenSSL comme exemple d’une méthode permettant de créer une paire de clés. Il existe de nombreuses autres façons de créer une paire de clés RSA ou ECDSA.

1. Exécutez une des commandes d’exemple suivantes :
   + L’exemple de commande suivant utilise OpenSSL pour générer une paire de clés RSA d’une longueur de 2048 bits et l’enregistrer dans le fichier nommé `private_key.pem`.

     ```
     openssl genrsa -out private_key.pem 2048
     ```
   + L’exemple de commande suivant utilise OpenSSL pour générer une paire de clés ECDSA avec la courbe `prime256v1` et l’enregistrer dans le fichier nommé `private_key.pem`.

     ```
     openssl ecparam -name prime256v1 -genkey -noout -out privatekey.pem
     ```

1. Le fichier obtenu contient à la fois la clé publique et la clé privée. L’exemple de commande suivant extrait la clé publique du fichier nommé `private_key.pem`.

   ```
   openssl rsa -pubout -in private_key.pem -out public_key.pem
   ```

   Vous chargez la clé publique (dans le fichier `public_key.pem`) ultérieurement, dans le cadre de la procédure suivante.

**Pour télécharger la clé publique sur CloudFront**

1. Connectez-vous à la CloudFront console AWS Management Console et ouvrez-la à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Dans le menu de navigation, choisissez **Clés publiques**.

1. Choisissez **Créer une clé publique**.

1. Dans la fenêtre **Créer une clé publique** procédez comme suit :

   1. Dans **Nom de la clé**, saisissez un nom pour identifier la clé publique.

   1. Dans **Valeur de clé**, collez la clé publique. Si vous avez suivi les étapes de la procédure précédente, la clé publique se trouve dans le fichier nommé `public_key.pem`. Pour copier et coller le contenu de la clé publique, vous pouvez :
      + Utilisez la commande **cat** sur la ligne de commande macOS ou Linux, comme ceci :

        ```
        cat public_key.pem
        ```

        Copiez la sortie de cette commande, puis collez-la dans le champ **Valeur de clé**.
      + Ouvrez le `public_key.pem` fichier à l'aide d'un éditeur de texte brut tel que le Bloc-notes (sous Windows) ou TextEdit (sous macOS). Copiez le contenu du fichier, puis collez-le dans le champ **Valeur de clé**.

   1. (Facultatif) Dans **Commentaire**, ajoutez un commentaire pour décrire la clé publique.

   Lorsque vous avez terminé, choisissez **Ajouter**.

1. Enregistrez l’ID de clé publique. Vous l'utiliserez ultérieurement lorsque vous créerez des cookies signés URLs ou signés, comme valeur du `Key-Pair-Id` champ.

**Pour ajouter la clé publique à un groupe de clés**

1. Ouvrez la CloudFront console à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Dans le menu de navigation, choisissez **Groupes de clés**.

1. Choisissez **Ajouter un groupe de clés**.

1. Sur la page **Créer un groupe de clés** procédez comme suit :

   1. Dans **Nom du groupe de clés**, saisissez un nom pour identifier le groupe de clés.

   1. (Facultatif) Dans **Commentaire**, saisissez un commentaire pour décrire le groupe de clés.

   1. Dans **Clés publiques**, sélectionnez la clé publique à ajouter au groupe de clés, puis choisissez **Ajouter**. Répétez cette étape pour chaque clé publique que vous souhaitez ajouter au groupe de clés.

1. Choisissez **Créer une paire de clés**.

1. Enregistrez le nom du groupe de clés. Vous l'utiliserez ultérieurement pour associer le groupe de clés à un comportement de cache dans une CloudFront distribution. (Dans l' CloudFront API, vous utilisez l'ID du groupe de clés pour associer le groupe de clés à un comportement de cache.)

### Création d'une paire de CloudFront clés (non recommandé, nécessite l'utilisateur Compte AWS root)
<a name="create-key-pair-aws-account"></a>

**Important**  
Nous vous recommandons de créer une clé publique pour un groupe de clés approuvé au lieu de suivre ces étapes. Pour connaître la méthode recommandée pour créer des clés publiques pour les cookies signés URLs et signés, consultez[Création d’une paire de clés pour un groupe de clés approuvé (recommandé)](#create-key-pair-and-key-group).

Vous pouvez créer une paire de CloudFront clés de différentes manières :
+ Créez une paire de clés dans le AWS Management Console et téléchargez la clé privée. Consultez la procédure suivante.
+ Créez une paire de clés RSA à l’aide d’une application tel qu’OpenSSL, puis chargez la clé publique sur AWS Management Console. Pour plus d’informations sur la création d’une paire de clés, consultez [Création d’une paire de clés pour un groupe de clés approuvé (recommandé)](#create-key-pair-and-key-group).<a name="private-content-creating-cloudfront-key-pairs-procedure"></a>

**Pour créer des paires de CloudFront clés dans AWS Management Console**

1. Connectez-vous à l' AWS Management Console aide des informations d'identification de l'utilisateur root du AWS compte.
**Important**  
Les utilisateurs d'IAM ne peuvent pas créer de paires de CloudFront clés. Pour créer des paires de clés, vous devez vous connecter à l’aide des informations d’identification de l’utilisateur racine.

1. Choisissez le nom de votre compte, puis **Mes informations d’identification de sécurité**.

1. Choisissez **CloudFront des paires de clés**.

1. Confirmez que vous n’avez pas plus d’une paire de clés active. Vous ne pouvez pas créer une paire de clés si vous en avez déjà deux actives.

1. Choisissez **Créer une nouvelle paire de clés**.
**Note**  
Vous pouvez également choisir de créer votre propre paire de clés et de télécharger la clé publique. CloudFront les paires de clés prennent en charge les clés de 1024, 2048 ou 4096 bits.

1. Dans la boîte de dialogue **Créer une paire de clés**, choisissez **Télécharger fichier de clés privées**, puis enregistrez le fichier sur votre ordinateur.
**Important**  
Enregistrez la clé privée de votre paire de CloudFront clés dans un emplacement sécurisé et définissez des autorisations sur le fichier afin que seuls les administrateurs souhaités puissent le lire. Si quelqu'un obtient votre clé privée, il peut générer des cookies signés URLs et signés valides et télécharger votre contenu. Vous ne pouvez pas récupérer la clé privée. Par conséquent, si vous la perdez ou la supprimez, vous devez créer une nouvelle paire de CloudFront clés.

1. Enregistrez l’ID de paire de clés de votre paire de clés. (Dans le AWS Management Console, cela s'appelle l'**ID de clé d'accès**.) Vous l'utiliserez lorsque vous créerez des cookies signés URLs ou signés.

## Reformatage de la clé privée (.NET et Java uniquement)
<a name="private-content-reformatting-private-key"></a>

Si vous utilisez .NET ou Java pour créer des cookies signés URLs ou signés, vous ne pouvez pas utiliser la clé privée de votre paire de clés au format PEM par défaut pour créer la signature. Dans ce cas, procédez comme suit :
+ **.NET framework** : convertit la clé privée au format XML utilisé par .NET framework. Plusieurs outils sont disponibles.
+ **Java** : convertit la clé privée au format DER. On peut utiliser la commande OpenSSL suivante pour le faire. Dans la commande suivante, `private_key.pem` est le nom du fichier qui contient la clé privée au format PEM et `private_key.der` le nom du fichier qui contient la clé privée au format DER après l’exécution de la commande.

  ```
  openssl pkcs8 -topk8 -nocrypt -in private_key.pem -inform PEM -out private_key.der -outform DER
  ```

  Pour vous assurer que l'encodeur fonctionne correctement, ajoutez le fichier JAR pour le chiffrement Java de Bouncy Castle APIs à votre projet, puis ajoutez le fournisseur Bouncy Castle.

## Ajout d’un signataire à une distribution
<a name="private-content-adding-trusted-signers"></a>

Un signataire est le groupe de clés approuvé (recommandé) ou la paire de CloudFront clés qui peut créer des cookies signés URLs et signés pour une distribution. Pour utiliser des cookies signés URLs ou signés avec une CloudFront distribution, vous devez spécifier un signataire.

Les signataires sont associés aux comportements de cache. Cela vous permet d'exiger des cookies signés URLs ou signés pour certains fichiers et pas pour d'autres de la même distribution. Une distribution nécessite des cookies URLs ou signés uniquement pour les fichiers associés aux comportements de cache correspondants.

De même, un signataire ne peut signer URLs ou utiliser des cookies que pour les fichiers associés aux comportements de cache correspondants. Par exemple, si vous avez un signataire pour un comportement de cache et un autre signataire pour un comportement de cache différent, aucun des signataires ne peut créer de signature URLs ou de cookies pour les fichiers associés à l'autre comportement de cache.

**Important**  
Avant d’ajouter un signataire à votre distribution, procédez comme suit :  
Définissez soigneusement les modèles de chemin d’accès dans les comportements de cache et la séquence des comportements de cache de façon à ne pas donner aux utilisateurs un accès non prévu à votre contenu ou à les empêcher d’accéder à un contenu que vous voulez disponible pour tout le monde.  
Par exemple, imaginons qu’une demande corresponde au modèle de chemin de deux comportements de cache. Le premier comportement de cache ne nécessite pas de cookies signés URLs ou signés, tandis que le second comportement de cache en nécessite. Les utilisateurs pourront accéder aux fichiers sans utiliser de cookies signés URLs ou signés, car il CloudFront traite le comportement du cache associé à la première correspondance.  
Pour plus d’informations sur les modèles de chemin d’accès, consultez [Modèle de chemin](DownloadDistValuesCacheBehavior.md#DownloadDistValuesPathPattern).
Pour une distribution que vous utilisez déjà pour distribuer du contenu, assurez-vous d'être prêt à commencer à générer des cookies signés URLs et signés avant d'ajouter un signataire. Lorsque vous ajoutez un signataire, CloudFront rejette les demandes qui n'incluent pas d'URL signée ou de cookie signé valide.

Vous pouvez ajouter des signataires à votre distribution à l'aide de la CloudFront console ou de l' CloudFrontAPI.

------
#### [ Console ]

Les étapes suivantes montrent comment ajouter un groupe de clés approuvé en tant que signataire. Vous pouvez également ajouter un Compte AWS en tant que signataire de confiance, mais cela n'est pas recommandé.<a name="private-content-adding-trusted-signers-console-procedure"></a>

**Pour ajouter un signataire à une distribution à l’aide de la console**

1. Enregistrez l’ID de groupe de clés du groupe de clés que vous souhaitez utiliser en tant que signataire approuvé. Pour de plus amples informations, veuillez consulter [Création d’une paire de clés pour un groupe de clés approuvé (recommandé)](#create-key-pair-and-key-group).

1. Ouvrez la CloudFront console à l'adresse[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Choisissez la distribution dont vous souhaitez protéger les fichiers avec des cookies signés URLs ou signés.
**Note**  
Pour ajouter un signataire à une nouvelle distribution, vous spécifiez les mêmes paramètres que ceux décrits à l’étape 6 lors de la création de la distribution.

1. Choisissez l’onglet **Comportements**.

1. Sélectionnez le comportement du cache dont le modèle de chemin correspond aux fichiers que vous souhaitez protéger avec des cookies signés URLs ou signés, puis choisissez **Modifier**.

1. Sur la page **Modifier le comportement** procédez comme suit :

   1. Pour **Restreindre l'accès des spectateurs (utiliser des cookies signés URLs ou signés)**, sélectionnez **Oui**.

   1. Dans **Groupes de clés approuvés ou Signataire approuvé**, choisissez **Groupes de clés approuvés**.

   1. Dans **Groupes de clés approuvés**, choisissez le groupe de clés à ajouter, puis **Ajouter**. Recommencez si vous souhaitez ajouter plusieurs groupes de clés.

1. Choisissez **Oui, Modifier** pour mettre à jour le comportement du cache.

------
#### [ API ]

Vous pouvez utiliser l' CloudFront API pour ajouter un groupe de clés fiables en tant que signataire. Vous pouvez ajouter un signataire à une distribution existante ou à une nouvelle distribution. Dans les deux cas, spécifiez les valeurs dans l’élément `TrustedKeyGroups`.

Vous pouvez également ajouter un Compte AWS en tant que signataire de confiance, mais cela n'est pas recommandé.

Consultez les rubriques suivantes dans le manuel *Amazon CloudFront API Reference* :
+ **Mettre à jour une distribution existante** — [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)
+ **Créez une nouvelle distribution** — [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)

------

## Rotation de paires de clés
<a name="private-content-rotating-key-pairs"></a>

Nous vous recommandons de faire régulièrement pivoter (modifier) vos paires de clés pour les cookies signés URLs et signés. Pour faire pivoter les paires de clés que vous utilisez pour créer des cookies signés URLs ou signés sans les invalider URLs ou des cookies qui n'ont pas encore expiré, effectuez les tâches suivantes :

1. Créez une nouvelle paire de clés et ajoutez la clé publique à un groupe de clés. Pour plus d’informations, consultez [Création d’une paire de clés pour un groupe de clés approuvé (recommandé)](#create-key-pair-and-key-group).

1. Si vous avez créé un nouveau groupe de clés à l’étape précédente, [ajoutez le groupe de clés à la distribution en tant que signataire](#private-content-adding-trusted-signers).
**Important**  
Ne supprimez pas encore des clés publiques existantes du groupe de clés, ni les groupes de clés de la distribution. Ajoutez seulement les nouveaux.

1. Mettez à jour votre application pour créer des signatures à l’aide des clés privées à partir de la nouvelle paire de clés. Vérifiez que les cookies signés URLs ou signés avec les nouvelles clés privées fonctionnent.

1. Attendez que la date d'expiration soit passée URLs ou que les cookies aient été signés à l'aide de la clé privée précédente. Ensuite, supprimez l’ancienne clé publique du groupe de clés. Si vous avez créé un nouveau groupe de clés à l’étape 2, supprimez l’ancien groupe de clés de votre distribution.

# Décidez d'utiliser des cookies signés URLs ou signés
<a name="private-content-choosing-signed-urls-cookies"></a>

CloudFront les cookies signés URLs et signés fournissent les mêmes fonctionnalités de base : ils vous permettent de contrôler qui peut accéder à votre contenu. Si vous souhaitez diffuser du contenu privé CloudFront et que vous essayez de décider d'utiliser des cookies signés URLs ou signés, considérez ce qui suit.

Utilisez URLs Signed dans les cas suivants :
+ Vous voulez restreindre l’accès aux fichiers individuels : par exemple, un téléchargement d’installation de votre application.
+ Vos utilisateurs utilisent un client (par exemple, un client HTTP personnalisé) qui ne prend pas en charge les cookies.

Utilisez les cookies signés dans les cas suivants :
+ Vous voulez fournir l’accès à plusieurs fichiers restreints : par exemple, tous les fichiers d’une vidéo au format HLS ou tous les fichiers de la section des abonnés d’un site web.
+ Vous ne voulez pas modifier votre compte actuel URLs.

Si vous n'utilisez pas de cookies signés actuellement URLs, et si votre (non signé) URLs contient l'un des paramètres de chaîne de requête suivants, vous ne pouvez pas utiliser de cookies signés URLs ou signés :
+ `Expires`
+ `Policy`
+ `Signature`
+ `Key-Pair-Id`
+ `Hash-Algorithm`

CloudFront suppose que ceux URLs qui contiennent l'un de ces paramètres de chaîne de requête sont signés URLs et ne regarderont donc pas les cookies signés.

## Utiliser à la fois des cookies signés URLs et des cookies signés
<a name="private-content-using-signed-urls-and-cookies"></a>

Les cookies URLs signés ont priorité sur les cookies signés. Si vous utilisez à la fois des cookies signés URLs et signés pour contrôler l'accès aux mêmes fichiers et qu'un utilisateur utilise une URL signée pour demander un fichier, CloudFront détermine s'il convient de renvoyer le fichier au lecteur en se basant uniquement sur l'URL signée.

# Utiliser signé URLs
<a name="private-content-signed-urls"></a>

Une URL signée inclut des informations supplémentaires, par exemple une heure et date d’expiration, qui vous donnent un meilleur contrôle de l’accès à votre contenu. Ces informations supplémentaires apparaissent dans une déclaration de politique, basée sur une politique prédéfinie ou une politique personnalisée. Les différences entre les politiques prédéfinies et les politiques personnalisées sont expliquées dans les deux prochaines sections.

**Note**  
Vous pouvez en créer des signatures à URLs l'aide de politiques prédéfinies et en créer d'autres signées URLs à l'aide de politiques personnalisées pour la même distribution.

**Topics**
+ [

## Décidez d'utiliser des politiques prédéfinies ou personnalisées pour les documents signés URLs
](#private-content-choosing-canned-custom-policy)
+ [

## Comment URLs fonctionnent les signatures
](#private-content-how-signed-urls-work)
+ [

## Décidez de la durée de validité URLs des signatures
](#private-content-overview-choosing-duration)
+ [

## Quand CloudFront vérifie la date et l'heure d'expiration dans une URL signée
](#private-content-check-expiration)
+ [

## Exemple de code et outils tiers
](#private-content-overview-sample-code)
+ [

# Création d’une URL signée à l’aide d’une politique prédéfinie
](private-content-creating-signed-url-canned-policy.md)
+ [

# Création d’une URL signée utilisant une politique personnalisée
](private-content-creating-signed-url-custom-policy.md)

## Décidez d'utiliser des politiques prédéfinies ou personnalisées pour les documents signés URLs
<a name="private-content-choosing-canned-custom-policy"></a>

Lorsque vous créez une URL signée, vous écrivez une instruction de politique au format JSON qui spécifie les restrictions sur l’URL signée : par exemple, la durée de validité de l’URL. Vous pouvez utiliser une politique prédéfinie ou une politique personnalisée. Comparaison des politiques prédéfinies et des politiques personnalisées :


****  

| Description | Politique prédéfinie | Politique personnalisée | 
| --- | --- | --- | 
| Vous pouvez réutiliser la déclaration de politique pour plusieurs fichiers. Pour ce faire, vous devez utiliser les caractères génériques de l’objet `Resource`. Pour plus d’informations, consultez [Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique personnalisée](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-statement-values).)  | Non | Oui | 
| Vous pouvez indiquer la date et l’heure auxquelles les utilisateurs peuvent commencer à accéder à votre contenu. | Non | Oui (facultatif) | 
| Vous pouvez indiquer la date et l’heure auxquelles les utilisateurs ne peuvent plus accéder à votre contenu. | Oui | Oui | 
| Vous pouvez spécifier l’adresse IP ou la plage d’adresses IP des utilisateurs qui peuvent accéder à votre contenu. | Non | Oui (facultatif) | 
| L’URL signée inclut une version encodée base 64 de la politique, ce qui se traduit par une URL plus longue. | Non | Oui | 

Pour plus d'informations sur la création de documents signés URLs à l'aide *d'une politique prédéfinie*, consultez[Création d’une URL signée à l’aide d’une politique prédéfinie](private-content-creating-signed-url-canned-policy.md).

Pour plus d'informations sur la création de documents signés URLs à l'aide d'une politique *personnalisée*, consultez[Création d’une URL signée utilisant une politique personnalisée](private-content-creating-signed-url-custom-policy.md).

## Comment URLs fonctionnent les signatures
<a name="private-content-how-signed-urls-work"></a>

Voici un aperçu de la façon dont vous configurez CloudFront Amazon S3 pour les fichiers signés URLs et de la manière dont il CloudFront répond lorsqu'un utilisateur utilise une URL signée pour demander un fichier. 

1. Dans votre CloudFront distribution, spécifiez un ou plusieurs groupes de clés fiables, qui contiennent les clés publiques CloudFront pouvant être utilisées pour vérifier la signature de l'URL. Vous utilisez les clés privées correspondantes pour signer le URLs.

   CloudFront prend en charge les signatures de clé signées URLs avec RSA 2048 et ECDSA 256.

   Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).

1. Développez votre application pour déterminer si un utilisateur doit avoir accès à votre contenu et pour créer des signatures URLs pour les fichiers ou les parties de votre application auxquels vous souhaitez restreindre l'accès. Pour plus d’informations, consultez les rubriques suivantes :
   + [Création d’une URL signée à l’aide d’une politique prédéfinie](private-content-creating-signed-url-canned-policy.md)
   + [Création d’une URL signée utilisant une politique personnalisée](private-content-creating-signed-url-custom-policy.md)

1. Un utilisateur demande un fichier dont vous souhaitez demander la signature URLs.

1. Votre application vérifie que l’utilisateur est autorisé à accéder au fichier : il est abonné, il a payé pour accéder au contenu ou il a satisfait à quelque autre condition pour accéder.

1. Votre application crée et renvoie une URL signée à l’utilisateur.

1. L’URL signée autorise l’utilisateur à télécharger ou diffuser le contenu.

   Cette étape est automatique ; l’utilisateur n’a généralement rien à faire de plus pour accéder au contenu. Pa exemple, si un utilisateur accède à votre contenu dans un navigateur web, votre application renvoie l’URL signée au navigateur. Le navigateur utilise immédiatement l'URL signée pour accéder au fichier dans le cache CloudFront périphérique sans aucune intervention de l'utilisateur.

1. CloudFront utilise la clé publique pour valider la signature et confirmer que l'URL n'a pas été falsifiée. Si la signature n’est pas valide, la demande est rejetée. 

   Si la signature est valide, CloudFront examine la déclaration de politique contenue dans l'URL (ou en crée une si vous utilisez une politique prédéfinie) pour confirmer que la demande est toujours valide. Par exemple, si vous avez spécifié une date et une heure de début et de fin pour l'URL, cela CloudFront confirme que l'utilisateur essaie d'accéder à votre contenu pendant la période pendant laquelle vous souhaitez autoriser l'accès. 

   Si la demande répond aux exigences de la déclaration de politique, CloudFront effectue les opérations standard : détermine si le fichier se trouve déjà dans le cache périphérique, transmet la demande à l'origine si nécessaire et renvoie le fichier à l'utilisateur.

**Note**  
Si une URL non signée contient des paramètres de chaîne de requête, assurez-vous de les inclure dans la partie de l’URL que vous signez. Si vous ajoutez une chaîne de requête à une URL signée après l’avoir signée, l’URL renvoie un code d’état HTTP 403.

## Décidez de la durée de validité URLs des signatures
<a name="private-content-overview-choosing-duration"></a>

Vous pouvez distribuer le contenu privé à l’aide d’une URL signée qui est valide pendant une brève durée, de quelques minutes au plus. Les URLs signatures valides pour une période aussi courte sont utiles pour distribuer du contenu on-the-fly à un utilisateur dans un but précis, comme la location de films ou le téléchargement de musique aux clients à la demande. Si vos signatures URLs ne sont valides que pour une courte période, vous souhaiterez probablement les générer automatiquement à l'aide d'une application que vous développez. Lorsque l'utilisateur commence à télécharger un fichier ou à lire un fichier multimédia, CloudFront compare le délai d'expiration indiqué dans l'URL avec l'heure actuelle pour déterminer si l'URL est toujours valide.

Vous pouvez aussi distribuer le contenu privé à l’aide d’une URL signée qui est valide pour une durée plus longue, quelques années peut-être. Les documents signés URLs dont la durée de validité est plus longue sont utiles pour distribuer du contenu privé à des utilisateurs connus, comme la distribution d'un plan d'affaires aux investisseurs ou la distribution de matériel de formation aux employés. Vous pouvez développer une application pour générer ces documents signés à long terme URLs pour vous.

## Quand CloudFront vérifie la date et l'heure d'expiration dans une URL signée
<a name="private-content-check-expiration"></a>

CloudFront vérifie la date et l'heure d'expiration d'une URL signée au moment de la requête HTTP. Si un client commence à télécharger un fichier volumineux immédiatement avant la date d’expiration, le téléchargement se termine même si la date d’expiration intervient pendant le téléchargement. Si la connexion TCP cesse et que le client essaie de redémarrer le téléchargement une fois la date d’expiration passée, le téléchargement échoue.

Si un client utilise Range GETs pour obtenir un fichier en petits morceaux, toute requête GET exécutée après l'expiration du délai d'expiration échouera. Pour plus d'informations sur RangeGETs, consultez[Comment CloudFront traite les demandes partielles pour un objet (plage GETs)](RangeGETs.md).

## Exemple de code et outils tiers
<a name="private-content-overview-sample-code"></a>

Pour un exemple de code qui crée la partie hachée et signée de signed URLs, consultez les rubriques suivantes :
+ [Créer une signature d’URL avec Perl](CreateURLPerl.md)
+ [Créer une signature d’URL avec PHP](CreateURL_PHP.md)
+ [Créer une signature d’URL avec C\$1 et .NET Framework](CreateSignatureInCSharp.md)
+ [Créer une signature d’URL avec Java](CFPrivateDistJavaDevelopment.md)

# Création d’une URL signée à l’aide d’une politique prédéfinie
<a name="private-content-creating-signed-url-canned-policy"></a>

Pour créer une URL signée à l’aide d’une politique prédéfinie, procédez comme suit.<a name="private-content-creating-signed-url-canned-policy-procedure"></a>

**Pour créer une URL signée à l’aide d’une politique prédéfinie**

1. Si vous utilisez .NET ou Java pour créer des fichiers signés URLs, et si vous n'avez pas reformaté la clé privée de votre paire de clés du format .pem par défaut à un format compatible avec .NET ou Java, faites-le maintenant. Pour de plus amples informations, veuillez consulter [Reformatage de la clé privée (.NET et Java uniquement)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Concaténez les valeurs suivantes. Vous pouvez utiliser le format dans cet exemple d’URL signée. 

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

   Supprimez tous les espaces vides (tabulations et sauts de ligne inclus). Il se peut que vous ayez à inclure des caractères d’échappement dans la chaîne du code d’application. Toutes les valeurs ont le type `String`.  
**1. *Base URL for the file***  
L'URL de base est l' CloudFront URL que vous utiliseriez pour accéder au fichier si vous n'utilisiez pas Signed URLs, y compris vos propres paramètres de chaîne de requête, le cas échéant. Dans l’exemple précédent, l’URL de base est `https://d111111abcdef8.cloudfront.net/image.jpg`. Pour plus d'informations sur le format de URLs pour les distributions, consultez[Personnalisez le format d'URL pour les fichiers dans CloudFront](LinkFormat.md).  
   + L' CloudFront URL suivante concerne un fichier image dans une distribution (en utilisant le nom de CloudFront domaine). Notez que `image.jpg` se trouve dans un répertoire `images`. Le chemin d’accès au fichier de l’URL doit correspondre à celui du fichier de votre serveur HTTP ou de votre compartiment Amazon S3.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + L' CloudFront URL suivante inclut une chaîne de requête :

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Les informations suivantes CloudFront URLs concernent les fichiers image d'une distribution. Les deux utilisent un nom de domaine alternatif. La seconde inclut une chaîne de requête :

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

     `https://www.example.com/images/image.jpg?color=red`
   + L' CloudFront URL suivante concerne un fichier image d'une distribution qui utilise un autre nom de domaine et le protocole HTTPS :

     `https://www.example.com/images/image.jpg`  
** 2. `?`**  
Le `?` indique que les paramètres de requête suivent l’URL de base. Incluez le `?` même si vous ne spécifiez aucun paramètre de requête.  
Vous pouvez spécifier les paramètres de requête suivants dans n’importe quel ordre.  
**3. *Your query string parameters, if any*`&`**  
(Facultatif) Vous pouvez entrer vos propres paramètres de chaîne de requête. Pour ce faire, ajoutez une esperluette (`&`) entre chaque valeur, par exemple. `color=red&size=medium`. Vous pouvez spécifier les paramètres de chaîne de requête dans n’importe quel ordre dans l’URL.  
Les paramètres de votre chaîne de requête ne peuvent pas être nommés `Expires``Signature`,`Key-Pair-Id`, ou`Hash-Algorithm`.  
** 4. `Expires=`*date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC)***  
Date et heure auxquelles vous souhaitez que l’URL cesse d’autoriser l’accès au fichier.  
Spécifiez la date et l’heure d’expiration au format horaire Unix (en secondes) et en heure UTC. Par exemple, le 1er janvier 2026 à 10:00 UTC correspond à `1767290400` au format d’heure Unix, comme indiqué dans l’exemple au début de cette rubrique.   
Pour utiliser l’heure époque, indiquez un entier 64 bits correspondant à une date qui ne dépasse pas `9223372036854775807` (vendredi 11 avril 2262 à 23:47:16.854 UTC).  
  
Pour plus d’informations sur l’UTC, consultez [RFC 3339, Date et heure sur Internet : Horodatages](https://tools.ietf.org/html/rfc3339).  
** 5. `&Signature=`*hashed and signed version of the policy statement***  
Version hachée, signée et encodée en base 64 de la déclaration de politique JSON. Pour de plus amples informations, veuillez consulter [Création d’une signature pour une URL signée qui utilise une politique prédéfinie](#private-content-canned-policy-creating-signature).  
** 6. `&Key-Pair-Id=`*public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature***  
L'ID d'une clé CloudFront publique, par exemple,`K2JCJMDEHXQW5F`. L'ID de clé publique indique CloudFront la clé publique à utiliser pour valider l'URL signée. CloudFront compare les informations de la signature avec celles de la déclaration de politique pour vérifier que l'URL n'a pas été falsifiée.  
Cette clé publique doit appartenir à un groupe de clés qui est un signataire approuvé dans la distribution. Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).  
** 7. `&Hash-Algorithm=`*SHA1 or SHA256***  
(Facultatif) L'algorithme de hachage utilisé pour créer la signature. Les valeurs prises en charge sont `SHA1` et `SHA256`. Si vous ne spécifiez pas ce paramètre, la CloudFront valeur par défaut est. `SHA1`

## Création d’une signature pour une URL signée qui utilise une politique prédéfinie
<a name="private-content-canned-policy-creating-signature"></a>

Pour créer la signature pour une URL signée qui utilise une politique prédéfinie, suivez les procédures suivantes.

**Topics**
+ [

### Création d’une déclaration de politique pour une URL signée qui utilise une politique prédéfinie
](#private-content-canned-policy-creating-policy-statement)
+ [

### Création d’une signature pour une URL signée qui utilise une politique prédéfinie
](#private-content-canned-policy-signing-policy-statement)

### Création d’une déclaration de politique pour une URL signée qui utilise une politique prédéfinie
<a name="private-content-canned-policy-creating-policy-statement"></a>

Lorsque vous créez une URL signée avec une politique prédéfinie, le paramètre `Signature` est une version hachée et signée d’une déclaration de politique. Pour les signataires URLs qui utilisent une politique prédéfinie, vous n'incluez pas la déclaration de politique dans l'URL, comme c'est le cas pour les signataires URLs qui utilisent une politique personnalisée. Pour créer la déclaration de politique, effectuez la procédure suivante.<a name="private-content-canned-policy-creating-policy-statement-procedure"></a>

**Pour créer la déclaration de politique d’une URL signée qui utilise une politique prédéfinie**

1. Construisez la déclaration de politique à l’aide du format JSON suivant et de l’encodage de caractères UTF-8. Incluez la ponctuation et les autres valeurs littérales exactement comme spécifié. Pour plus d’informations sur les paramètres `Resource` et `DateLessThan`, consultez [Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique prédéfinie](#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. Supprimez tous les espaces vides (tabulations et sauts de ligne inclus) de la déclaration de politique. Il se peut que vous ayez à inclure des caractères d’échappement dans la chaîne du code d’application.

#### Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique prédéfinie
<a name="private-content-canned-policy-statement-values"></a>

Lorsque vous créez une déclaration de politique pour une politique prédéfinie, vous spécifiez les valeurs suivantes.

**Ressource**  
Vous ne pouvez spécifier qu’une seule valeur pour `Resource`.
L'URL de base, y compris vos chaînes de requête, le cas échéant, mais à l'exclusion des `Hash-Algorithm` paramètres CloudFront `Expires` `Signature``Key-Pair-Id`,,, et, par exemple :  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Notez ce qui suit :  
+ **Protocole** : la valeur doit commencer par `http://` ou `https://`.
+ **Paramètres de chaîne de requête** : si vous n’avez aucun paramètre de chaîne de requête, omettez le point d’interrogation.
+ **Noms de domaine alternatifs** : si vous spécifiez un nom de domaine alternatif (CNAME) dans l’URL, vous devez le spécifier lorsque vous référencez le fichier dans votre page ou application web. Ne spécifiez pas l’URL Amazon S3 pour l’objet.

**DateLessThan**  
Date et heure d’expiration de l’URL au format horaire Unix (en secondes) et en heure UTC. Par exemple, le 1er janvier 2026 à 10 h UTC est converti en 1767290400 au format horaire Unix.  
Cette valeur doit correspondre à la valeur du paramètre de la chaîne de requête `Expires` de l’URL signée. N’entourez pas la valeur de points d’interrogation.  
Pour plus d’informations, consultez [Quand CloudFront vérifie la date et l'heure d'expiration dans une URL signée](private-content-signed-urls.md#private-content-check-expiration).

#### Exemple d’une déclaration de politique pour une URL signée qui utilise une politique prédéfinie
<a name="private-content-canned-policy-creating-policy-statement-example"></a>

Lorsque vous utilisez l'exemple de déclaration de politique suivant dans une URL signée, un utilisateur peut accéder au fichier `https://d111111abcdef8.cloudfront.net/horizon.jpg` jusqu'au 1er janvier 2026 à 10 h UTC :

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

### Création d’une signature pour une URL signée qui utilise une politique prédéfinie
<a name="private-content-canned-policy-signing-policy-statement"></a>

Pour créer la valeur du paramètre `Signature` d’une URL signée, vous hachez et signez la déclaration de politique que vous avez créée dans [Création d’une déclaration de politique pour une URL signée qui utilise une politique prédéfinie](#private-content-canned-policy-creating-policy-statement).

Pour plus d’informations et d’exemples sur la façon de hacher, signer et encoder la déclaration de politique, consultez :
+ [Utilisation d’une commande Linux et OpenSSL pour le chiffrement et l’encodage en base64](private-content-linux-openssl.md)
+ [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md)

**Note**  
Les exemples liés utilisent SHA-1 par défaut. Pour utiliser SHA-256 à la place, remplacez `sha1` par `sha256` dans les commandes OpenSSL et incluez le paramètre de `Hash-Algorithm=SHA256` requête dans l'URL signée.<a name="private-content-canned-policy-creating-signature-download-procedure"></a>

**Option 1 : Créer une signature à l’aide d’une politique prédéfinie**

1. Utilisez la fonction de hachage SHA-1 ou SHA-256 et la clé privée RSA ou ECDSA générée pour hacher et signer la déclaration de politique que vous avez créée dans le cadre de la procédure. [Pour créer la déclaration de politique d’une URL signée qui utilise une politique prédéfinie](#private-content-canned-policy-creating-policy-statement-procedure) Utilisez la version de la déclaration de politique qui n’inclut plus d’espaces vides.

   Si vous utilisez SHA-256, vous devez l'inclure `&Hash-Algorithm=SHA256` dans l'URL signée.

   Pour la clé privée requise par la fonction de hachage, utilisez une clé privée dont la clé publique se trouve dans un groupe de clés approuvé actif pour la distribution.
**Note**  
La méthode que vous utilisez pour hacher et signer la déclaration de politique dépend du langage de programmation et de la plateforme. Pour un exemple de code, consultez [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md).

1. Supprimez les espaces vides (tabulations et sauts de ligne inclus) de la chaîne hachée et signée.

1. Encodez en base64 la chaîne à l’aide de l’encodage MIME base64. Pour plus d'informations, consultez [la Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) dans la *RFC 2045, MIME (extensions de messagerie Internet polyvalentes), première partie : Format des* corps de messages Internet.

1. Remplacez les caractères non valides d’une chaîne de requête d’URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html)

1. Ajoutez la valeur obtenue à votre URL signée après `&Signature=`, et retournez à [Pour créer une URL signée à l’aide d’une politique prédéfinie](#private-content-creating-signed-url-canned-policy-procedure) pour terminer la concaténation des parties de votre URL signée.

# Création d’une URL signée utilisant une politique personnalisée
<a name="private-content-creating-signed-url-custom-policy"></a>

Pour créer une URL signée utilisant une politique personnalisée, suivez la procédure suivante.<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**Pour créer une URL signée utilisant une politique personnalisée**

1. Si vous utilisez .NET ou Java pour créer des fichiers signés URLs, et si vous n'avez pas reformaté la clé privée de votre paire de clés du format .pem par défaut à un format compatible avec .NET ou Java, faites-le maintenant. Pour de plus amples informations, veuillez consulter [Reformatage de la clé privée (.NET et Java uniquement)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Concaténez les valeurs suivantes. Vous pouvez utiliser le format dans cet exemple d’URL signée.

   

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

   Supprimez tous les espaces vides (tabulations et sauts de ligne inclus). Il se peut que vous ayez à inclure des caractères d’échappement dans la chaîne du code d’application. Toutes les valeurs ont le type `String`.  
**1. *Base URL for the file***  
L'URL de base est l' CloudFront URL que vous utiliseriez pour accéder au fichier si vous n'utilisiez pas Signed URLs, y compris vos propres paramètres de chaîne de requête, le cas échéant. Dans l’exemple précédent, l’URL de base est `https://d111111abcdef8.cloudfront.net/image.jpg`. Pour plus d'informations sur le format de URLs pour les distributions, consultez[Personnalisez le format d'URL pour les fichiers dans CloudFront](LinkFormat.md).  
Les exemples suivants affichent les valeurs que vous spécifiez pour les distributions.  
   + L' CloudFront URL suivante concerne un fichier image dans une distribution (en utilisant le nom de CloudFront domaine). Notez que `image.jpg` se trouve dans un répertoire `images`. Le chemin d’accès au fichier de l’URL doit correspondre à celui du fichier de votre serveur HTTP ou de votre compartiment Amazon S3.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + L' CloudFront URL suivante inclut une chaîne de requête :

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Les informations suivantes CloudFront URLs concernent les fichiers image d'une distribution. Les deux utilisent un nom de domaine alternatif ; le second inclut une chaîne de requête :

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

     `https://www.example.com/images/image.jpg?color=red`
   + L' CloudFront URL suivante concerne un fichier image d'une distribution qui utilise un autre nom de domaine et le protocole HTTPS :

     `https://www.example.com/images/image.jpg`  
**2. `?`**  
Le `?` indique que les paramètres de chaîne de requête suivent l’URL de base. Incluez le `?` même si vous ne spécifiez aucun paramètre de requête.  
Vous pouvez spécifier les paramètres de requête suivants dans n’importe quel ordre.  
**3. *Your query string parameters, if any*`&`**  
(Facultatif) Vous pouvez entrer vos propres paramètres de chaîne de requête. Pour ce faire, ajoutez une esperluette (&) entre chaque valeur, par exemple. `color=red&size=medium`. Vous pouvez spécifier les paramètres de chaîne de requête dans n’importe quel ordre dans l’URL.  
Les paramètres de votre chaîne de requête ne peuvent pas être nommés `Policy``Signature`,`Key-Pair-Id`, ou`Hash-Algorithm`.
Si vous ajoutez vos propres paramètres, ajoutez un `&` après chacun d’eux, y compris le dernier.   
**4. `Policy=`*base64 encoded version of policy statement***  
Votre déclaration de politique au format JSON, avec suppression des espaces vide, puis encodage en base64. Pour de plus amples informations, veuillez consulter [Création d’une déclaration de politique pour une URL signée qui utilise une politique personnalisée](#private-content-custom-policy-statement).  
La déclaration de politique contrôle l’accès accordé par une URL signée à un utilisateur. Elle inclut l’URL du fichier, une date et une heure d’expiration, une date et une heure (facultatif) auxquelles l’URL devient valide et une adresse IP (facultatif) ou une plage d’adresses IP autorisées à accéder au fichier.  
**5. `&Signature=`*hashed and signed version of the policy statement***  
Version hachée, signée et encodée en base 64 de la déclaration de politique JSON. Pour de plus amples informations, veuillez consulter [Création d’une signature pour une URL signée qui utilise une politique personnalisée](#private-content-custom-policy-creating-signature).  
**6. `&Key-Pair-Id=`*public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature***  
L'ID d'une clé CloudFront publique, par exemple,`K2JCJMDEHXQW5F`. L'ID de clé publique indique CloudFront la clé publique à utiliser pour valider l'URL signée. CloudFrontcompare les informations de la signature avec celles de la déclaration de politique pour vérifier que l'URL n'a pas été falsifiée.  
Cette clé publique doit appartenir à un groupe de clés qui est un signataire approuvé dans la distribution. Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).  
**7. `&Hash-Algorithm=`*SHA1 or SHA256***  
(Facultatif) L'algorithme de hachage utilisé pour créer la signature. Les valeurs prises en charge sont `SHA1` et `SHA256`. Si vous ne spécifiez pas ce paramètre, la CloudFront valeur par défaut est. `SHA1`

## Création d’une déclaration de politique pour une URL signée qui utilise une politique personnalisée
<a name="private-content-custom-policy-statement"></a>

Effectuez la procédure suivante pour créer une déclaration de politique pour une URL signée qui utilise une politique personnalisée.

Pour obtenir des exemples de déclaration de politique qui contrôlent l’accès aux fichiers de différentes façons, consultez [Exemple d’une déclaration de politique pour une URL signée qui utilise une politique personnalisée](#private-content-custom-policy-statement-examples).<a name="private-content-custom-policy-creating-policy-procedure"></a>

**Pour créer la déclaration de politique d’une URL signée qui utilise une politique personnalisée**

1. Construisez la déclaration de politique à l’aide du format JSON suivant. Remplacez les symboles inférieur à (`<`) et supérieur à (`>`), ainsi que les descriptions qu'ils contiennent, par vos propres valeurs. Pour de plus amples informations, veuillez consulter [Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique personnalisée](#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>"
                   }
               }
           }
       ]
   }
   ```

   Notez ce qui suit :
   + Vous pouvez inclure une seule déclaration dans cette politique.
   + Utilisez l’encodage de caractères UTF-8.
   + Incluez la ponctuation et les noms de paramètre exactement comme spécifié. Les abréviations ne sont pas acceptées pour les noms de paramètre.
   + L’ordre des paramètres de la section `Condition` n’importe pas.
   + Pour plus d’informations sur les valeurs de `Resource`, `DateLessThan`, `DateGreaterThan` et `IpAddress`, consultez [Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique personnalisée](#private-content-custom-policy-statement-values).

1. Supprimez tous les espaces vides (tabulations et sauts de ligne inclus) de la déclaration de politique. Il se peut que vous ayez à inclure des caractères d’échappement dans la chaîne du code d’application.

1. Encodez en base64 la déclaration de politique à l’aide de l’encodage MIME base64. Pour plus d'informations, consultez [la Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) dans la *RFC 2045, MIME (extensions de messagerie Internet polyvalentes), première partie : Format des* corps de messages Internet.

1. Remplacez les caractères non valides d’une chaîne de requête d’URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Ajoutez la valeur obtenue à votre URL signée après `Policy=`.

1. Créez une signature pour l’URL signée en hachant, signant et encodant en base64 la déclaration de politique. Pour de plus amples informations, veuillez consulter [Création d’une signature pour une URL signée qui utilise une politique personnalisée](#private-content-custom-policy-creating-signature).

### Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique personnalisée
<a name="private-content-custom-policy-statement-values"></a>

Lorsque vous créez une déclaration de politique pour une politique personnalisée, vous spécifiez les valeurs suivantes.

**Ressource**  
L'URL, y compris les chaînes de requête, à l'exclusion des `Hash-Algorithm` paramètres CloudFront `Policy` `Signature``Key-Pair-Id`,, et. Par exemple :  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes`  
Vous ne pouvez spécifier qu’une seule valeur d'URL pour `Resource`.  
Vous pouvez omettre le paramètre `Resource` dans une politique, mais cela signifie que toute personne disposant de l'URL signée peut accéder à *tous* les fichiers de *toute* distribution associée à cette paire de clés que vous utilisez pour créer l'URL signée.
Notez ce qui suit :  
+ **Protocole** : la valeur doit commencer par `http://`, `https://` ou `*://`.
+ **Paramètres de chaîne de requête** : si l'URL contient des paramètres de chaîne de requête, n'utilisez pas de barre oblique inverse (`\`) pour échapper au point d'interrogation (`?`) qui commence la chaîne de requête. Par exemple :

  `https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`
+ **Caractères génériques** : vous pouvez utiliser des caractères génériques dans l'URL de la politique. Les caractères génériques suivants sont pris en charge :
  + astérisque (`*`), qui correspond à zéro, un ou plusieurs caractères
  + point d'interrogation (`?`), qui correspond à un et un seul caractère

  Lorsque l'URL de la politique CloudFront correspond à celle de la requête HTTP, l'URL de la politique est divisée en quatre sections (protocole, domaine, chemin et chaîne de requête) comme suit :

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

  Lorsque vous utilisez un caractère générique dans l'URL de la politique, la correspondance avec le caractère générique s'applique uniquement dans les limites de la section qui contient ce caractère générique. Par exemple, envisagez l'URL suivante dans une politique :

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

  Dans cet exemple, le caractère générique astérisque (`*`) ne s'applique que dans la section du chemin, il correspond donc au URLs `https://www.example.com/helloworld` et`https://www.example.com/hello-world`, mais pas à l'URL. `https://www.example.net/hello?world`

  Les exceptions suivantes s'appliquent aux limites des sections pour la mise en correspondance des caractères génériques :
  + La présence d'un astérisque à la fin de la section de chemin implique un astérisque dans la section de la chaîne de requête. Par exemple, `http://example.com/hello*` équivaut à `http://example.com/hello*\?*`.
  + La présence d'un astérisque à la fin de la section de domaine implique un astérisque dans les sections de chemin et de chaîne de requête. Par exemple, `http://example.com*` équivaut à `http://example.com*/*\?*`.
  + Une URL figurant dans la politique peut omettre la section de protocole et commencer par un astérisque dans la section de domaine. Dans ce cas, la section de protocole est implicitement définie sur un astérisque. Par exemple, l'URL `*example.com` d'une politique est équivalente à `*://*example.com/`.
  + Un astérisque à lui seul (`"Resource": "*"`) correspond à n'importe quelle URL.

  Par exemple, la valeur : `https://d111111abcdef8.cloudfront.net/*game_download.zip*` dans une politique correspond à toutes les valeurs suivantes URLs :
  + `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`
+ **Autres noms de domaine** : si vous spécifiez un nom de domaine alternatif (CNAME) dans l’URL de la politique, la requête HTTP doit utiliser ce nom de domaine alternatif dans votre page ou application Web. Ne spécifiez pas l’URL Amazon S3 pour le fichier dans une politique.

**DateLessThan**  
Date et heure d’expiration de l’URL au format horaire Unix (en secondes) et en heure UTC. Dans la politique, n’entourez pas la valeur avec des points d’interrogation. Pour plus d’informations sur l’UTC, consultez [Date et heure sur Internet : Horodatages](https://tools.ietf.org/html/rfc3339).  
Par exemple, l'horodatage 31 janvier 2023 10 h 00 UTC est converti en 1675159200 au format horaire Unix.  
Il s'agit du seul paramètre obligatoire dans `Condition` cette section. CloudFront nécessite cette valeur pour empêcher les utilisateurs d'avoir un accès permanent à votre contenu privé.  
Pour de plus amples informations, consultez [Quand CloudFront vérifie la date et l'heure d'expiration dans une URL signée](private-content-signed-urls.md#private-content-check-expiration).

**DateGreaterThan (Facultatif)**  
(Facultatif) Date et heure de début de l’URL au format horaire Unix (en secondes) et en heure UTC. Les utilisateurs ne sont pas autorisés à accéder au fichier avant la date et l’heure spécifiées. N’entourez pas la valeur de points d’interrogation. 

**IpAddress (Facultatif)**  
Adresse IP du client formulant la requête HTTP. Notez ce qui suit :  
+ Pour autoriser une adresse IP à accéder au fichier, omettez le paramètre `IpAddress`.
+ Vous pouvez spécifier une adresse IP ou une plage d’adresses IP. Vous ne pouvez pas utiliser cette politique pour autoriser l’accès si l’adresse IP du client figure dans l’une des deux plages distinctes.
+ Pour autoriser l’accès depuis une seule adresse IP, vous spécifiez :

  `"`*IPv4 IP address*`/32"`
+ Vous devez spécifier les plages d'adresses IP au format IPv4 CIDR standard (par exemple,`192.0.2.0/24`). Pour plus d’informations, consultez [Routage inter-domaines sans classe (CIDR) : plan d'agrégation et d'affectation d'adresses Internet](https://tools.ietf.org/html/rfc4632).
**Important**  
Les adresses IP au IPv6 format 2001:0 db 8:85 a3 : :8a2e : 0370:7334 ne sont pas prises en charge. 

  Si vous utilisez une politique personnalisée qui inclut`IpAddress`, n'activez pas IPv6 la distribution. Si vous souhaitez restreindre l'accès à certains contenus par adresse IP et répondre aux IPv6 demandes d'assistance pour d'autres contenus, vous pouvez créer deux distributions. Pour plus d’informations, consultez [Activer IPv6 (demandes du spectateur)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) dans la rubrique [Référence de tous les paramètres de distribution](distribution-web-values-specify.md).

## Exemple d’une déclaration de politique pour une URL signée qui utilise une politique personnalisée
<a name="private-content-custom-policy-statement-examples"></a>

Les exemples suivants de déclaration de politique montrent comment accéder à un fichier spécifique, à tous les objets d’un répertoire ou à tous les fichiers associés à un ID de paire de clés. Les exemples montrent aussi comment contrôler l’accès depuis une adresse IP individuelle ou une plage d’adresses IP, et comment empêcher les utilisateurs d’employer l’URL signée au-delà d’une date et heure spécifiées.

Si vous copiez et collez l’un de ces exemples, supprimez les espaces vides (y compris les tabulations et les sauts de ligne), remplacez les valeurs par vos propres valeurs et incluez un caractère de saut de ligne après l’accolade fermante (`}`).

Pour de plus amples informations, veuillez consulter [Valeurs que vous spécifiez dans la déclaration de politique d’une URL signée utilisant une politique personnalisée](#private-content-custom-policy-statement-values).

**Topics**
+ [

### Exemple de déclaration de politique : accès à un fichier à partir d’une plage d’adresses IP
](#private-content-custom-policy-statement-example-one-object)
+ [

### Exemple de déclaration de politique : accès à tous les fichiers d’un répertoire à partir d’une plage d’adresses IP
](#private-content-custom-policy-statement-example-all-objects)
+ [

### Exemple de déclaration de politique : accès à tous les fichiers associés à un ID de paire de clés à partir d’une adresse IP
](#private-content-custom-policy-statement-example-one-ip)

### Exemple de déclaration de politique : accès à un fichier à partir d’une plage d’adresses IP
<a name="private-content-custom-policy-statement-example-one-object"></a>

L’exemple suivant de politique personnalisée dans une URL signée spécifie qu’un utilisateur peut accéder au fichier `https://d111111abcdef8.cloudfront.net/game_download.zip` à partir des adresses IP de la plage `192.0.2.0/24` jusqu’au 31 janvier 2023 10 h 00 UTC :

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

### Exemple de déclaration de politique : accès à tous les fichiers d’un répertoire à partir d’une plage d’adresses IP
<a name="private-content-custom-policy-statement-example-all-objects"></a>

L'exemple de politique personnalisée suivant vous permet de créer une signature URLs pour n'importe quel fichier du `training` répertoire, comme indiqué par le caractère générique astérisque (`*`) dans le `Resource` paramètre. Les utilisateurs peuvent accéder au fichier depuis une adresse IP de la plage `192.0.2.0/24` jusqu’au 31 janvier 2023 10 h 00 UTC :

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

Chaque URL signée avec laquelle vous utilisez cette politique inclut une URL qui identifie un fichier spécifique ; par exemple :

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

### Exemple de déclaration de politique : accès à tous les fichiers associés à un ID de paire de clés à partir d’une adresse IP
<a name="private-content-custom-policy-statement-example-one-ip"></a>

L'exemple de politique personnalisée suivant vous permet de créer une signature URLs pour n'importe quel fichier associé à n'importe quelle distribution, comme indiqué par le caractère générique astérisque (`*`) dans le `Resource` paramètre. L'URL signée doit utiliser le protocole `https://`, et non `http://`. L’utilisateur doit employer l’adresse IP `192.0.2.10/32`. (La valeur `192.0.2.10/32` en notation CIDR fait référence à une seule adresse IP, `192.0.2.10`.) Les fichiers ne sont disponibles qu’entre le 31 janvier 2023 10 h 00 UTC et le 2 février 2023 10 h 00 UTC :

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

Chaque URL signée avec laquelle vous utilisez cette politique possède une URL qui identifie un fichier spécifique dans une CloudFront distribution spécifique, par exemple :

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

L’URL signée inclut aussi un ID de paire de clés, qui doit être associé à un groupe de clés autorisé dans la distribution (d111111abcdef8.cloudfront.net) que vous spécifiez dans l’URL.

## Création d’une signature pour une URL signée qui utilise une politique personnalisée
<a name="private-content-custom-policy-creating-signature"></a>

La signature d’une URL signée utilisant une politique personnalisée est une version hachée, signée et encodée en base64 de la déclaration de politique. Pour créer une signature pour une politique personnalisée, procédez comme suit.

Pour plus d’informations et d’exemples sur la façon de hacher, signer et encoder la déclaration de politique, consultez :
+ [Utilisation d’une commande Linux et OpenSSL pour le chiffrement et l’encodage en base64](private-content-linux-openssl.md)
+ [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md)

**Note**  
Les exemples liés utilisent SHA-1 par défaut. Pour utiliser SHA-256 à la place, remplacez `sha1` par `sha256` dans les commandes OpenSSL et incluez le paramètre de `Hash-Algorithm=SHA256` requête dans l'URL signée.<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**Option 1 : Créer une signature à l’aide d’une politique personnalisée**

1. Utilisez la fonction de hachage SHA-1 ou SHA-256 et la clé privée RSA ou ECDSA générée pour hacher et signer la déclaration de politique JSON que vous avez créée dans la procédure. [Pour créer la déclaration de politique d’une URL signée qui utilise une politique personnalisée](#private-content-custom-policy-creating-policy-procedure) Utilisez la version de la déclaration de politique qui n’inclut plus d’espaces vides, mais qui n’a pas encore été encodée en base64.

   Si vous utilisez SHA-256, vous devez l'inclure `&Hash-Algorithm=SHA256` dans l'URL signée.

   Pour la clé privée requise par la fonction de hachage, utilisez une clé privée dont la clé publique se trouve dans un groupe de clés approuvé actif pour la distribution.
**Note**  
La méthode que vous utilisez pour hacher et signer la déclaration de politique dépend du langage de programmation et de la plateforme. Pour un exemple de code, consultez [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md).

1. Supprimez les espaces vides (tabulations et sauts de ligne inclus) de la chaîne hachée et signée.

1. Encodez en base64 la chaîne à l’aide de l’encodage MIME base64. Pour plus d'informations, consultez [la Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) dans la *RFC 2045, MIME (extensions de messagerie Internet polyvalentes), première partie : Format des* corps de messages Internet.

1. Remplacez les caractères non valides d’une chaîne de requête d’URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Ajoutez la valeur obtenue à votre URL signée après `&Signature=`, et retournez à [Pour créer une URL signée utilisant une politique personnalisée](#private-content-creating-signed-url-custom-policy-procedure) pour terminer la concaténation des parties de votre URL signée.

# Utilisation de cookies signés
<a name="private-content-signed-cookies"></a>

CloudFront les cookies signés vous permettent de contrôler qui peut accéder à votre contenu lorsque vous ne souhaitez pas modifier votre contenu actuel URLs ou lorsque vous souhaitez donner accès à plusieurs fichiers restreints, par exemple tous les fichiers de la zone réservée aux abonnés d'un site Web. Cette rubrique explique l’utilisation des cookies signés et décrit comment les définir à l’aide de politiques prédéfinies et personnalisées.

**Topics**
+ [

## Choix entre des politiques prédéfinies et personnalisées pour les cookies signés
](#private-content-choosing-canned-custom-cookies)
+ [

## Fonctionnement des cookies signés
](#private-content-how-signed-cookies-work)
+ [

## Prévention du mauvais usage des cookies signés
](#private-content-signed-cookie-misuse)
+ [

## Quand CloudFront vérifie la date et l'heure d'expiration dans un cookie signé
](#private-content-check-expiration-cookie)
+ [

## Exemple de code et outils tiers
](#private-content-overview-sample-code-cookies)
+ [

# Définition de cookies signés à l’aide d’une politique prédéfinie
](private-content-setting-signed-cookie-canned-policy.md)
+ [

# Définition de cookies signés utilisant une politique personnalisée
](private-content-setting-signed-cookie-custom-policy.md)
+ [

# Création de cookies signés avec PHP
](signed-cookies-PHP.md)

## Choix entre des politiques prédéfinies et personnalisées pour les cookies signés
<a name="private-content-choosing-canned-custom-cookies"></a>

Lorsque vous créez un cookie signé, vous écrivez une instruction de politique au format JSON qui spécifie les restrictions sur le cookie signé : par exemple, la durée de validité du cookie. Vous pouvez utiliser une politique prédéfinie ou une politique personnalisé e. Le tableau suivant compare les politiques prédéfinies et les politiques personnalisées :


****  

| Description | Politique prédéfinie | Politique personnalisée | 
| --- | --- | --- | 
| Vous pouvez réutiliser la déclaration de politique pour plusieurs fichiers. Pour ce faire, vous devez utiliser les caractères génériques de l’objet `Resource`. Pour plus d’informations, consultez [Valeurs que vous spécifiez dans la déclaration de politique d’une politique personnalisée pour les cookies signés](private-content-setting-signed-cookie-custom-policy.md#private-content-custom-policy-statement-cookies-values).)  | Non | Oui | 
| Vous pouvez indiquer la date et l’heure auxquelles les utilisateurs peuvent commencer à accéder à votre contenu | Non | Oui (facultatif) | 
| Vous pouvez indiquer la date et l’heure auxquelles les utilisateurs ne peuvent plus accéder à votre contenu | Oui | Oui | 
| Vous pouvez spécifier l’adresse IP ou la plage d’adresses IP des utilisateurs qui peuvent accéder à votre contenu | Non | Oui (facultatif) | 

Pour plus d’informations sur la création de cookies signés à l’aide d’une politique prédéfinie, consultez [Définition de cookies signés à l’aide d’une politique prédéfinie](private-content-setting-signed-cookie-canned-policy.md).

Pour plus d’informations sur la création de cookies signés à l’aide d’une politique personnalisée, consultez [Définition de cookies signés utilisant une politique personnalisée](private-content-setting-signed-cookie-custom-policy.md).

## Fonctionnement des cookies signés
<a name="private-content-how-signed-cookies-work"></a>

Voici un aperçu de la façon dont vous configurez CloudFront les cookies signés et de la manière dont vous CloudFront répondez lorsqu'un utilisateur soumet une demande contenant un cookie signé. 

1. Dans votre CloudFront distribution, spécifiez un ou plusieurs groupes de clés fiables, qui contiennent les clés publiques CloudFront pouvant être utilisées pour vérifier la signature de l'URL. Vous utilisez les clés privées correspondantes pour signer le URLs.

   Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).

1. Vous développez votre application pour déterminer si un utilisateur doit avoir accès à votre contenu et, si tel est le cas, pour envoyer trois en-têtes `Set-Cookie` à l’utilisateur. (Chaque `Set-Cookie` en-tête ne peut contenir qu'une seule paire nom-valeur, et un cookie CloudFront signé nécessite trois paires nom-valeur.) Vous devez envoyer les en-têtes `Set-Cookie` à l’utilisateur avant qu’il ne demande votre contenu privé. Si vous définissez une durée d’expiration brève sur le cookie, il se peut aussi que vous vouliez envoyer trois en-têtes `Set-Cookie` supplémentaires en réponse aux demandes suivantes, de telle sorte que l’utilisateur puisse continuer à y accéder.

   En règle générale, votre CloudFront distribution aura au moins deux comportements de cache, l'un qui ne nécessite pas d'authentification et l'autre qui en nécessite une. La page d’erreur de la partie sécurisé du site inclut une redirection ou un lien vers une page de connexion.

   Si vous configurez votre distribution pour mettre en cache des fichiers basés sur des cookies, CloudFront elle ne met pas en cache des fichiers séparés en fonction des attributs des cookies signés.

1. Un utilisateur se connecte à votre site web et paie le contenu ou satisfait à quelques autres exigences pour l’accès.

1. Votre application renvoie les en-têtes `Set-Cookie` dans la réponse, et l’utilisateur stocke les paires nom-valeur.

1. L’utilisateur demande un fichier.

   Le navigateur de cet utilisateur ou d’un autre obtient les paires nom-valeur de l’étape 4 et les ajoute à la demande dans un en-tête `Cookie`. Il s’agit du cookie signé.

1. CloudFront utilise la clé publique pour valider la signature du cookie signé et pour confirmer que le cookie n'a pas été falsifié. Si la signature n’est pas valide, la demande est rejetée.

   Si la signature contenue dans le cookie est valide, CloudFront consultez la déclaration de politique contenue dans le cookie (ou créez-en une si vous utilisez une politique prédéfinie) pour confirmer que la demande est toujours valide. Par exemple, si vous avez spécifié une date et une heure de début et de fin pour le cookie, cela CloudFront confirme que l'utilisateur essaie d'accéder à votre contenu pendant la période pendant laquelle vous souhaitez autoriser l'accès.

   Si la demande répond aux exigences de la déclaration de politique, CloudFront diffuse votre contenu comme elle le fait pour le contenu non restreint : elle détermine si le fichier se trouve déjà dans le cache périphérique, transmet la demande à l'origine si nécessaire et renvoie le fichier à l'utilisateur.

## Prévention du mauvais usage des cookies signés
<a name="private-content-signed-cookie-misuse"></a>

Si vous spécifiez le paramètre `Domain` dans un en-tête `Set-Cookie`, spécifiez la valeur la plus précise possible pour réduire les possibilités d’accès par une personne ayant le même nom de domaine racine. Par exemple, app.example.com est préférable à example.com, particulièrement quand vous ne contrôlez pas example.com. Vous empêchez ainsi qu’une personne accède à votre contenu depuis www.example.com.

Pour contribuer à empêcher ce type d’attaque, procédez comme suit :
+ Excluez les attributs de cookie `Expires` et `Max-Age`, de telle sorte que l’en-tête `Set-Cookie` crée un cookie de session. Les cookies de session sont automatiquement supprimés quand l’utilisateur clôt le navigateur, ce qui réduit la possibilité que quelqu’un n’obtienne un accès non autorisé à votre contenu.
+ Incluez l’attribut `Secure`, de telle sorte que le cookie soit chiffré quand un utilisateur l’inclut dans une demande.
+ Chaque fois que possible, utilisez une politique personnalisée et incluez l’adresse IP de l’utilisateur.
+ Dans l’attribut `CloudFront-Expires`, spécifiez la durée d’expiration raisonnable la plus courte selon la période pendant laquelle vous autorisez les utilisateurs à accéder à votre contenu.

## Quand CloudFront vérifie la date et l'heure d'expiration dans un cookie signé
<a name="private-content-check-expiration-cookie"></a>

Pour déterminer si un cookie signé est toujours valide, CloudFront vérifie la date et l'heure d'expiration du cookie au moment de la requête HTTP. Si un client commence à télécharger un fichier volumineux immédiatement avant la date d’expiration, le téléchargement se termine même si la date d’expiration intervient pendant le téléchargement. Si la connexion TCP cesse et que le client essaie de redémarrer le téléchargement une fois la date d’expiration passée, le téléchargement échoue.

Si un client utilise Range GETs pour obtenir un fichier en petits morceaux, toute requête GET exécutée après l'expiration du délai d'expiration échouera. Pour plus d'informations sur Range GETs, consultez[Comment CloudFront traite les demandes partielles pour un objet (plage GETs)](RangeGETs.md).

## Exemple de code et outils tiers
<a name="private-content-overview-sample-code-cookies"></a>

L'exemple de code pour le contenu privé montre uniquement comment créer la signature pour le contenu signé URLs. Cependant, le processus de création d’une signature d’un cookie signé étant très similaire, une grande partie de l’exemple de code continue à être pertinente. Pour plus d’informations, consultez les rubriques suivantes : 
+ [Créer une signature d’URL avec Perl](CreateURLPerl.md)
+ [Créer une signature d’URL avec PHP](CreateURL_PHP.md)
+ [Créer une signature d’URL avec C\$1 et .NET Framework](CreateSignatureInCSharp.md)
+ [Créer une signature d’URL avec Java](CFPrivateDistJavaDevelopment.md)

# Définition de cookies signés à l’aide d’une politique prédéfinie
<a name="private-content-setting-signed-cookie-canned-policy"></a>

Pour définir un cookie signé à l’aide d’une politique prédéfinie, procédez comme suit. Pour créer la signature, consultez [Création d’une signature pour un cookie signé qui utilise une politique prédéfinie](#private-content-canned-policy-signature-cookies).<a name="private-content-setting-signed-cookie-canned-policy-procedure"></a>

**Pour définir un cookie signé à l’aide d’une politique prédéfinie**

1. Si vous utilisez .NET ou Java pour créer des cookies signés et si vous n’avez pas reformaté la clé privée de votre paire de clés du format par défaut .pem en un format compatible avec .NET ou Java, procédez comme suit : Pour de plus amples informations, veuillez consulter [Reformatage de la clé privée (.NET et Java uniquement)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programmez votre application pour qu'elle envoie trois `Set-Cookie` en-têtes aux utilisateurs approuvés (ou quatre, si vous souhaitez spécifier un algorithme de hachage). Vous avez besoin de trois en-têtes `Set-Cookie` parce que chaque en-tête `Set-Cookie` ne peut contenir qu'une seule paire nom-valeur, et qu'un cookie signé CloudFront nécessite trois paires nom-valeur. Les paires nom-valeur sont : `CloudFront-Expires`, `CloudFront-Signature` et `CloudFront-Key-Pair-Id`. Vous pouvez éventuellement inclure une quatrième paire nom-valeur pour spécifier l'algorithme de hachage utilisé pour la signature. `CloudFront-Hash-Algorithm` Les valeurs doivent être présentes sur la visionneuse avant qu’un utilisateur ne puisse faire la requête d’un fichier dont vous voulez contrôler l’accès. 
**Note**  
En règle générale, nous recommandons d’exclure les attributs `Expires` et `Max-Age`. L’exclusion des attributs conduit le navigateur à supprimer le cookie quand l’utilisateur ferme le navigateur, ce qui réduit la possibilité qu’une personne obtienne un accès non autorisé à votre contenu. Pour plus d’informations, consultez [Prévention du mauvais usage des cookies signés](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **Les noms des attributs de cookie sont sensibles à la casse**. 

   Les sauts de ligne ne sont inclus que pour rendre les attributs plus lisibles.

   ```
   Set-Cookie: 
   CloudFront-Expires=date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC); 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Hash-Algorithm=SHA1 or SHA256; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Facultatif) `Domain` **  
Nom de domaine du fichier demandé. Si vous ne spécifiez pas un attribut `Domain`, la valeur par défaut est le nom de domaine de l’URL et ne s’applique qu’au nom de domaine spécifié, non aux sous-domaines. Si vous spécifiez un attribut `Domain`, il s’applique aussi aux sous-domaines. Un point devant le nom de domaine (par exemple, `Domain=.example.com`) est facultatif. De plus, si vous spécifiez un attribut `Domain`, le nom de domaine de l’URL et la valeur de l’attribut `Domain` doivent correspondre.  
Vous pouvez spécifier le nom de domaine CloudFront attribué à votre distribution, par exemple d111111abcdef8.cloudfront.net, mais vous ne pouvez pas spécifier\$1.cloudfront.net pour le nom de domaine.  
Si vous souhaitez utiliser un autre nom de domaine tel que exemple.com dans URLs, vous devez ajouter le nom de domaine alternatif à votre distribution, que vous spécifiiez ou non l'`Domain`attribut. Pour plus d’informations, consultez [Noms de domaine alternatifs (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) dans la rubrique [Référence de tous les paramètres de distribution](distribution-web-values-specify.md).  
**(Facultatif) `Path` **  
Chemin d’accès du fichier demandé. Si vous ne spécifiez pas d’attribut `Path`, la valeur par défaut est le chemin d’accès de l’URL.  
**`Secure`**  
Nécessite que l’utilisateur chiffre les cookies avant d’envoyer une demande. Nous vous recommandons d'envoyer l'`Set-Cookie`en-tête via une connexion HTTPS pour vous assurer que les attributs du cookie sont protégés contre man-in-the-middle les attaques.  
**`HttpOnly`**  
Définit la manière dont le navigateur (lorsqu’il est pris en charge) interagit avec la valeur du cookie. Avec`HttpOnly`, les valeurs des cookies ne sont pas accessibles à JavaScript. Cette précaution permet d’atténuer les attaques par scripts inter-site (XSS). Pour plus d’informations, consultez [Utilisation de cookies HTTPS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies).  
**`CloudFront-Expires`**  
Spécifiez la date et l’heure d’expiration au format horaire Unix (en secondes) et en heure UTC. Par exemple, le 1er janvier 2026 à 10 h UTC est converti en 1767290400 au format horaire Unix.   
Pour utiliser l’heure époque, indiquez un entier 64 bits correspondant à une date qui ne dépasse pas `9223372036854775807` (vendredi 11 avril 2262 à 23:47:16.854 UTC).  
Pour plus d’informations sur l’UTC, consultez *RFC 3339, Date et heure sur Internet : Horodatages*, [https://tools.ietf.org/html/rfc3339](https://tools.ietf.org/html/rfc3339).  
**`CloudFront-Signature`**  
Version hachée, signée et encodée en base 64 d’une déclaration de politique JSON. Pour de plus amples informations, veuillez consulter [Création d’une signature pour un cookie signé qui utilise une politique prédéfinie](#private-content-canned-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
L'ID d'une clé CloudFront publique, par exemple,`K2JCJMDEHXQW5F`. L'ID de clé publique indique CloudFront la clé publique à utiliser pour valider l'URL signée. CloudFront compare les informations de la signature avec celles de la déclaration de politique pour vérifier que l'URL n'a pas été falsifiée.  
Cette clé publique doit appartenir à un groupe de clés qui est un signataire approuvé dans la distribution. Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).  
**`CloudFront-Hash-Algorithm`**  
(Facultatif) L'algorithme de hachage utilisé pour créer la signature. Les valeurs prises en charge sont `SHA1` et `SHA256`. Si vous n'incluez pas ce cookie, la CloudFront valeur par défaut est. `SHA1`

L'exemple suivant montre `Set-Cookie` les en-têtes d'un cookie signé lorsque vous utilisez le nom de domaine associé à votre distribution dans URLs vos fichiers :

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
```

L'exemple suivant montre `Set-Cookie` les en-têtes d'un cookie signé lorsque vous utilisez le nom de domaine alternatif exemple.org URLs pour vos fichiers :

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/images/*; Secure; HttpOnly
```

Si vous souhaitez utiliser un autre nom de domaine tel que exemple.com dans URLs, vous devez ajouter le nom de domaine alternatif à votre distribution, que vous spécifiiez ou non l'`Domain`attribut. Pour plus d’informations, consultez [Noms de domaine alternatifs (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) dans la rubrique [Référence de tous les paramètres de distribution](distribution-web-values-specify.md).

## Création d’une signature pour un cookie signé qui utilise une politique prédéfinie
<a name="private-content-canned-policy-signature-cookies"></a>

Pour créer la signature pour un cookie signé qui utilise une politique prédéfinie, suivez les procédures suivantes.

**Topics**
+ [

### Création d’une déclaration de politique pour un cookie signé qui utilise une politique prédéfinie
](#private-content-canned-policy-statement-cookies)
+ [

### Signature d’une déclaration de politique pour créer une signature pour un cookie signé qui utilise une politique prédéfinie
](#private-content-canned-policy-cookies-signing-policy-statement)

### Création d’une déclaration de politique pour un cookie signé qui utilise une politique prédéfinie
<a name="private-content-canned-policy-statement-cookies"></a>

Lorsque vous définissez un cookie signé qui utilise une politique prédéfinie, l’attribut `CloudFront-Signature` est une version hachée et signée d’une déclaration de politique. Pour les cookies signés qui utilisent une politique prédéfinie, vous n’incluez pas la déclaration de politique dans l’en-tête `Set-Cookie`, comme vous le faites pour les cookies signés qui utilisent une politique personnalisée. Pour créer l’a déclaration de politique, procédez comme suit.<a name="private-content-canned-policy-statement-cookies-procedure"></a>

**Pour créer une déclaration de politique pour un cookie signé qui utilise une politique prédéfinie**

1. Construisez la déclaration de politique à l’aide du format JSON suivant et de l’encodage de caractères UTF-8. Incluez la ponctuation et les autres valeurs littérales exactement comme spécifié. Pour plus d’informations sur les paramètres `Resource` et `DateLessThan`, consultez [Valeurs que vous spécifiez dans la déclaration de politique d’une politique prédéfinie pour les cookies signés](#private-content-canned-policy-statement-cookies-values).

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

1. Supprimez tous les espaces vides (tabulations et sauts de ligne inclus) de la déclaration de politique. Il se peut que vous ayez à inclure des caractères d’échappement dans la chaîne du code d’application.

#### Valeurs que vous spécifiez dans la déclaration de politique d’une politique prédéfinie pour les cookies signés
<a name="private-content-canned-policy-statement-cookies-values"></a>

Lorsque vous créez une déclaration de politique pour une politique prédéfinie, vous spécifiez les valeurs suivantes :

**Ressource**  
L’URL de base incluant vos chaînes de requête, le cas échéant ; par exemple :  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Vous ne pouvez spécifier qu’une seule valeur pour `Resource`.  
Remarques :  
+ **Protocole** : la valeur doit commencer par `http://` ou `https://`.
+ **Paramètres de chaîne de requête** : si vous n’avez aucun paramètre de chaîne de requête, omettez le point d’interrogation.
+ **Noms de domaine alternatifs** : si vous spécifiez un nom de domaine alternatif (CNAME) dans l’URL, vous devez le spécifier lorsque vous référencez le fichier dans votre page ou application web. Ne spécifiez pas l’URL Amazon S3 pour le fichier.

**DateLessThan**  
Date et heure d’expiration de l’URL au format horaire Unix (en secondes) et en heure UTC. N’entourez pas la valeur de points d’interrogation.  
Par exemple, la date 16 mars 2015 10 h 00 UTC est convertie en 1426500000 au format horaire Unix.  
Cette valeur doit correspondre à la valeur de l’attribut `CloudFront-Expires` de l’en-tête `Set-Cookie`. N’entourez pas la valeur de points d’interrogation.  
Pour plus d’informations, consultez [Quand CloudFront vérifie la date et l'heure d'expiration dans un cookie signé](private-content-signed-cookies.md#private-content-check-expiration-cookie).

#### Exemple de déclaration de politique pour une politique prédéfinie
<a name="private-content-canned-policy-cookies-sample-policy-statement"></a>

Lorsque vous utilisez l’exemple de déclaration de politique suivant dans un cookie signé, un utilisateur peut accéder au fichier `https://d111111abcdef8.cloudfront.net/horizon.jpg` jusqu’au 16 mars 2015 10 h 00 UTC :

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

### Signature d’une déclaration de politique pour créer une signature pour un cookie signé qui utilise une politique prédéfinie
<a name="private-content-canned-policy-cookies-signing-policy-statement"></a>

Pour créer la valeur de l’attribut `CloudFront-Signature` d’un en-tête `Set-Cookie`, vous hachez et signez la déclaration de politique que vous avez créée dans [Pour créer une déclaration de politique pour un cookie signé qui utilise une politique prédéfinie](#private-content-canned-policy-statement-cookies-procedure). 

Pour plus d’informations et d’exemples sur la façon de hacher, signer et encoder la déclaration de politique, consultez les rubriques suivantes :
+ [Utilisation d’une commande Linux et OpenSSL pour le chiffrement et l’encodage en base64](private-content-linux-openssl.md)
+ [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md)

**Note**  
Les exemples liés utilisent SHA-1 par défaut. Pour utiliser SHA-256 à la place, remplacez `sha1` par `sha256` dans les commandes OpenSSL et incluez le cookie avec une valeur de`CloudFront-Hash-Algorithm`. `SHA256`<a name="private-content-canned-policy-cookie-creating-signature-procedure"></a>

**Pour créer une signature pour un cookie signé qui utilise une politique prédéfinie**

1. Utilisez la fonction de hachage SHA-1 ou SHA-256 et RSA pour hacher et signer la déclaration de politique que vous avez créée au cours de la procédure. [Pour créer une déclaration de politique pour un cookie signé qui utilise une politique prédéfinie](#private-content-canned-policy-statement-cookies-procedure) Utilisez la version de la déclaration de politique qui n’inclut plus d’espaces vides.

   Si vous utilisez SHA-256, vous devez inclure le `CloudFront-Hash-Algorithm` cookie avec une valeur de. `SHA256`

   Pour la clé privée requise par la fonction de hachage, utilisez une clé privée dont la clé publique se trouve dans un groupe de clés approuvé actif pour la distribution.
**Note**  
La méthode que vous utilisez pour hacher et signer la déclaration de politique dépend du langage de programmation et de la plateforme. Pour un exemple de code, consultez [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md).

1. Supprimez les espaces vides (tabulations et sauts de ligne inclus) de la chaîne hachée et signée.

1. Encodez en base64 la chaîne à l’aide de l’encodage MIME base64. Pour plus d'informations, consultez [la Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) dans la *RFC 2045, MIME (extensions de messagerie Internet polyvalentes), première partie : Format des* corps de messages Internet.

1. Remplacez les caractères non valides d’une chaîne de requête d’URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-canned-policy.html)

1. Incluez la valeur obtenue dans l’en-tête `Set-Cookie` de la paire nom-valeur `CloudFront-Signature`. Puis retournez à [Pour définir un cookie signé à l’aide d’une politique prédéfinie](#private-content-setting-signed-cookie-canned-policy-procedure) pour ajouter l’en-tête `Set-Cookie` de `CloudFront-Key-Pair-Id`.

# Définition de cookies signés utilisant une politique personnalisée
<a name="private-content-setting-signed-cookie-custom-policy"></a>

Pour définir un cookie signé qui utilise une politique personnalisée, effectuez la procédure suivante.<a name="private-content-setting-signed-cookie-custom-policy-procedure"></a>

**Pour définir un cookie signé utilisant une politique personnalisée**

1. Si vous utilisez .NET ou Java pour créer des fichiers signés URLs, et si vous n'avez pas reformaté la clé privée de votre paire de clés du format .pem par défaut à un format compatible avec .NET ou Java, faites-le maintenant. Pour de plus amples informations, veuillez consulter [Reformatage de la clé privée (.NET et Java uniquement)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programmez votre application pour qu'elle envoie trois `Set-Cookie` en-têtes aux utilisateurs approuvés (ou quatre, si vous souhaitez spécifier un algorithme de hachage). Vous avez besoin de trois `Set-Cookie` en-têtes car chaque `Set-Cookie` en-tête ne peut contenir qu'une seule paire nom-valeur, et un cookie CloudFront signé nécessite trois paires nom-valeur. Les paires nom-valeur sont : `CloudFront-Policy`, `CloudFront-Signature` et `CloudFront-Key-Pair-Id`. Vous pouvez éventuellement inclure une quatrième paire nom-valeur pour spécifier l'algorithme de hachage utilisé pour la signature. `CloudFront-Hash-Algorithm` Les valeurs doivent être présentes sur la visionneuse avant qu’un utilisateur ne puisse faire la requête d’un fichier dont vous voulez contrôler l’accès. 
**Note**  
En règle générale, nous recommandons d’exclure les attributs `Expires` et `Max-Age`. Cette exclusion conduit le navigateur à supprimer le cookie quand l’utilisateur ferme le navigateur, ce qui réduit la possibilité qu’une personne obtienne un accès non autorisé à votre contenu. Pour plus d’informations, consultez [Prévention du mauvais usage des cookies signés](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **Les noms des attributs de cookie sont sensibles à la casse**. 

   Les sauts de ligne ne sont inclus que pour rendre les attributs plus lisibles.

   ```
   Set-Cookie: 
   CloudFront-Policy=base64 encoded version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Hash-Algorithm=SHA1 or SHA256; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Facultatif) `Domain` **  
Nom de domaine du fichier demandé. Si vous ne spécifiez pas un attribut `Domain`, la valeur par défaut est le nom de domaine de l’URL et ne s’applique qu’au nom de domaine spécifié, non aux sous-domaines. Si vous spécifiez un attribut `Domain`, il s’applique aussi aux sous-domaines. Un point devant le nom de domaine (par exemple, `Domain=.example.com`) est facultatif. De plus, si vous spécifiez un attribut `Domain`, le nom de domaine de l’URL et la valeur de l’attribut `Domain` doivent correspondre.  
Vous pouvez spécifier le nom de domaine CloudFront attribué à votre distribution, par exemple d111111abcdef8.cloudfront.net, mais vous ne pouvez pas spécifier\$1.cloudfront.net pour le nom de domaine.  
Si vous souhaitez utiliser un autre nom de domaine tel que exemple.com dans URLs, vous devez ajouter le nom de domaine alternatif à votre distribution, que vous spécifiiez ou non l'`Domain`attribut. Pour plus d’informations, consultez [Noms de domaine alternatifs (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) dans la rubrique [Référence de tous les paramètres de distribution](distribution-web-values-specify.md).  
**(Facultatif) `Path` **  
Chemin d’accès du fichier demandé. Si vous ne spécifiez pas d’attribut `Path`, la valeur par défaut est le chemin d’accès de l’URL.  
**`Secure`**  
Nécessite que l’utilisateur chiffre les cookies avant d’envoyer une demande. Nous vous recommandons d'envoyer l'`Set-Cookie`en-tête via une connexion HTTPS pour vous assurer que les attributs du cookie sont protégés contre man-in-the-middle les attaques.  
**`HttpOnly`**  
Requiert que l’utilisateur n’envoie le cookie que dans les requêtes HTTP ou HTTPS.  
**`CloudFront-Policy`**  
Votre déclaration de politique au format JSON, avec suppression des espaces vide, puis encodage en base64. Pour de plus amples informations, veuillez consulter [Création d’une signature pour un cookie signé qui utilise une politique personnalisée](#private-content-custom-policy-signature-cookies).  
La déclaration de politique contrôle l’accès accordé par un cookie signé à un utilisateur. Elle inclut les fichiers auxquels l’utilisateur peut accéder, une date et une heure d’expiration, une date et une heure (facultatif) auxquelles l’URL devient valide et une adresse IP (facultatif) ou une plage d’adresses IP autorisées à accéder au fichier.  
**`CloudFront-Signature`**  
Version hachée, signée et encodée en base 64 de la déclaration de politique JSON. Pour de plus amples informations, veuillez consulter [Création d’une signature pour un cookie signé qui utilise une politique personnalisée](#private-content-custom-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
L'ID d'une clé CloudFront publique, par exemple,`K2JCJMDEHXQW5F`. L'ID de clé publique indique CloudFront la clé publique à utiliser pour valider l'URL signée. CloudFrontcompare les informations de la signature avec celles de la déclaration de politique pour vérifier que l'URL n'a pas été falsifiée.  
Cette clé publique doit appartenir à un groupe de clés qui est un signataire approuvé dans la distribution. Pour de plus amples informations, veuillez consulter [Spécifiez les signataires autorisés à créer des cookies signés URLs et signés](private-content-trusted-signers.md).  
**`CloudFront-Hash-Algorithm`**  
(Facultatif) L'algorithme de hachage utilisé pour créer la signature. Les valeurs prises en charge sont `SHA1` et `SHA256`. Si vous n'incluez pas ce cookie, la CloudFront valeur par défaut est. `SHA1`

## Exemples d’en-têtes `Set-Cookie` pour les politiques personnalisées
<a name="example-set-cookie-headers-custom-policy"></a>

Consultez les exemples de paires d’en-têtes `Set-Cookie` suivants. 

Si vous souhaitez utiliser un autre nom de domaine tel que exemple.org dans URLs, vous devez ajouter le nom de domaine alternatif à votre distribution, que vous spécifiiez ou non l'`Domain`attribut. Pour plus d’informations, consultez [Noms de domaine alternatifs (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) dans la rubrique [Référence de tous les paramètres de distribution](distribution-web-values-specify.md).

**Example Exemple 1**  
Vous pouvez utiliser `Set-Cookie` les en-têtes d'un cookie signé lorsque vous utilisez le nom de domaine associé à votre distribution dans URLs vos fichiers.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Exemple 2**  
Vous pouvez utiliser `Set-Cookie` les en-têtes d'un cookie signé lorsque vous utilisez un autre nom de domaine (exemple.org) URLs pour vos fichiers.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

**Example Exemple 3**  
Vous pouvez utiliser les paires d'`Set-Cookie`en-têtes pour une demande signée lorsque vous utilisez le nom de domaine associé à votre distribution dans vos fichiers. URLs   

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Exemple 4**  
Vous pouvez utiliser les paires `Set-Cookie` d'en-têtes pour une demande signée lorsque vous utilisez un autre nom de domaine (exemple.org) associé à votre distribution dans le fichier URLs pour vos fichiers.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

## Création d’une déclaration de politique pour un cookie signé qui utilise une politique personnalisée
<a name="private-content-custom-policy-statement-cookies"></a>

Pour créer une déclaration de politique pour une politique personnalisée, effectuez la procédure suivante. Pour obtenir des exemples de déclaration de politique qui contrôlent l’accès aux fichiers de différentes façons, consultez [Exemple d’une déclaration de politique pour un cookie signé qui utilise une politique personnalisée](#private-content-custom-policy-statement-signed-cookies-examples).<a name="private-content-custom-policy-statement-cookies-procedure"></a>

**Pour créer la déclaration de politique d’un cookie signé qui utilise une politique personnalisée**

1. Construisez la déclaration de politique à l’aide du format JSON suivant.

   ```
   {
       "Statement": [
           {
               "Resource": "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"
                   }
               }
           }
       ]
   }
   ```

   Remarques :
   + Vous pouvez inclure une seule instruction.
   + Utilisez l’encodage de caractères UTF-8.
   + Incluez la ponctuation et les noms de paramètre exactement comme spécifié. Les abréviations ne sont pas acceptées pour les noms de paramètre.
   + L’ordre des paramètres de la section `Condition` n’importe pas.
   + Pour plus d’informations sur les valeurs de `Resource`, `DateLessThan`, `DateGreaterThan` et `IpAddress`, consultez [Valeurs que vous spécifiez dans la déclaration de politique d’une politique personnalisée pour les cookies signés](#private-content-custom-policy-statement-cookies-values).

1. Supprimez tous les espaces vides (tabulations et sauts de ligne inclus) de la déclaration de politique. Il se peut que vous ayez à inclure des caractères d’échappement dans la chaîne du code d’application.

1. Encodez en base64 la déclaration de politique à l’aide de l’encodage MIME base64. Pour plus d'informations, consultez [la Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) dans la *RFC 2045, MIME (extensions de messagerie Internet polyvalentes), première partie : Format des* corps de messages Internet.

1. Remplacez les caractères non valides d’une chaîne de requête d’URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Incluez la valeur obtenue dans votre en-tête `Set-Cookie` après `CloudFront-Policy=`.

1. Créez une signature pour l’en-tête `Set-Cookie` de `CloudFront-Signature` en hachant, signant et encodant en base64 la déclaration de politique. Pour plus d’informations, consultez [Création d’une signature pour un cookie signé qui utilise une politique personnalisée](#private-content-custom-policy-signature-cookies).

### Valeurs que vous spécifiez dans la déclaration de politique d’une politique personnalisée pour les cookies signés
<a name="private-content-custom-policy-statement-cookies-values"></a>

Lorsque vous créez une déclaration de politique pour une politique personnalisée, vous spécifiez les valeurs suivantes.

**Ressource**  
L’URL de base incluant vos chaînes de requête, le cas échéant :  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Si vous omettez le paramètre `Resource`, les utilisateurs peuvent accéder à tous les fichiers associés à une distribution elle-même associée à la paire de clés que vous utilisez pour créer l’URL signée.
Vous ne pouvez spécifier qu’une seule valeur pour `Resource`.  
Remarques :  
+ **Protocole** : la valeur doit commencer par `http://` ou `https://`.
+ **Paramètres de chaîne de requête** : si vous n’avez aucun paramètre de chaîne de requête, omettez le point d’interrogation.
+ **Caractères génériques** : vous pouvez utiliser à tout moment dans la chaîne, le caractère générique qui correspond à zéro caractère ou plus (\$1) ou celui qui correspond exactement à un seul caractère (?). Par exemple, la valeur :

  `https://d111111abcdef8.cloudfront.net/*game_download.zip*`

  inclut (par exemple) les fichiers suivants :
  + `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`
+ **Noms de domaine alternatifs** : si vous spécifiez un nom de domaine alternatif (CNAME) dans l’URL, vous devez le spécifier lorsque vous référencez le fichier dans votre page ou application web. Ne spécifiez pas l’URL Amazon S3 pour le fichier.

**DateLessThan**  
Date et heure d’expiration de l’URL au format horaire Unix (en secondes) et en heure UTC. N’entourez pas la valeur de points d’interrogation.  
Par exemple, la date 16 mars 2015 10 h 00 UTC est convertie en 1426500000 au format horaire Unix.  
Pour de plus amples informations, veuillez consulter [Quand CloudFront vérifie la date et l'heure d'expiration dans un cookie signé](private-content-signed-cookies.md#private-content-check-expiration-cookie).

**DateGreaterThan (Facultatif)**  
(Facultatif) Date et heure de début de l’URL au format horaire Unix (en secondes) et en heure UTC. Les utilisateurs ne sont pas autorisés à accéder au fichier avant la date et l’heure spécifiées. N’entourez pas la valeur de points d’interrogation. 

**IpAddress (Facultatif)**  
Adresse IP du client formulant la demande GET. Remarques :  
+ Pour autoriser une adresse IP à accéder au fichier, omettez le paramètre `IpAddress`.
+ Vous pouvez spécifier une adresse IP ou une plage d’adresses IP. Par exemple, vous pouvez définir la politique pour autoriser l’accès si l’adresse IP du client figure dans l’une des deux plages distinctes.
+ Pour autoriser l’accès depuis une seule adresse IP, vous spécifiez :

  `"`*IPv4 IP address*`/32"`
+ Vous devez spécifier les plages d'adresses IP au format IPv4 CIDR standard (par exemple,`192.0.2.0/24`). Pour plus d’informations, consultez *RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan*, [https://tools.ietf.org/html/rfc4632](https://tools.ietf.org/html/rfc4632).
**Important**  
Les adresses IP au IPv6 format 2001:0 db 8:85 a3 : :8a2e : 0370:7334 ne sont pas prises en charge. 

  Si vous utilisez une politique personnalisée qui inclut`IpAddress`, n'activez pas IPv6 la distribution. Si vous souhaitez restreindre l'accès à certains contenus par adresse IP et répondre aux IPv6 demandes d'assistance pour d'autres contenus, vous pouvez créer deux distributions. Pour plus d’informations, consultez [Activer IPv6 (demandes du spectateur)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) dans la rubrique [Référence de tous les paramètres de distribution](distribution-web-values-specify.md).

## Exemple d’une déclaration de politique pour un cookie signé qui utilise une politique personnalisée
<a name="private-content-custom-policy-statement-signed-cookies-examples"></a>

Les exemples suivants de déclaration de politique montrent comment accéder à un fichier spécifique, à tous les objets d’un répertoire ou à tous les fichiers associés à un ID de paire de clés. Les exemples montrent aussi comment contrôler l’accès depuis une adresse IP individuelle ou une plage d’adresses IP, et comment empêcher les utilisateurs d’employer le cookie signé au-delà d’une date et heure spécifiées.

Si vous copiez et collez l’un de ces exemples, supprimez les espaces vides (y compris les tabulations et les sauts de ligne), remplacez les valeurs par vos propres valeurs et incluez un caractère de saut de ligne après l’accolade fermante ( \$1 ).

Pour de plus amples informations, veuillez consulter [Valeurs que vous spécifiez dans la déclaration de politique d’une politique personnalisée pour les cookies signés](#private-content-custom-policy-statement-cookies-values).

**Topics**
+ [

### Exemple de déclaration de politique : accès à un fichier à partir d’une plage d’adresses IP
](#private-content-custom-policy-statement-signed-cookies-example-one-object)
+ [

### Exemple de déclaration de politique : accès à tous les fichiers d’un répertoire à partir d’une plage d’adresses IP
](#private-content-custom-policy-statement-signed-cookies-example-all-objects)
+ [

### Exemple de déclaration de politique : accès à tous les fichiers associés à un ID de paire de clés à partir d’une adresse IP
](#private-content-custom-policy-statement-signed-cookies-example-one-ip)

### Exemple de déclaration de politique : accès à un fichier à partir d’une plage d’adresses IP
<a name="private-content-custom-policy-statement-signed-cookies-example-one-object"></a>

L’exemple suivant de politique personnalisée dans un cookie signé spécifie qu’un utilisateur peut accéder au fichier `https://d111111abcdef8.cloudfront.net/game_download.zip` à partir des adresses IP de la plage `192.0.2.0/24` jusqu’au 1er janvier 2023 10 h 00 UTC :

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

### Exemple de déclaration de politique : accès à tous les fichiers d’un répertoire à partir d’une plage d’adresses IP
<a name="private-content-custom-policy-statement-signed-cookies-example-all-objects"></a>

L’exemple suivant de politique personnalisée vous permet de créer des cookies signés pour n’importe quel fichier du répertoire `training`, comme indiqué par le caractère générique \$1 du paramètre `Resource`. Les utilisateurs peuvent accéder au fichier depuis une adresse IP de la plage `192.0.2.0/24` jusqu’au 1er janvier 2013 10 h 00 UTC :

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

Chaque cookie signé dans lequel vous utilisez cette politique inclut une URL de base qui identifie un fichier spécifique ; par exemple :

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

### Exemple de déclaration de politique : accès à tous les fichiers associés à un ID de paire de clés à partir d’une adresse IP
<a name="private-content-custom-policy-statement-signed-cookies-example-one-ip"></a>

L’exemple suivant de politique personnalisée vous permet de définir des cookies signés pour tout fichier associé à une distribution, comme indiqué par le caractère générique \$1 du paramètre `Resource`. L’utilisateur doit employer l’adresse IP `192.0.2.10/32`. (La valeur `192.0.2.10/32` en notation CIDR fait référence à une seule adresse IP, `192.0.2.10`.) Les fichiers ne sont disponibles qu’entre le 1er janvier 2013 10 h 00 UTC et le 2 janvier 2013 10 h 00 UTC :

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

Chaque cookie signé dans lequel vous utilisez cette politique inclut une URL de base qui identifie un fichier spécifique dans une CloudFront distribution spécifique, par exemple :

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

Le cookie signé inclut aussi un ID de paire de clés, qui doit être associé à un groupe de clés approuvé de la distribution (d111111abcdef8.cloudfront.net) que vous spécifiez dans l’URL de base.

## Création d’une signature pour un cookie signé qui utilise une politique personnalisée
<a name="private-content-custom-policy-signature-cookies"></a>

La signature d’un cookie signé utilisant une politique personnalisée est une version hachée, signée et encodée en base64 de la déclaration de politique. 

Pour plus d’informations et d’exemples sur la façon de hacher, signer et encoder la déclaration de politique, consultez :
+ [Utilisation d’une commande Linux et OpenSSL pour le chiffrement et l’encodage en base64](private-content-linux-openssl.md)
+ [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md)

**Note**  
Les exemples liés utilisent SHA-1 par défaut. Pour utiliser SHA-256 à la place, remplacez `sha1` par `sha256` dans les commandes OpenSSL et incluez le cookie avec une valeur de`CloudFront-Hash-Algorithm`. `SHA256`<a name="private-content-custom-policy-signature-cookies-procedure"></a>

**Pour créer une signature pour un cookie signé en utilisant une politique personnalisée**

1. Utilisez la fonction de hachage SHA-1 ou SHA-256 et RSA pour hacher et signer la déclaration de politique JSON que vous avez créée dans la procédure. [Pour créer la déclaration de politique d’une URL signée qui utilise une politique personnalisée](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-creating-policy-procedure) Utilisez la version de la déclaration de politique qui n’inclut plus d’espaces vides, mais qui n’a pas encore été encodée en base64.

   Si vous utilisez SHA-256, vous devez inclure le `CloudFront-Hash-Algorithm` cookie avec une valeur de. `SHA256`

   Pour la clé privée requise par la fonction de hachage, utilisez une clé privée dont la clé publique se trouve dans un groupe de clés approuvé actif pour la distribution.
**Note**  
La méthode que vous utilisez pour hacher et signer la déclaration de politique dépend du langage de programmation et de la plateforme. Pour un exemple de code, consultez [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md).

1. Supprimez les espaces vides (tabulations et sauts de ligne inclus) de la chaîne hachée et signée.

1. Encodez en base64 la chaîne à l’aide de l’encodage MIME base64. Pour plus d'informations, consultez [la Section 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) dans la *RFC 2045, MIME (extensions de messagerie Internet polyvalentes), première partie : Format des* corps de messages Internet.

1. Remplacez les caractères non valides d’une chaîne de requête d’URL par les caractères valides. Le tableau suivant répertorie les caractères valides et non valides.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Incluez la valeur obtenue dans l’en-tête `Set-Cookie` de la paire nom-valeur `CloudFront-Signature=`, et retournez à [Pour définir un cookie signé utilisant une politique personnalisée](#private-content-setting-signed-cookie-custom-policy-procedure) pour ajouter l’en-tête `Set-Cookie` de `CloudFront-Key-Pair-Id`.

# Création de cookies signés avec PHP
<a name="signed-cookies-PHP"></a>

L’exemple de code suivant est similaire à celui indiqué dans [Créer une signature d’URL avec PHP](CreateURL_PHP.md), puisqu’il génère un lien vers une vidéo. Cependant, au lieu de signer l’URL dans le code, cet exemple signe les cookies avec la fonction `create_signed_cookies()`. Le joueur côté client utilise les cookies pour authentifier chaque demande auprès de la distribution. CloudFront

Cette approche est utile pour diffuser du contenu en continu, comme le HTTP Live Streaming (HLS) ou le Dynamic Adaptive Streaming over HTTP (DASH), où le client doit envoyer plusieurs demandes pour récupérer le manifeste, les segments et les ressources associées à la lecture. En utilisant des cookies signés, le client peut authentifier chaque demande sans avoir à générer une nouvelle URL signée pour chaque segment. 

**Note**  
La création d’une signature d’URL n’est qu’une partie du processus d’offre d’un contenu privé avec des cookies signés. Pour de plus amples informations, veuillez consulter [Utilisation de cookies signés](private-content-signed-cookies.md).



**Topics**
+ [

## Création de la signature RSA SHA-1 ou SHA-256
](#create-rsa-sha-1signature-cookies)
+ [

## Création des cookies signés
](#create-the-signed-cookie)
+ [

## Code complet
](#full-code-signed-cookies)

Les sections suivantes décomposent l’exemple de code en plusieurs parties. Vous trouverez l’[exemple de code](#full-code-signed-cookies) complet ci-dessous.

## Création de la signature RSA SHA-1 ou SHA-256
<a name="create-rsa-sha-1signature-cookies"></a>

Cet exemple de code effectue les opérations suivantes :

1. La fonction `rsa_sha1_sign` hache et signe la déclaration de politique à l'aide de SHA-1. Pour utiliser SHA-256 à la place, utilisez la fonction rsa\$1sha256\$1sign illustrée ci-dessous. Les arguments requis sont une déclaration de politique et la clé privée qui correspond à une clé publique qui se trouve dans un groupe de clés approuvé pour votre distribution.

1. Ensuite, la fonction `url_safe_base64_encode` crée une version à URL sécurisée de la signature.

   ```
   function rsa_sha1_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid);
       openssl_free_key($pkeyid);
       return $signature;
   }
   
   function url_safe_base64_encode($value) {
       $encoded = base64_encode($value);
       return str_replace(
           array('+', '=', '/'),
           array('-', '_', '~'),
           $encoded);
   }
   ```

   La fonction suivante utilise SHA-256 au lieu de SHA-1 :

   ```
   function rsa_sha256_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
       openssl_free_key($pkeyid);
       return $signature;
   }
   ```

   La `rsa_sha256_sign` fonction est la même que`rsa_sha1_sign`, sauf qu'elle passe `OPENSSL_ALGO_SHA256` à`openssl_sign`. Lorsque vous utilisez SHA-256, incluez le `CloudFront-Hash-Algorithm` cookie avec une valeur de. `SHA256`

## Création des cookies signés
<a name="create-the-signed-cookie"></a>

Le code suivant construit et crée les cookies signés, en utilisant les attributs de cookie suivants : `CloudFront-Expires``CloudFront-Signature`, `CloudFront-Key-Pair-Id` et`CloudFront-Hash-Algorithm`. Le code utilise une politique personnalisée.

```
function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null, $hash_algorithm = 'SHA1') {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    if ($hash_algorithm === 'SHA256') {
        $signature = rsa_sha256_sign($policy, $private_key_filename);
    } else {
        $signature = rsa_sha1_sign($policy, $private_key_filename);
    }
    $encoded_signature = url_safe_base64_encode($signature);

    $cookies = array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );

    if ($hash_algorithm === 'SHA256') {
        $cookies['CloudFront-Hash-Algorithm'] = 'SHA256';
    }

    return $cookies;
}
```

Pour de plus amples informations, veuillez consulter [Définition de cookies signés utilisant une politique personnalisée](private-content-setting-signed-cookie-custom-policy.md).

## Code complet
<a name="full-code-signed-cookies"></a>

L'exemple de code suivant fournit une démonstration complète de la création de cookies CloudFront signés avec PHP. Vous pouvez télécharger l’exemple complet depuis le fichier [demo-php.zip](samples/demo-php.zip).

Dans l'exemple suivant, vous pouvez modifier l'`$policy Condition`élément pour autoriser à la fois les plages d' IPv6 adresses IPv4 et les plages d'adresses. Par exemple, consultez la section [Utilisation IPv6 des adresses dans les politiques IAM](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) du *guide de l'utilisateur d'Amazon Simple Storage Service*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid);
    openssl_free_key($pkeyid);
    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function rsa_sha256_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
    openssl_free_key($pkeyid);
    return $signature;
}

function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null, $hash_algorithm = 'SHA1') {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    if ($hash_algorithm === 'SHA256') {
        $signature = rsa_sha256_sign($policy, $private_key_filename);
    } else {
        $signature = rsa_sha1_sign($policy, $private_key_filename);
    }
    $encoded_signature = url_safe_base64_encode($signature);

    $cookies = array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );

    if ($hash_algorithm === 'SHA256') {
        $cookies['CloudFront-Hash-Algorithm'] = 'SHA256';
    }

    return $cookies;
}



$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';
$base_url = 'https://d1234.cloudfront.net';

$expires = time() + 3600; // 1 hour from now

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];


// For HLS manifest and segments (using wildcard)
$hls_resource = $base_url . '/sign/*';
$signed_cookies = create_signed_cookies($hls_resource, $private_key_filename, $key_pair_id, $expires, $client_ip, 'SHA256');

// Set the cookies
$cookie_domain = parse_url($base_url, PHP_URL_HOST);
foreach ($signed_cookies as $name => $value) {
    setcookie($name, $value, $expires, '/', $cookie_domain, true, true);
}

?>

<!DOCTYPE html>
<html>
<head>
    <title>CloudFront Signed HLS Stream with Cookies</title>
</head>
<body>
    <h1>Amazon CloudFront Signed HLS Stream with Cookies</h1>
    <h2>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h2>
    
    <div id='hls-video'>
        <video id="video" width="640" height="360" controls></video>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        var video = document.getElementById('video');
        var manifestUrl = '<?php echo $base_url; ?>/sign/manifest.m3u8';
        
        if (Hls.isSupported()) {
            var hls = new Hls();
            hls.loadSource(manifestUrl);
            hls.attachMedia(video);
        }
        else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = manifestUrl;
        }
    </script>
</body>
</html>
```

Au lieu d'utiliser des cookies signés, vous pouvez utiliser des cookies signés URLs. Pour de plus amples informations, veuillez consulter [Créer une signature d’URL avec PHP](CreateURL_PHP.md).

# Utilisation d’une commande Linux et OpenSSL pour le chiffrement et l’encodage en base64
<a name="private-content-linux-openssl"></a>

Vous pouvez utiliser la commande de ligne de commande Linux suivante et OpenSSL pour hacher et signer la déclaration de politique, encoder la signature en base64 et remplacer les caractères non valides des paramètres de la chaîne de requête de l’URL par des caractères valides.

Pour plus d’informations sur OpenSSL, rendez-vous sur [https://www.openssl.org](https://www.openssl.org).

SHA-1 (par défaut) :

```
cat policy | tr -d "\n" | tr -d " \t\n\r" | openssl sha1 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'
```

SHA-256 :

```
cat policy | tr -d "\n" | tr -d " \t\n\r" | openssl sha256 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'
```

Dans la commande précédente :
+ `cat` lit le fichier `policy`.
+ `tr -d "\n" | tr -d " \t\n\r"` supprime les espaces vides et le caractère de saut de ligne qui ont été ajoutés par `cat`.
+ OpenSSL hache le fichier à l'aide de SHA-1 (ou SHA-256) et le signe à l'aide du fichier de clé privée. `private_key.pem` La signature de clé privée peut être RSA 2048 ou ECDSA 256. Si vous utilisez SHA-256, incluez le paramètre de `Hash-Algorithm=SHA256` requête dans l'URL signée ou le `CloudFront-Hash-Algorithm=SHA256` cookie pour les cookies signés.
+ OpenSSL encode en base64 la déclaration de politique hachée et signée.
+ `tr`remplace les caractères non valides dans les paramètres de chaîne de requête d'URL par des caractères valides.

Pour d’autres exemples de code illustrant la création d’une signature, consultez [Exemples de code pour la création de la signature d’une URL signée](PrivateCFSignatureCodeAndExamples.md).

# Exemples de code pour la création de la signature d’une URL signée
<a name="PrivateCFSignatureCodeAndExamples"></a>

Cette section inclut des exemples d'applications téléchargeables qui montrent comment créer des signatures pour Signed URLs. Les exemples sont disponibles en Perl, PHP, C\$1 et Java. Vous pouvez utiliser n'importe lequel des exemples pour créer des signatures URLs. Le script Perl s’exécute sur les plateformes Linux et MacOS. L’exemple PHP fonctionne sur n’importe quel serveur qui exécute PHP. L’exemple C\$1 utilise le .NET Framework.

Les exemples de cette section utilisent SHA-1 pour hacher et signer la déclaration de politique. Vous pouvez également utiliser SHA-256. Pour utiliser SHA-256, mettez à jour l'algorithme de hachage dans la fonction de signature (par exemple, remplacez-le par `sha1` dans les appels `sha256` OpenSSL ou utilisez la constante SHA-256 équivalente dans la bibliothèque cryptographique de votre langue). Lorsque vous utilisez SHA-256, incluez le paramètre de `Hash-Algorithm=SHA256` requête dans l'URL signée.

Pour un exemple de code dans JavaScript (Node.js), consultez [Creating Amazon CloudFront URLs Signed in Node.js](https://aws.amazon.com/blogs/developer/creating-amazon-cloudfront-signed-urls-in-node-js/) sur le blog des AWS développeurs.

Pour un exemple de code en Python, consultez [Generate a signed URL for Amazon CloudFront](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudfront.html#examples) dans le *AWS SDK for Python (Boto3) API [Reference et cet exemple de code dans le référentiel](https://github.com/boto/boto3/blob/develop/boto3/examples/cloudfront.rst) Boto3*. GitHub 

**Topics**
+ [

# Créer une signature d’URL avec Perl
](CreateURLPerl.md)
+ [

# Créer une signature d’URL avec PHP
](CreateURL_PHP.md)
+ [

# Créer une signature d’URL avec C\$1 et .NET Framework
](CreateSignatureInCSharp.md)
+ [

# Créer une signature d’URL avec Java
](CFPrivateDistJavaDevelopment.md)

# Créer une signature d’URL avec Perl
<a name="CreateURLPerl"></a>

Cette section inclut un script Perl pour les Linux/Mac plateformes que vous pouvez utiliser pour créer la signature du contenu privé. Pour créer la signature, exécutez le script avec des arguments de ligne de commande qui spécifient l' CloudFront URL, le chemin d'accès à la clé privée du signataire, l'ID de la clé et la date d'expiration de l'URL. L'outil peut également décoder les signaturesURLs. 

**Remarques**  
La création d’une signature d’URL n’est qu’une partie du processus d’offre d’un contenu privé avec une URL signée. Pour plus d'informations sur le end-to-end processus, consultez[Utiliser signé URLs](private-content-signed-urls.md). 
Dans la commande de signature, notez que cela `sha1` peut être remplacé par `sha256` dans l'`openssl dgst`appel.

**Topics**
+ [

## Source du script Perl pour la création d’une URL signée
](#CreateURLPerlScriptSource)

## Source du script Perl pour la création d’une URL signée
<a name="CreateURLPerlScriptSource"></a>

Le code source Perl suivant peut être utilisé pour créer une URL signée pour CloudFront. Les commentaires du code incluent les informations sur les fonctions et les commutateurs de ligne de commande de l’outil.

```
#!/usr/bin/perl -w

# Copyright 2008 Amazon Technologies, Inc.  Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. You may obtain a copy of the License at:
#
# https://aws.amazon.com/apache2.0
#
# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.

=head1 cfsign.pl

cfsign.pl - A tool to generate and verify Amazon CloudFront signed URLs

=head1 SYNOPSIS

This script uses an existing RSA key pair to sign and verify Amazon CloudFront signed URLs

View the script source for details as to which CPAN packages are required beforehand. 

For help, try:

cfsign.pl --help

URL signing examples:

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --policy sample_policy.json --private-key privkey.pem --key-pair-id mykey

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --expires 1257439868 --private-key privkey.pem --key-pair-id mykey

URL decode example:

cfsign.pl --action decode --url "http//mydist.cloudfront.net/?Signature=AGO-PgxkYo99MkJFHvjfGXjG1QDEXeaDb4Qtzmy85wqyJjK7eKojQWa4BCRcow__&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovLypicmFkbS5qcGciLCJDb25kaXRpb24iOnsiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjEwLjUyLjE3LjkvMCJ9LCJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI1MjUyMDgzMH19fV19Cg__&Key-Pair-Id=mykey"


To generate an RSA key pair, you can use openssl and the following commands:

# Generate a 2048 bit key pair
openssl genrsa -out private-key.pem 2048
openssl rsa -in private-key.pem -pubout -out public-key.pem


=head1 OPTIONS

=over 8

=item B<--help>

Print a help message and exits.

=item B<--action> [action]

The action to execute.  action can be one of:

  encode - Generate a signed URL (using a canned policy or a user policy)
  decode - Decode a signed URL

=item B<--url>

The URL to en/decode

=item B<--stream>

The stream to en/decode

=item B<--private-key>

The path to your private key.

=item B<--key-pair-id>

The key pair identifier.

=item B<--policy>

The CloudFront policy document.

=item B<--expires>

The Unix epoch time when the URL is to expire. If both this option and
the --policy option are specified, --policy will be used. Otherwise, this 
option alone will use a canned policy.

=back

=cut

use strict;
use warnings;

# you might need to use CPAN to get these modules.
# run perl -MCPAN -e "install <module>" to get them.
# The openssl command line will also need to be in your $PATH.
use File::Temp qw/tempfile/;
use File::Slurp;
use Getopt::Long;
use IPC::Open2;
use MIME::Base64 qw(encode_base64 decode_base64);
use Pod::Usage;
use URI;

my $CANNED_POLICY 
    = '{"Statement":[{"Resource":"<RESOURCE>","Condition":{"DateLessThan":{"AWS:EpochTime":<EXPIRES>}}}]}';

my $POLICY_PARAM      = "Policy";
my $EXPIRES_PARAM     = "Expires";
my $SIGNATURE_PARAM   = "Signature";
my $KEY_PAIR_ID_PARAM = "Key-Pair-Id";

my $verbose = 0;
my $policy_filename = "";
my $expires_epoch = 0;
my $action = "";
my $help = 0;
my $key_pair_id = "";
my $url = "";
my $stream = "";
my $private_key_filename = "";

my $result = GetOptions("action=s"      => \$action,
                        "policy=s"      => \$policy_filename,
                        "expires=i"     => \$expires_epoch,
                        "private-key=s" => \$private_key_filename,
                        "key-pair-id=s" => \$key_pair_id,
                        "verbose"       => \$verbose,
                        "help"          => \$help,
                        "url=s"         => \$url,
                        "stream=s"      => \$stream,
                    );

if ($help or !$result) {
    pod2usage(1);
    exit;
}

if ($url eq "" and $stream eq "") {
    print STDERR "Must include a stream or a URL to encode or decode with the --stream or --url option\n";
    exit;
}

if ($url ne "" and $stream ne "") {
    print STDERR "Only one of --url and --stream may be specified\n";
    exit;
}

if ($url ne "" and !is_url_valid($url)) {
    exit;
}

if ($stream ne "") {
    exit unless is_stream_valid($stream);

    # The signing mechanism is identical, so from here on just pretend we're
    # dealing with a URL
    $url = $stream;
} 

if ($action eq "encode") {
    # The encode action will generate a private content URL given a base URL, 
    # a policy file (or an expires timestamp) and a key pair id parameter
    my $private_key;
    my $public_key;
    my $public_key_file;
    
    my $policy;
    if ($policy_filename eq "") {
        if ($expires_epoch == 0) {
            print STDERR "Must include policy filename with --policy argument or an expires" . 
                          "time using --expires\n";            
        }
        
        $policy = $CANNED_POLICY;
        $policy =~ s/<EXPIRES>/$expires_epoch/g;
        $policy =~ s/<RESOURCE>/$url/g;
    } else {
        if (! -e $policy_filename) {
            print STDERR "Policy file $policy_filename does not exist\n";
            exit;
        }
        $expires_epoch = 0; # ignore if set
        $policy = read_file($policy_filename);
    }

    if ($private_key_filename eq "") {
        print STDERR "You must specific the path to your private key file with --private-key\n";
        exit;
    }

    if (! -e $private_key_filename) {
        print STDERR "Private key file $private_key_filename does not exist\n";
        exit;
    }

    if ($key_pair_id eq "") {
        print STDERR "You must specify a key pair id with --key-pair-id\n";
        exit;
    }

    my $encoded_policy = url_safe_base64_encode($policy);
    my $signature = rsa_sha1_sign($policy, $private_key_filename);
    my $encoded_signature = url_safe_base64_encode($signature);

    my $generated_url = create_url($url, $encoded_policy, $encoded_signature, $key_pair_id, $expires_epoch);


    if ($stream ne "") {
        print "Encoded stream (for use within a swf):\n" . $generated_url . "\n";
        print "Encoded and escaped stream (for use on a webpage):\n" .  escape_url_for_webpage($generated_url) . "\n"; 
    } else {
        print "Encoded URL:\n" . $generated_url . "\n";
    }
} elsif ($action eq "decode") {
    my $decoded = decode_url($url);
    if (!$decoded) {
        print STDERR "Improperly formed URL\n";
        exit;
    }

    print_decoded_url($decoded);
} else {
    # No action specified, print help.  But only if this is run as a program (caller will be empty)
    pod2usage(1) unless caller();
}

# Decode a private content URL into its component parts
sub decode_url {
    my $url = shift;

    if ($url =~ /(.*)\?(.*)/) {
        my $base_url = $1;
        my $params = $2;

        my @unparsed_params = split(/&/, $params);
        my %params = ();
        foreach my $param (@unparsed_params) {
            my ($key, $val) = split(/=/, $param);
            $params{$key} = $val;
        }

        my $encoded_signature = "";
        if (exists $params{$SIGNATURE_PARAM}) {
            $encoded_signature = $params{"Signature"};
        } else {
            print STDERR "Missing Signature URL parameter\n";
            return 0;
        }

        my $encoded_policy = "";
        if (exists $params{$POLICY_PARAM}) {
            $encoded_policy = $params{$POLICY_PARAM};
        } else {
            if (!exists $params{$EXPIRES_PARAM}) {
                print STDERR "Either the Policy or Expires URL parameter needs to be specified\n";
                return 0;    
            }
            
            my $expires = $params{$EXPIRES_PARAM};
            
            my $policy = $CANNED_POLICY;
            $policy =~ s/<EXPIRES>/$expires/g;
            
            my $url_without_cf_params = $url;
            $url_without_cf_params =~ s/$SIGNATURE_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$POLICY_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$EXPIRES_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$KEY_PAIR_ID_PARAM=[^&]*&?//g;
            
            if ($url_without_cf_params =~ /(.*)\?$/) {
                $url_without_cf_params = $1;
            }
            
            $policy =~ s/<RESOURCE>/$url_without_cf_params/g;
            
            $encoded_policy = url_safe_base64_encode($policy);
        }

        my $key = "";
        if (exists $params{$KEY_PAIR_ID_PARAM}) {
            $key = $params{$KEY_PAIR_ID_PARAM};
        } else {
            print STDERR "Missing $KEY_PAIR_ID_PARAM parameter\n";
            return 0;
        }

        my $policy = url_safe_base64_decode($encoded_policy);

        my %ret = ();
        $ret{"base_url"} = $base_url;
        $ret{"policy"} = $policy;
        $ret{"key"} = $key;

        return \%ret;
    } else {
        return 0;
    }
}

# Print a decoded URL out
sub print_decoded_url {
    my $decoded = shift;

    print "Base URL: \n" . $decoded->{"base_url"} . "\n";
    print "Policy: \n" . $decoded->{"policy"} . "\n";
    print "Key: \n" . $decoded->{"key"} . "\n";
}

# Encode a string with base 64 encoding and replace some invalid URL characters
sub url_safe_base64_encode {
    my ($value) = @_;

    my $result = encode_base64($value);
    $result =~ tr|+=/|-_~|;

    return $result;
}

# Decode a string with base 64 encoding.  URL-decode the string first
# followed by reversing any special character ("+=/") translation.
sub url_safe_base64_decode {
    my ($value) = @_;

    $value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    $value =~ tr|-_~|+=/|;

    my $result = decode_base64($value);

    return $result;
}

# Create a private content URL
sub create_url {
    my ($path, $policy, $signature, $key_pair_id, $expires) = @_;
    
    my $result;
    my $separator = $path =~ /\?/ ? '&' : '?';
    if ($expires) {
        $result = "$path$separator$EXPIRES_PARAM=$expires&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    } else {
        $result = "$path$separator$POLICY_PARAM=$policy&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    }
    $result =~ s/\n//g;

    return $result;
}

# Sign a document with given private key file.
# The first argument is the document to sign
# The second argument is the name of the private key file
sub rsa_sha1_sign {
    my ($to_sign, $pvkFile) = @_;
    print "openssl sha1 -sign $pvkFile $to_sign\n";

    return write_to_program($pvkFile, $to_sign);
}

# Helper function to write data to a program
sub write_to_program {
my ($keyfile, $data) = @_;
unlink "temp_policy.dat" if (-e "temp_policy.dat");
unlink "temp_sign.dat" if (-e "temp_sign.dat");

write_file("temp_policy.dat", $data);

system("openssl dgst -sha1 -sign \"$keyfile\" -out temp_sign.dat temp_policy.dat");

my $output = read_file("temp_sign.dat");

    return $output;
}

# Read a file into a string and return the string
sub read_file {
    my ($file) = @_;

    open(INFILE, "<$file") or die("Failed to open $file: $!");
    my $str = join('', <INFILE>);
    close INFILE;

    return $str;
}

sub is_url_valid {
    my ($url) = @_;

    # HTTP distributions start with http[s]:// and are the correct thing to sign
    if ($url =~ /^https?:\/\//) {
        return 1;
    } else {
        print STDERR "CloudFront requires absolute URLs for HTTP distributions\n";
        return 0;
    }
}

sub is_stream_valid {
    my ($stream) = @_;

    if ($stream =~ /^rtmp:\/\// or $stream =~ /^\/?cfx\/st/) {
        print STDERR "Streaming distributions require that only the stream name is signed.\n";
        print STDERR "The stream name is everything after, but not including, cfx/st/\n";
        return 0;
    } else {
        return 1;
    }
}

# flash requires that the query parameters in the stream name are url
# encoded when passed in through javascript, etc.  This sub handles the minimal
# required url encoding.
sub escape_url_for_webpage {
    my ($url) = @_;

    $url =~ s/\?/%3F/g;
    $url =~ s/=/%3D/g;
    $url =~ s/&/%26/g;

    return $url;
}

1;
```

# Créer une signature d’URL avec PHP
<a name="CreateURL_PHP"></a>

Tout serveur Web qui exécute PHP peut utiliser cet exemple de code PHP pour créer des déclarations de politique et des signatures pour CloudFront des distributions privées. L'exemple complet crée une page Web fonctionnelle avec des liens URL signés qui diffusent un flux vidéo CloudFront en streaming. Vous pouvez télécharger l’exemple complet depuis le fichier [demo-php.zip](samples/demo-php.zip).

**Remarques**  
La création d’une signature d’URL n’est qu’une partie du processus d’offre d’un contenu privé avec une URL signée. Pour plus d’informations sur la totalité du processus, consultez [Utiliser signé URLs](private-content-signed-urls.md). 
Vous pouvez également créer une signature URLs en utilisant la `UrlSigner` classe dans le AWS SDK pour PHP. Pour plus d'informations, consultez la section [Classe UrlSigner](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CloudFront.UrlSigner.html) dans la *référence de AWS SDK pour PHP l'API*.
Lors de l'`openssl_sign`appel, notez que le passage `OPENSSL_ALGO_SHA256` en tant que quatrième argument passe à SHA-256. (Voir également le [Création de cookies signés avec PHP](signed-cookies-PHP.md) pour un exemple complet.)

**Topics**
+ [

## Création de la signature RSA SHA-1
](#sample-rsa-sign)
+ [

## Création d’une politique prédéfinie
](#sample-canned-policy)
+ [

## Créer une stratégie personnalisée
](#sample-custom-policy)
+ [

## Exemple de code complet
](#full-example)

Les sections suivantes décomposent l’exemple de code en plusieurs parties. Vous trouverez le [Exemple de code complet](#full-example) ci-dessous.

## Création de la signature RSA SHA-1
<a name="sample-rsa-sign"></a>

Cet exemple de code effectue les opérations suivantes :
+ La fonction `rsa_sha1_sign` hache et signe la déclaration de politique. Les arguments requis sont une déclaration de politique et la clé privée qui correspond à une clé publique qui se trouve dans un groupe de clés approuvé pour votre distribution. 
+ Ensuite, la fonction `url_safe_base64_encode` crée une version à URL sécurisée de la signature.

```
function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with 
    // the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}
```

L'extrait de code suivant utilise les fonctions `get_canned_policy_stream_name()` et permet de `get_custom_policy_stream_name()` créer une politique prédéfinie et personnalisée. CloudFront utilise les politiques pour créer l'URL de diffusion de la vidéo, notamment en spécifiant le délai d'expiration. 

Vous pouvez ensuite utiliser une politique prédéfinie ou personnalisée pour définir la gestion de l’accès à votre contenu. Pour savoir quelle option privilégier, consultez la section [Décidez d'utiliser des politiques prédéfinies ou personnalisées pour les documents signés URLs](private-content-signed-urls.md#private-content-choosing-canned-custom-policy).

## Création d’une politique prédéfinie
<a name="sample-canned-policy"></a>

L’exemple de code suivant construit une déclaration de politique *prédéfinie* pour la signature. 

**Note**  
La `$expires` variable est un date/time tampon qui doit être un entier et non une chaîne.

```
function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}
```

Pour plus d’informations sur les politiques prédéfinies, consultez [Création d’une URL signée à l’aide d’une politique prédéfinie](private-content-creating-signed-url-canned-policy.md).

## Créer une stratégie personnalisée
<a name="sample-custom-policy"></a>

L’exemple de code suivant construit une déclaration de politique *personnalisée* pour la signature. 

```
function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}
```

Pour plus d’informations sur les politiques personnalisées, consultez [Création d’une URL signée utilisant une politique personnalisée](private-content-creating-signed-url-custom-policy.md).

## Exemple de code complet
<a name="full-example"></a>

L'exemple de code suivant fournit une démonstration complète de la création de CloudFront signatures URLs avec PHP. Vous pouvez télécharger l’exemple complet depuis le fichier [demo-php.zip](samples/demo-php.zip).

Dans l'exemple suivant, vous pouvez modifier l'`$policy``Condition`élément pour autoriser à la fois les plages d' IPv6 adresses IPv4 et les plages d'adresses. Par exemple, consultez la section [Utilisation IPv6 des adresses dans les politiques IAM](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) du *guide de l'utilisateur d'Amazon Simple Storage Service*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function create_stream_name($stream, $policy, $signature, $key_pair_id, $expires) {
    $result = $stream;
    // if the stream already contains query parameters, attach the new query parameters to the end
    // otherwise, add the query parameters
    $separator = strpos($stream, '?') == FALSE ? '?' : '&';
    // the presence of an expires time means we're using a canned policy
    if($expires) {
        $result .= $separator . "Expires=" . $expires . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }
    // not using a canned policy, include the policy itself in the stream name
    else {
        $result .= $separator . "Policy=" . $policy . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }

    // new lines would break us, so remove them
    return str_replace('\n', '', $result);
}


function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}

function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}


// Path to your private key.  Be very careful that this file is not accessible
// from the web!

$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';

// Make sure you have "Restrict viewer access" enabled on this path behaviour and using the above Trusted key groups (recommended).
$video_path = 'https://example.com/secure/example.mp4';

$expires = time() + 300; // 5 min from now
$canned_policy_stream_name = get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires);

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$policy =
'{'.
    '"Statement":['.
        '{'.
            '"Resource":"'. $video_path . '",'.
            '"Condition":{'.
                '"IpAddress":{"AWS:SourceIp":"' . $client_ip . '/32"},'.
                '"DateLessThan":{"AWS:EpochTime":' . $expires . '}'.
            '}'.
        '}'.
    ']' .
    '}';
$custom_policy_stream_name = get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy);

?>

<html>

<head>
    <title>CloudFront</title>
</head>

<body>
    <h1>Amazon CloudFront</h1>
    <h2>Canned Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?></h3>
    <br />

    <div id='canned'>The canned policy video will be here: <br>
    
        <video width="640" height="360" autoplay muted controls>
        <source src="<?php echo $canned_policy_stream_name; ?>" type="video/mp4">
        Your browser does not support the video tag.
        </video>
    </div>

    <h2>Custom Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h3>
    <div id='custom'>The custom policy video will be here: <br>

         <video width="640" height="360" autoplay muted controls>
         <source src="<?php echo $custom_policy_stream_name; ?>" type="video/mp4">
         Your browser does not support the video tag.
        </video>
    </div> 

</body>

</html>
```

Pour obtenir plus exemples sur la signature d’URL, consultez les rubriques suivantes :
+ [Créer une signature d’URL avec Perl](CreateURLPerl.md)
+ [Créer une signature d’URL avec C\$1 et .NET Framework](CreateSignatureInCSharp.md)
+ [Créer une signature d’URL avec Java](CFPrivateDistJavaDevelopment.md)

Au lieu d'utiliser des cookies signés URLs pour créer la signature, vous pouvez utiliser des cookies signés. Pour de plus amples informations, veuillez consulter [Création de cookies signés avec PHP](signed-cookies-PHP.md).

# Créer une signature d’URL avec C\$1 et .NET Framework
<a name="CreateSignatureInCSharp"></a>

Les exemples C\$1 présentés dans cette section mettent en œuvre un exemple d'application qui montre comment créer des signatures pour des distributions CloudFront privées à l'aide de déclarations de politique prédéfinies et personnalisées. Les exemples incluent des fonctions utilitaires basées sur le [AWS SDK pour .NET](https://aws.amazon.com/sdkfornet) pour .NET et qui peuvent être utiles dans les applications .NET.

Vous pouvez également créer des cookies signés URLs et signés en utilisant le SDK pour .NET. Dans la *Référence des API du kit SDK pour .NET *, consultez les rubriques suivantes :
+ **Signé URLs** — [AmazonCloudFrontUrlSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontUrlSigner.html) 
+ **Cookies signés** — [AmazonCloudFrontCookieSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontCookieSigner.html) 

Pour télécharger le code, consultez [Code de signature en C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip).

**Remarques**  
Les classes `AmazonCloudFrontUrlSigner` et `AmazonCloudFrontCookieSigner` ont été déplacées vers un package distinct. Pour plus d'informations sur leur utilisation, consultez [CookieSigner et](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html#net-dg-v4-CookieSigner-UrlSigner) consultez UrlSigner le *Guide du développeur AWS SDK pour .NET (V4)*. 
La création d’une signature d’URL n’est qu’une partie du processus d’offre d’un contenu privé avec une URL signée. Pour de plus amples informations, veuillez consulter [Utiliser signé URLs](private-content-signed-urls.md). Pour plus d’informations sur l’utilisation des cookies signés, consultez [Utilisation de cookies signés](private-content-signed-cookies.md).
Dans l'appel de signature RSA, notez que cela `SHA1` peut être remplacé par le paramètre de `SHA256` l'algorithme de hachage.

## Utilisation d’une clé RSA dans .NET Framework
<a name="rsa-key-sdk-net"></a>

Pour utiliser une clé RSA dans le .NET Framework, vous devez convertir le fichier .pem AWS fourni au format XML utilisé par le .NET Framework.

Après la conversion, le fichier de clé privée RSA est au format suivant :

**Example : clé privée RSA au format XML .NET Framework**  <a name="RSAPrivateKeyXML.NETFrameworkFormat"></a>

```
<RSAKeyValue>
  <Modulus>
    wO5IvYCP5UcoCKDo1dcspoMehWBZcyfs9QEzGi6Oe5y+ewGr1oW+vB2GPB
    ANBiVPcUHTFWhwaIBd3oglmF0lGQljP/jOfmXHUK2kUUnLnJp+oOBL2NiuFtqcW6h/L5lIpD8Yq+NRHg
    Ty4zDsyr2880MvXv88yEFURCkqEXAMPLE=
  </Modulus>
  <Exponent>AQAB</Exponent>
  <P>
    5bmKDaTz
    npENGVqz4Cea8XPH+sxt+2VaAwYnsarVUoSBeVt8WLloVuZGG9IZYmH5KteXEu7fZveYd9UEXAMPLE==
  </P>
  <Q>
    1v9l/WN1a1N3rOK4VGoCokx7kR2SyTMSbZgF9IWJNOugR/WZw7HTnjipO3c9dy1Ms9pUKwUF4
    6d7049EXAMPLE==
  </Q>
  <DP>
    RgrSKuLWXMyBH+/l1Dx/I4tXuAJIrlPyo+VmiOc7b5NzHptkSHEPfR9s1
    OK0VqjknclqCJ3Ig86OMEtEXAMPLE==
  </DP>
  <DQ>
    pjPjvSFw+RoaTu0pgCA/jwW/FGyfN6iim1RFbkT4
    z49DZb2IM885f3vf35eLTaEYRYUHQgZtChNEV0TEXAMPLE==
  </DQ>
  <InverseQ>
    nkvOJTg5QtGNgWb9i
    cVtzrL/1pFEOHbJXwEJdU99N+7sMK+1066DL/HSBUCD63qD4USpnf0myc24in0EXAMPLE==</InverseQ>
  <D>
      Bc7mp7XYHynuPZxChjWNJZIq+A73gm0ASDv6At7F8Vi9r0xUlQe/v0AQS3ycN8QlyR4XMbzMLYk
      3yjxFDXo4ZKQtOGzLGteCU2srANiLv26/imXA8FVidZftTAtLviWQZBVPTeYIA69ATUYPEq0a5u5wjGy
      UOij9OWyuEXAMPLE=
   </D>
</RSAKeyValue>
```

## Méthode de signature de politique prédéfinie en C\$1
<a name="canned-policy-signed-url-net"></a>

Le code C\$1 suivant crée une URL signée qui utilise une politique prédéfinie en effectuant les opérations suivantes :
+ Crée une déclaration de politique.
+ Hache la déclaration de politique en utilisant SHA1 et signe le résultat à l'aide de RSA et de la clé privée dont la clé publique correspondante se trouve dans un groupe de clés fiables.
+ Encode en base64 la déclaration de politique hachée et signée, et remplace les caractères spéciaux pour assurer la sécurité de la chaîne utilisée comme paramètre de demande d’URL.
+ Concatène les valeurs.

Pour l’implémentation complète, consultez l’exemple de la rubrique [Code de signature en C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**Note**  
Le `keyId` est renvoyé lorsque vous téléchargez une clé publique sur CloudFront. Pour plus d’informations, consultez ![\[6\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : méthode de signature de politique prédéfinie en C\$1**  <a name="ExampleCannedPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCannedPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string pathToPolicyStmnt, 
    string pathToPrivateKey, string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-pathToPolicyStmnt, 
    // 5-pathToPrivateKey, 6-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);

    // Create the policy statement.
    string strPolicy = CreatePolicyStatement(pathToPolicyStmnt,
        urlString, 
        DateTime.Now, 
        DateTime.Now.Add(timeSpanInterval), 
        "0.0.0.0/0");
    if ("Error!" == strPolicy) return "Invalid time frame." + 
        "Start time cannot be greater than end time.";

    // Copy the expiration time defined by policy statement.
    string strExpiration = CopyExpirationTimeFromPolicy(strPolicy);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    using (SHA1CryptoServiceProvider 
        cryptoSHA1 = new SHA1CryptoServiceProvider())
    {
        bufferPolicy = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA and 
        // create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter rsaFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        rsaFormatter.SetHashAlgorithm("SHA1");
        byte[] signedPolicyHash = rsaFormatter.CreateSignature(bufferPolicy);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedPolicyHash);

        // Concatenate the URL, the timestamp, the signature, 
        // and the key pair ID to form the signed URL.
        return urlString + 
            "?Expires=" + 
            strExpiration + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Méthode de signature de politique personnalisée en C\$1
<a name="custom-policy-signed-url-net"></a>

Le code C\$1 suivant crée une URL signée qui utilise une politique personnalisée en effectuant les opérations suivantes :

1. Crée une déclaration de politique.

1. Encode en base64 la déclaration de politique et remplace les caractères spéciaux pour assurer la sécurité de la chaîne utilisée comme paramètre de demande d’URL.

1. Hache la déclaration de politique en utilisant SHA1 et chiffre le résultat à l'aide de RSA et de la clé privée dont la clé publique correspondante se trouve dans un groupe de clés fiables.

1. Encode en base64 la déclaration de politique hachée et remplace les caractères spéciaux pour assurer la sécurité de la chaîne utilisée comme paramètre de demande d’URL.

1. Concatène les valeurs.

Pour l’implémentation complète, consultez l’exemple de la rubrique [Code de signature en C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**Note**  
Le `keyId` est renvoyé lorsque vous téléchargez une clé publique sur CloudFront. Pour plus d’informations, consultez ![\[6\]](http://docs.aws.amazon.com/fr_fr/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : méthode de signature de politique personnalisée en C\$1**  <a name="ExampleCustomPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCustomPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string startIntervalFromNow, 
    string ipaddress, string pathToPolicyStmnt, string pathToPrivateKey, 
    string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-starttimeFromNow, 
    // 5-ip_address, 6-pathToPolicyStmt, 7-pathToPrivateKey, 8-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);
    TimeSpan timeSpanToStart = GetDurationByUnits(durationUnits, 
        startIntervalFromNow);
    if (null == timeSpanToStart) 
        return "Invalid duration units." + 
            "Valid options: seconds, minutes, hours, or days";
            
    string strPolicy = CreatePolicyStatement(
        pathToPolicyStmnt, urlString, DateTime.Now.Add(timeSpanToStart), 
        DateTime.Now.Add(timeSpanInterval), ipaddress);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Convert the policy statement to URL-safe base64 encoding and 
    // replace unsafe characters + = / with the safe characters - _ ~

    string urlSafePolicy = ToUrlSafeBase64String(bufferPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    byte[] bufferPolicyHash;
    using (SHA1CryptoServiceProvider cryptoSHA1 = 
        new SHA1CryptoServiceProvider())
    {
        bufferPolicyHash = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA 
        // and create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter RSAFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        RSAFormatter.SetHashAlgorithm("SHA1");
        byte[] signedHash = RSAFormatter.CreateSignature(bufferPolicyHash);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedHash);

        return urlString + 
            "?Policy=" + 
            urlSafePolicy + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Méthodes d’utilité pour la génération de signatures
<a name="utility-methods-signed-url"></a>

Les méthodes suivantes obtiennent la déclaration de politique d’un fichier et analyse les intervalles de temps pour la génération des signatures.

**Example : méthodes d’utilité pour la génération de signatures**  <a name="UtilityMethodsForSignatureGeneration"></a>

```
public static string CreatePolicyStatement(string policyStmnt, 
   string resourceUrl, 
   DateTime startTime, 
   DateTime endTime, 
   string ipAddress)
   
{
   // Create the policy statement.
   FileStream streamPolicy = new FileStream(policyStmnt, FileMode.Open, FileAccess.Read);
   using (StreamReader reader = new StreamReader(streamPolicy))
   {
      string strPolicy = reader.ReadToEnd();

      TimeSpan startTimeSpanFromNow = (startTime - DateTime.Now);
      TimeSpan endTimeSpanFromNow = (endTime - DateTime.Now);
      TimeSpan intervalStart = 
         (DateTime.UtcNow.Add(startTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
      TimeSpan intervalEnd = 
         (DateTime.UtcNow.Add(endTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

      int startTimestamp = (int)intervalStart.TotalSeconds; // START_TIME
      int endTimestamp = (int)intervalEnd.TotalSeconds;  // END_TIME

      if (startTimestamp > endTimestamp)
         return "Error!";

      // Replace variables in the policy statement.
      strPolicy = strPolicy.Replace("RESOURCE", resourceUrl);
      strPolicy = strPolicy.Replace("START_TIME", startTimestamp.ToString());
      strPolicy = strPolicy.Replace("END_TIME", endTimestamp.ToString());
      strPolicy = strPolicy.Replace("IP_ADDRESS", ipAddress);
      strPolicy = strPolicy.Replace("EXPIRES", endTimestamp.ToString());
      return strPolicy;
   }   
}

public static TimeSpan GetDuration(string units, string numUnits)
{
   TimeSpan timeSpanInterval = new TimeSpan();
   switch (units)
   {
      case "seconds":
         timeSpanInterval = new TimeSpan(0, 0, 0, int.Parse(numUnits));
         break;
      case "minutes":
         timeSpanInterval = new TimeSpan(0, 0, int.Parse(numUnits), 0);
         break;
      case "hours":
         timeSpanInterval = new TimeSpan(0, int.Parse(numUnits), 0 ,0);
         break;
      case "days":
         timeSpanInterval = new TimeSpan(int.Parse(numUnits),0 ,0 ,0);
         break;
      default:
         Console.WriteLine("Invalid time units;" + 
            "use seconds, minutes, hours, or days");
         break;
   }
   return timeSpanInterval;
}

private static TimeSpan GetDurationByUnits(string durationUnits, 
   string startIntervalFromNow)
{
   switch (durationUnits)
   {
      case "seconds":
         return new TimeSpan(0, 0, int.Parse(startIntervalFromNow));
      case "minutes":
         return new TimeSpan(0, int.Parse(startIntervalFromNow), 0);
      case "hours":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0);
      case "days":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0, 0);
      default:
         return new TimeSpan(0, 0, 0, 0);
   }
}

public static string CopyExpirationTimeFromPolicy(string policyStatement)
{
   int startExpiration = policyStatement.IndexOf("EpochTime");
   string strExpirationRough = policyStatement.Substring(startExpiration + 
      "EpochTime".Length);
   char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
         
   List<char> listDigits = new List<char>(digits);
   StringBuilder buildExpiration = new StringBuilder(20);
         
   foreach (char c in strExpirationRough)
   {
      if (listDigits.Contains(c))
         buildExpiration.Append(c);
   }
   return buildExpiration.ToString();   
}
```

Voir aussi
+ [Créer une signature d’URL avec Perl](CreateURLPerl.md)
+ [Créer une signature d’URL avec PHP](CreateURL_PHP.md)
+ [Créer une signature d’URL avec Java](CFPrivateDistJavaDevelopment.md)

# Créer une signature d’URL avec Java
<a name="CFPrivateDistJavaDevelopment"></a>

Outre l'exemple de code suivant, vous pouvez utiliser [la classe `CloudFrontUrlSigner` utilitaire de AWS SDK pour Java (version 1)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontUrlSigner.html) pour créer des [CloudFront signatures URLs](private-content-signed-urls.md).

Pour plus d'exemples, consultez la section [Création de cookies URLs et de signatures à l'aide d'un AWS SDK](https://docs.aws.amazon.com/code-library/latest/ug/cloudfront_example_cloudfront_CloudFrontUtilities_section.html) dans la bibliothèque de codes d'*exemples de code AWS SDK*. 

**Remarques**  
La création d'une URL signée n'est qu'une partie du processus de [diffusion de contenu privé avec CloudFront](PrivateContent.md). Pour plus d’informations sur la totalité du processus, consultez [Utiliser signé URLs](private-content-signed-urls.md).
Dans l'`Signature.getInstance`appel, notez que cela `SHA1withRSA` peut être remplacé par`SHA256withRSA`.

**Example Méthodes de chiffrement de politiques et de signatures Java**  <a name="ExampleJavaPolicyAndSignatureEncryptionMethods"></a>

```
package org.example;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import software.amazon.awssdk.services.cloudfront.CloudFrontUtilities;
import software.amazon.awssdk.services.cloudfront.model.CannedSignerRequest;
import software.amazon.awssdk.services.cloudfront.url.SignedUrl;

public class Main {

    public static void main(String[] args) throws Exception {
        CloudFrontUtilities cloudFrontUtilities = CloudFrontUtilities.create();
        Instant expirationDate = Instant.now().plus(7, ChronoUnit.DAYS);
        String resourceUrl = "https://a1b2c3d4e5f6g7.cloudfront.net";
        String keyPairId = "K1UA3WV15I7JSD";
        CannedSignerRequest cannedRequest = CannedSignerRequest.builder()
                .resourceUrl(resourceUrl)
                .privateKey(new java.io.File("/path/to/private_key.pem").toPath())
                .keyPairId(keyPairId)
                .expirationDate(expirationDate)
                .build();
        SignedUrl signedUrl = cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);
        String url = signedUrl.url();
        System.out.println(url);

    }
}
```

**Example Exemple de signature de politiques prédéfinies avec SHA256 Java**  <a name="ExampleJavaPolicySHA256AndSignatureEncryptionMethods"></a>

```
package org.example;

import java.io.File;
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Base64;

public class Main {

    public static void main(String[] args) throws Exception {
        String resourceUrl = "https://a1b2c3d4e5f6g7.cloudfront.net/myfile.html";
        String keyPairId = "K1UA3WV15I7JSD";
        Instant expiration = Instant.now().plus(7, ChronoUnit.DAYS);
        PrivateKey privateKey = loadPrivateKey("/path/to/private_key.der");

        System.out.println(createSignedUrl(resourceUrl, keyPairId, privateKey, expiration, "SHA1"));
        System.out.println(createSignedUrl(resourceUrl, keyPairId, privateKey, expiration, "SHA256"));
    }

    static String createSignedUrl(String resourceUrl, String keyPairId,
                                  PrivateKey privateKey, Instant expiration,
                                  String hashAlgorithm) throws Exception {
        long epochSeconds = expiration.getEpochSecond();

        String policy = "{\"Statement\":[{\"Resource\":\"" + resourceUrl
                + "\",\"Condition\":{\"DateLessThan\":{\"AWS:EpochTime\":" + epochSeconds + "}}}]}";

        String jcaAlgorithm = hashAlgorithm.equals("SHA256") ? "SHA256withRSA" : "SHA1withRSA";

        Signature sig = Signature.getInstance(jcaAlgorithm);
        sig.initSign(privateKey);
        sig.update(policy.getBytes("UTF-8"));
        String signature = base64UrlEncode(sig.sign());

        String url = resourceUrl
                + (resourceUrl.contains("?") ? "&" : "?")
                + "Expires=" + epochSeconds
                + "&Signature=" + signature
                + "&Key-Pair-Id=" + keyPairId;

        if (hashAlgorithm.equals("SHA256")) {
            url += "&Hash-Algorithm=SHA256";
        }

        return url;
    }

    static String base64UrlEncode(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes)
                .replace('+', '-')
                .replace('=', '_')
                .replace('/', '~');
    }

    static PrivateKey loadPrivateKey(String path) throws Exception {
        byte[] keyBytes = Files.readAllBytes(new File(path).toPath());
        return KeyFactory.getInstance("RSA")
                .generatePrivate(new PKCS8EncodedKeySpec(keyBytes));
    }
}
```

Voir aussi :
+ [Créer une signature d’URL avec Perl](CreateURLPerl.md)
+ [Créer une signature d’URL avec PHP](CreateURL_PHP.md)
+ [Créer une signature d’URL avec C\$1 et .NET Framework](CreateSignatureInCSharp.md)