Comment résoudre les problèmes liés à une URL signée ou à des cookies signés dans CloudFront ?

Date de la dernière mise à jour : 02/06/2022

Je sécurise le contenu privé à l'aide d'Amazon CloudFront et d'une URL signée ou de cookies signés. Je reçois une erreur 403 Accès refusé. Comment puis-je résoudre cette erreur ?

Brève description

Amazon CloudFront peut renvoyer une erreur 403 Accès refusé en cas de problème avec une URL signée ou des cookies signés. Consultez les sections de résolution suivantes pour connaître les causes de cette erreur et les étapes de dépannage.

Résolution

Lorsque vous activez Restrict Viewer Access (Restreindre l'accès au lecteur) dans un comportement, vous devez spécifier un signataire. Un signataire est soit un groupe de clés autorisé que vous créez dans CloudFront, soit un compte AWS qui contient une paire de clés CloudFront. Les messages d'erreur 403 suivants indiquent que les informations du signataire sont manquantes ou incorrectes :

Erreur 403 Accès refusé avec le message « Missing Key-Pair-Id query parameter or cookie value. » (« Paramètre de requête Key-Pair-Id manquant ou valeur de cookie »).

Ce message indique que le paramètre de chaîne de requête Key-Pair-ID est manquant ou vide dans une URL signée.

Erreur 403 Accès refusé avec le message « Missing Key-Pair-Id query parameter or cookie value. » (« Paramètre de requête Key-Pair-Id manquant ou valeur de cookie »).

Ce message indique que le paramètre de chaîne de requête CloudFront-Key-Pair-ID est manquant ou vide dans le cookie signé.

Erreur 403 Accès refusé avec le message « Unknown Key. » (« Clé inconnue »).

Ce message indique que CloudFront ne peut pas vérifier les informations du signataire via Key-Pair-ID (pour les URL signées) ou CloudFront Key-Pair-ID (pour les cookies signés). Pour résoudre ce problème, vérifiez que la valeur correcte de Key-Pair-ID est utilisé pour une URL signée ou un CloudFront-Key-Pair-ID pour les cookies signés. Tout d'abord :

Si vous utilisez une URL signée, recherchez et notez la valeur de Key-Pair-ID.
-ou-
Si vous utilisez des cookies signés, recherchez et notez la valeur de CloudFront-Key-Pair-ID.

Ensuite, recherchez le Key ID (ID de clé) et confirmez qu'il correspond au Key-Pair-ID ou au CloudFront-Key-Pair-ID :

  1. Ouvrez la console CloudFront. Dans le menu de navigation de gauche, choisissez Distributions.
  2. Choisissez votre distribution. Choisissez l'onglet Behaviors (Comportements).
  3. Sélectionnez le nom du comportement, puis choisissez Edit (Modifier).
  4. Recherchez le paramètre Restrict viewer access (Restreindre l'accès au lecteur).
    Remarque : s'il est défini sur Yes (Oui), les demandes de fichiers qui correspondent au modèle de chemin de ce comportement de cache doivent utiliser l'URL signée ou le cookie signé.
  5. Après avoir confirmé que le champ Restrict viewer access (Restreindre l'accès au lecteur) est défini sur Yes (Oui), vérifiez le champ Trusted authorization type (Type d'autorisation autorisé).
  6. Si la valeur du paramètre Trusted authorization type (Type d'autorisation autorisé) est Trusted key groups (Groupes de clés autorisés), notez le nom du groupe de clés autorisé.
    Recherchez ensuite les ID de clé publique d'un groupe de clés autorisé : retournez dans la console CloudFront. Choisissez Key Groups (Groupes de clés). Dans la liste des groupes de clés, choisissez le nom du groupe de clés autorisé que vous avez noté.
    Vérifiez que la valeur de Key-Pair-Id ou de CloudFront-Key-Pair-ID que vous avez notée à l'étape 1 correspond à l'un des ID de clé publique du groupe de clés autorisé.
  7. Si la valeur de Trusted authorization type (Type d'autorisation autorisé) est Trusted Signer (Signataire autorisé), les informations d'identification CloudFront générées par AWS sont utilisées. Dans ce cas, la valeur de Key-Pair-Id ou de CloudFront-Key-Pair-ID que vous avez notée à l'étape 1 doit correspondre au Access Key ID (ID de clé d'accès) des informations d'identification CloudFront.
    Pour trouver l'ID de clé d'accès des informations d'identification CloudFront, consultez la section Création de paires de clés pour vos signataires.

Lorsque vous créez une URL signée ou un cookie signé, une déclaration de politique au format JSON spécifie les restrictions applicables à l'URL signée. Cette instruction détermine la durée de validité de l'URL. CloudFront renvoie l'erreur 403 Accès refusé si :

  • Une URL signée est envoyée à une heure ultérieure à la valeur de Expires dans une URL signée à l'aide d'une politique prédéfinie.
  • Un cookie signé est envoyé à une heure ultérieure à la valeur de CloudFront-Expires dans un cookie signé à l'aide d'une politique prédéfinie.
  • Une URL signée ou un cookie signé est envoyé à une heure ultérieure à la valeur de DateLessThan ou antérieure à la valeur de DateGreaterThan dans la politique personnalisée.

Remarque : les valeurs dans Expires, CloudFront-Expires, DateLessThan et DateGreaterThan sont au format d'heure Unix (en secondes) et en temps universel coordonné (UTC). Par exemple, le 1er janvier 2013 à 10 h 00 UTC est converti en 1357034400 au format d'heure Unix. Si vous utilisez l'heure d'époque, utilisez un entier 32 bits pour une date au plus tard 2147483647 (19 janvier 2038 à 03 h 14 min 07 UTC).

Le paramètre Policy dans une URL signée ou l'attribut CloudFrontPolicy dans un cookie signé indique qu'une politique personnalisée est utilisée. La déclaration de politique est au format JSON et encodée en base64. Pour connaître la valeur de DateLessThan ou DateGreaterThan, utilisez une commande de décodage 64base.

Voici un exemple de politique personnalisée d'encodage base64 :

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

Utilisez la commande Linux suivante pour décoder la politique personnalisée au format encodé base64 au format JSON. Cet exemple utilise la valeur de l'exemple précédent. Remplacez la par votre propre politique personnalisée.

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

Le résultat de la commande est similaire à ce qui suit :

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

CloudFront renvoie une erreur 403 Accès refusé si plusieurs instructions sont incluses dans la politique prédéfinie ou la politique personnalisée.

Pour résoudre le problème, utilisez la commande Linux de la section précédente pour vérifier la déclaration de politique personnalisée. Vérifiez les détails de votre code et assurez-vous qu'une seule déclaration est incluse dans la politique prédéfinie ou la politique personnalisée.

CloudFront renvoie une erreur 403 Accès refusé si :

  • L'URL de base dans la ressource clé de la déclaration de politique possède une URL abrégée (www.exemple.com). Utilisez une URL complète (http://www.example.com).
  • Le codage des caractères de l'URL de base n'est pas UTF-8.
  • L'URL de base n'inclut pas toutes les ponctuations et tous les noms de paramètres.
  • Le protocole HTTP ou HTTPS de l'URL de base ne correspond pas au protocole utilisé dans une requête qui envoie une URL signée ou des cookies signés.
  • Le nom de domaine dans l'URL de base ne correspond pas à la valeur de l'en-tête Host (hôte) utilisé par l'agent utilisateur qui envoie une URL signée ou des cookies signés.
  • La chaîne de requête URL de base inclut des caractères qui ne sont pas valides.

CloudFront renvoie une erreur 403 Accès refusé si :

  • La déclaration de politique inclut des espaces blancs (y compris des tabulations et des caractères de nouvelle ligne).
  • La politique prédéfinie ou la politique personnalisée n'est pas formatée en tant que chaîne avant d'être hachée. Cela peut se produire si vous créez une URL signée ou un cookie signé sans utiliser de kit SDK AWS.
  • La politique n'a pas été hachée avant de générer la signature. Cela peut se produire si vous créez une URL signée ou un cookie signé sans utiliser de kit SDK AWS.

Pour connaître les meilleures pratiques en matière de signature lors de l'utilisation d'une URL signée ou de cookies signés, veuillez consulter les Exemples de code pour créer une signature pour une URL signée.

CloudFront renvoie une erreur 403 Accès refusé si :

  • Une URL signée ou des cookies signés ont été envoyés à partir d'une adresse IP IPv6.
  • Une URL signée ou des cookies signés n'ont pas été envoyés à partir d'une adresse IPv4 ou d'une plage IPv4 spécifiée dans la politique personnalisée.

La clé IpAddress est uniquement disponible dans la politique personnalisée dans une URL signée ou un cookie signé. Les adresses IP au format IPv6 ne sont pas prises en charge. Si vous utilisez une politique personnalisée qui inclut IpAddress, n'activez pas IPv6 pour la distribution.

CloudFront renvoie une erreur 403 Accès refusé si des cookies sont renvoyés par CloudFront mais n'ont pas été inclus dans les requêtes suivantes adressées au même domaine. Dans ce cas, vérifiez les attributs de cookie Domain (Domaine) et Path (Chemin) dans l'en-tête de réponse Set-Cookie.

La valeur Domain (Domaine) est le nom de domaine du fichier demandé. Si vous ne spécifiez pas d'attribut Domain (Domaine), la valeur par défaut est le nom de domaine dans l'URL. Cela s'applique uniquement au nom de domaine spécifié, pas aux sous-domaines. Si vous spécifiez un attribut Domain (Domaine), il s'applique également aux sous-domaines.

Si vous spécifiez un attribut Domain (Domaine), le nom de domaine dans l'URL et la valeur de l'attribut Domain (Domaine) doivent correspondre. Vous pouvez spécifier le nom de domaine que CloudFront attribue à votre distribution (par exemple, d111111abcdef8.cloudfront.net), mais vous ne pouvez pas spécifier *.cloudfront.net pour le nom de domaine. Pour utiliser un autre nom de domaine (tel que exemple.com) dans les URL, ajoutez unalternate domain name (nom de domaine aternatif) à votre distribution.

La valeur Path (Chemin) est le chemin du fichier demandé. Si vous ne spécifiez pas d'attribut Path (Chemin), la valeur par défaut est le chemin dans l'URL.


Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?