Création d'une AWS API demande signée - AWS Identity and Access Management

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.

Création d'une AWS API demande signée

Important

Si vous utilisez un outil AWS SDK (voir Exemple de code et bibliothèques) ou AWS Command Line Interface (AWS CLI) pour envoyer des API demandes AWS, vous pouvez ignorer cette section car les CLI clients SDK et authentifient vos demandes à l'aide des clés d'accès que vous fournissez. À moins que vous n'ayez une bonne raison de ne pas le faire, nous vous recommandons de toujours utiliser un SDK ou leCLI.

Dans les régions qui prennent en charge plusieurs versions de signature, la signature manuelle des demandes signifie que vous devez spécifier la version de signature utilisée. Lorsque vous envoyez des demandes à des points d'accès multirégionaux SDKs et que vous passez CLI automatiquement à l'utilisation de Signature Version 4A sans configuration supplémentaire.

Vous pouvez utiliser le protocole de signature AWS SigV4 pour AWS API créer une demande signée.

  1. Création d'une demande canonique basée sur les détails de la demande.

  2. Calcul d'une signature à l'aide de vos AWS informations d'identification.

  3. Ajouter cette signature à la demande en tant qu'en-tête d'autorisation.

AWS reproduit ensuite ce processus et vérifie la signature, en accordant ou en refusant l'accès en conséquence.

Pour savoir comment utiliser le protocole AWS SigV4 pour signer des API demandes, voir Demander des exemples de signature

Le schéma suivant illustre le processus de signature SigV4, y compris les différents composants de la chaîne que vous créez pour la signature.

Image des parties d'une demande canonique, y compris la chaîne à signer, la clé de signature et la signature.

Le tableau suivant décrit les fonctions présentées dans le schéma. Vous devez implémenter du code pour ces fonctions. Pour plus d'informations, consultez les exemples de code dans le AWS SDKs.

Fonction Description

Lowercase()

Convertit la chaîne en minuscules.

Hex()

Encodage en minuscules en base 16.

SHA256Hash()

Fonction de hachage cryptographique Secure Hash Algorithm (SHA).

HMAC-SHA256()

Calcule à HMAC l'aide de l'SHA256algorithme avec la clé de signature fournie. Il s'agit de la signature finale.

Trim()

Supprimez tous les espaces blancs de début ou de fin.

UriEncode()

URIencodez chaque octet. UriEncode() doit appliquer les règles suivantes :

  • URIencodez chaque octet sauf les caractères non réservés : 'A'-'Z', 'a'-'z', '0'-'9', '-', ' . ',' _ 'et '~'.

  • Le caractère d'espace est un caractère réservé qui doit être codé sous la forme « %20 » (et non sous la forme « + »).

  • Chaque octet URI codé est formé par un « % » et la valeur hexadécimale à deux chiffres de l'octet.

  • Les lettres de la valeur hexadécimale doivent être en majuscules, par exemple « %1A ».

  • Encodez la barre oblique « / » partout sauf dans le nom de la clé de l'objet. Par exemple, si le nom de clé de l'objet est photos/Jan/sample.jpg, la barre oblique du nom de la clé n'est pas encodée.

Important

Les UriEncode fonctions standard fournies par votre plateforme de développement peuvent ne pas fonctionner en raison de différences de mise en œuvre et de l'ambiguïté associée au niveau du sous-jacentRFCs. Nous vous recommandons d'écrire votre propre UriEncode fonction personnalisée pour garantir le bon fonctionnement de votre encodage.

Pour voir un exemple de UriEncode fonction en Java, consultez la section Utilitaires Java sur le GitHub site Web.

Note

Lorsque vous signez vos demandes, vous pouvez utiliser la version 4 de AWS signature ou AWS la version 4A de signature. La principale différence entre les deux est déterminée par la façon dont la signature est calculée. Avec AWS la version 4A de Signature, la signature n'inclut pas d'informations spécifiques à la région et est calculée à l'aide de l'AWS 4-ECDSA-P256-SHA256algorithme.

Signature de demandes avec des informations de sécurité temporaires

Au lieu d'utiliser des informations d'identification à long terme pour signer une demande, vous pouvez utiliser des informations de sécurité temporaires fournies par AWS Security Token Service (AWS STS).

Lorsque vous utilisez des informations d'identification de sécurité temporaires, vous devez les ajouter X-Amz-Security-Token à l'en-tête d'autorisation ou les inclure dans la chaîne de requête pour contenir le jeton de session. Certains services nécessitent que vous ajoutiez X-Amz-Security-Token à la requête canonique. Pour les autres services, vous n’avez qu’à ajouter X-Amz-Security-Token à la fin, une fois que vous avez calculé la signature. Consultez la documentation de chacun Service AWS pour connaître les exigences spécifiques.

Récapitulatif des étapes de signature

Créez une demande canonique :

Organisez le contenu de votre demande (hôte, action, en-têtes, etc.) dans un format standard canonique. La requête canonique est l'une des entrées utilisées pour créer la chaîne à signer. Pour plus de détails sur la création de la demande canonique, consultezÉléments d'une signature AWS API de demande.

Création d'un hachage de la demande canonique

Hachez la demande canonique en utilisant le même algorithme que celui que vous avez utilisé pour créer le hachage de la charge utile. Le hachage de la requête canonique est une chaîne de caractères hexadécimaux en minuscules.

Création d'une chaîne à signer

Créez une chaîne à signer avec la demande canonique et des informations supplémentaires telles que l'algorithme, la date de la demande, l'étendue des informations d'identification et le hachage de la demande canonique.

Dériver une clé de signature

Effectuez une succession d'opérations de hachage par clé (HMAC) à la date, à la région et au service de la demande, en utilisant votre clé d'accès AWS secrète comme clé pour l'opération de hachage initiale.

Calculez la signature

Effectuez une opération de hachage par clé (HMAC) sur la chaîne à signer en utilisant la clé de signature dérivée comme clé de hachage.

Ajoutez la signature à la demande

Ajoutez la signature calculée à un HTTP en-tête ou à la chaîne de requête de la demande.

Création d'une demande canonique

Pour créer une demande canonique, concaténez les chaînes suivantes, séparées par des caractères de nouvelle ligne. Cela permet de garantir que la signature que vous calculez peut correspondre à la signature AWS calculée.

<HTTPMethod>\n <CanonicalURI>\n <CanonicalQueryString>\n <CanonicalHeaders>\n <SignedHeaders>\n <HashedPayload>
  • HTTPMethod — La HTTP méthode, telle que GETPUT,HEAD, etDELETE.

  • CanonicalUri URI— La version codée du composant de chemin absoluURI, en commençant par le / qui suit le nom de domaine et jusqu'à la fin de la chaîne ou jusqu'au point d'interrogation (?) si vous avez des paramètres de chaîne de requête. Si le chemin absolu est vide, utilisez une barre oblique (/). URIDans l'exemple suivant,/amzn-s3-demo-bucket/myphoto.jpg, est le chemin absolu et vous ne le codez pas / dans le chemin absolu :

    http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg
  • CanonicalQueryString — Les paramètres de chaîne de requête URI codés. Vous URI encodez chaque nom et chaque valeur individuellement. Vous devez également trier les paramètres de la chaîne de requête canonique par ordre alphabétique par nom de clé. Le tri s'effectue après l'encodage. Dans l'URIexemple suivant, la chaîne de requête est la suivante :

    http://s3.amazonaws.com/amzn-s3-demo-bucket?prefix=somePrefix&marker=someMarker&max-keys=2

    La chaîne de requête canonique est la suivante (des sauts de ligne sont ajoutés à cet exemple pour faciliter la lecture) :

    UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix")

    Lorsqu'une demande cible une sous-ressource, la valeur du paramètre de requête correspondante sera une chaîne vide (""). Par exemple, ce qui suit URI identifie la ACL sous-ressource du amzn-s3-demo-bucket bucket :

    http://s3.amazonaws.com/amzn-s3-demo-bucket?acl

    Dans ce cas, il s' CanonicalQueryString agirait de :

    UriEncode("acl") + "=" + ""

    S'il URI n'inclut pas un?, il n'y a pas de chaîne de requête dans la demande et vous définissez la chaîne de requête canonique sur une chaîne vide (""). Vous devrez toujours inclure le caractère de nouvelle ligne ("\n").

  • CanonicalHeaders — Liste des en-têtes de requêtes avec leurs valeurs. Les paires de nom d'en-tête et de valeur individuelles sont séparées par le caractère de nouvelle ligne ("\n"). Voici un exemple de CanonicalHeader :

    Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n" Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n" ... Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"

    CanonicalHeaders la liste doit inclure les éléments suivants :

    • HTTPhosten-tête.

    • Si l'Content-Typeen-tête est présent dans la demande, vous devez l'ajouter au CanonicalHeaders liste.

    • Les en-têtes x-amz-* que vous prévoyez d'inclure dans votre demande doivent également être ajoutés. Par exemple, si vous utilisez des informations d'identification de sécurité temporaires, vous devez inclure x-amz-security-token dans votre demande. Vous devez ajouter cet en-tête dans la liste des CanonicalHeaders.

    Note

    L'x-amz-content-sha256en-tête est obligatoire pour les AWS requêtes Amazon S3. Il fournit un hachage de la charge utile de la requête. S'il n'y a pas de charge utile, vous devez fournir le hachage d'une chaîne vide.

    Chaque nom d'en-tête doit :

    • utiliser des caractères minuscules ;

    • apparaître par ordre alphabétique ;

    • être suivi de deux points (:).

    Pour les valeurs, vous devez :

    • supprimer toutes les espaces de début ou de fin ;

    • convertir des espaces séquentielles en une espace unique ;

    • séparez les valeurs d'un en-tête à valeurs multiples par des virgules.

    • Vous devez inclure l'en-tête de l'hôte (HTTP/1.1) ou l'en-tête:authority (HTTP/2), ainsi que tous x-amz-* les en-têtes de la signature. Vous pouvez éventuellement inclure d'autres en-têtes standard dans la signature, tels que content-type.

    Les fonctions Lowercase() et Trim() utilisées dans cet exemple sont décrites dans la section précédente.

    L'exemple suivant est une chaîne CanonicalHeaders. Les noms d'en-tête sont en minuscules et sont triés.

    host:s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130708T220855Z

    Note

    Aux fins du calcul d'une signature d'autorisation, seuls l'hôte et les en-têtes x-amz-* sont obligatoires. Toutefois, afin d'éviter toute altération des données, vous devez envisager d'inclure tous les en-têtes dans le calcul de la signature.

  • SignedHeaders — Une liste triée par ordre alphabétique et séparée par des points-virgules de noms d'en-têtes de demande en minuscules. Les en-têtes de demande de la liste sont les mêmes que ceux que vous avez inclus dans la chaîne CanonicalHeaders. Dans l'exemple précédent, la valeur de SignedHeaders serait le suivant :

    host;x-amz-content-sha256;x-amz-date
  • HashedPayload — Chaîne créée à l'aide de la charge utile contenue dans le corps de la HTTP demande comme entrée d'une fonction de hachage. Cette chaîne utilise des caractères hexadécimaux minuscules.

    Hex(SHA256Hash(<payload>>))

    Si la demande ne contient aucune charge utile, vous calculez un hachage de la chaîne vide. Par exemple, lorsque vous récupérez un objet à l'aide d'une GET demande, il n'y a rien dans la charge utile.

    Hex(SHA256Hash(""))
    Note

    Pour Amazon S3, incluez la chaîne littérale UNSIGNED-PAYLOAD lors de la création d'une demande canonique et définissez la même valeur que la valeur d'x-amz-content-sha256en-tête lors de l'envoi de la demande.

    Hex(SHA256Hash("UNSIGNED-PAYLOAD"))

Création d'un hachage de la demande canonique

Créez un hachage (digest) de la requête canonique avec le même algorithme que celui que vous avez utilisé pour créer le hachage de la charge utile. Le hachage de la requête canonique est une chaîne de caractères hexadécimaux en minuscules.

Créez une chaîne à signer

Pour créer une chaîne à signer, concaténez les chaînes suivantes, séparées par des caractères de nouvelle ligne. Ne terminez pas cette chaîne par un caractère de saut de ligne.

Algorithm \n RequestDateTime \n CredentialScope \n HashedCanonicalRequest
  • Algorithm — Algorithme utilisé pour créer le hachage de la demande canonique. Pour SHA -256, l'algorithme estAWS4-HMAC-SHA256.

  • RequestDateTime — Date et heure utilisées dans le champ d'application des informations d'identification. Cette valeur correspond à l'UTCheure actuelle au format ISO 8601 (par exemple,20130524T000000Z).

  • CredentialScope — L'étendue des informations d'identification, qui limite la signature résultante à la région et au service spécifiés. Le format de la chaîne est le suivant : YYYYMMDD/region/service/aws4_requête.

  • HashedCanonicalRequest — Le hachage de la demande canonique, calculé à l'étape précédente.

L'exemple suivant est une chaîne de connexion.

"AWS4-HMAC-SHA256" + "\n" + timeStampISO8601Format + "\n" + <Scope> + "\n" + Hex(SHA256Hash(<CanonicalRequest>))

Dériver une clé de signature

Pour obtenir une clé de signature, effectuez une succession d'opérations de hachage par clé (HMAC) à la date de la demande, dans la région et au service, en utilisant votre clé d'accès AWS secrète comme clé pour l'opération de hachage initiale.

Pour chaque étape, appelez la fonction de hachage avec la clé et les données requises. Le résultat de chaque appel à la fonction de hachage devient l'entrée du prochain appel à la fonction de hachage.

L'exemple suivant montre comment vous déduisez la valeur SigningKey utilisée dans la section suivante de cette procédure, en indiquant l'ordre dans lequel votre entrée est concaténée et hachée. HMAC-SHA256est la fonction de hachage utilisée pour hacher les données comme indiqué.

DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
Entrée obligatoire
  • Key, une chaîne qui contient votre clé d'accès secrète.

  • Date, une chaîne qui contient la date utilisée dans le champ d'application des informations d'identification, au format YYYYMMDD.

  • Region, une chaîne qui contient le code de région (par exemple,us-east-1).

    Pour obtenir la liste des chaînes de régions, consultez la section Points de terminaison régionaux dans le Références générales AWS.

  • Service, une chaîne qui contient le code du service (par exemple,ec2).

  • Chaîne de connexion que vous avez créée à l'étape précédente.

Pour dériver une clé de signature
  1. Concaténation "AWS4" et clé d'accès secrète. Appelez la fonction de hachage avec la chaîne concaténée en tant que clé et la chaîne de date en tant que données.

    DateKey = hash("AWS4" + Key, Date)
  2. Appelez la fonction de hachage en utilisant le résultat de l'appel précédent en tant que clé et la chaîne Région en tant que données.

    DateRegionKey = hash(kDate, Region)
  3. Appelez la fonction de hachage en utilisant le résultat de l'appel précédent en tant que clé et la chaîne de service en tant que données.

    Le code de service est défini par le service. Vous pouvez utiliser get-products dans les AWS tarifs CLI pour renvoyer le code de service correspondant à un service.

    DateRegionServiceKey = hash(kRegion, Service)
  4. Appelez la fonction de hachage en utilisant le résultat de l'appel précédent en tant que clé et « aws4_request » en tant que données.

    SigningKey = hash(kService, "aws4_request")

Calculez la signature

Une fois que vous avez dérivé la clé de signature, calculez la signature en effectuant une opération de hachage par clé sur la chaîne à signer. Utilisez la clé de signature dérivée comme la clé de hachage pour cette opération.

Pour calculer une signature
  1. Appelez la fonction de hachage en utilisant le résultat de l'appel précédent en tant que clé et la chaîne de signature en tant que données. Le résultat est la signature sous forme de valeur binaire.

    signature = hash(SigningKey, string-to-sign)
  2. Convertissez la signature de la représentation binaire à la représentation hexadécimale, en caractères minuscules.

Ajoutez la signature à la demande

Ajoutez la signature calculée à votre demande.

Exemple : en-tête d'autorisation

L'exemple suivant montre un entête Authorization pour l'action DescribeInstances. Pour des raisons de lisibilité, cet exemple est formaté avec des sauts de ligne. Dans votre code, il doit s'agir d'une chaîne continue. Il n'y a pas de virgule entre l'algorithme et Credential. Toutefois, les autres éléments doivent être séparés par des virgules.

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request, SignedHeaders=host;x-amz-date, Signature=calculated-signature
Exemple : requête avec des paramètres d'authentification dans la chaîne de requête

L'exemple suivant présente une requête pour l'action DescribeInstances qui inclut les informations d'authentification. Pour des raisons de lisibilité, cet exemple est formaté avec des sauts de ligne et n'est pas URL codé. Dans votre code, la chaîne de requête doit être une chaîne continue URL codée.

https://ec2.amazonaws.com/? Action=DescribeInstances& Version=2016-11-15& X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request& X-Amz-Date=20220830T123600Z& X-Amz-SignedHeaders=host;x-amz-date& X-Amz-Signature=calculated-signature