Création d’une requête d’API AWS signée - AWS Identity and Access Management

Création d’une requête d’API AWS signée

Voici un aperçu du processus de création d’une requête signée. Pour plus d'informations, consultez les exemples de code dans les SDK AWS.

Étape 1 : créer une requête canonique

Créez une requête canonique en concaténant les chaînes suivantes, séparées par des fins de ligne. Cela permet de garantir la correspondance entre la signature que vous calculez et la signature calculée par AWS.

HTTPMethod CanonicalUri CanonicalQueryString CanonicalHeaders SignedHeaders HashedPayload
  • HTTPMethod : méthode HTTP.

  • CanonicalURI : version codée en URI de l'URL du composant du chemin absolu (tout ce qui se trouve entre l'hôte et le point d'interrogation (?) qui lance les paramètres de la chaîne de requête). Si le chemin d'accès absolu est vide, utilisez un caractère barre oblique (/).

  • CanonicalQueryString : paramètres de chaîne de requête codés en URL, séparés par des esperluettes (&). Encodez avec des pourcentages les caractères réservés, y compris le caractère d'espace. Encodez les noms et les valeurs séparément. S'il existe des paramètres vides, ajoutez le signe égal au nom du paramètre avant de l'encoder. Après le codage, triez les paramètres par nom de clé dans l’ordre alphabétique. S'il n'y a pas de chaîne de requête, utilisez une chaîne vide (« »).

  • CanonicalHeaders : entêtes de requête qui seront signés et leurs valeurs, séparés par des fins de ligne. Les noms d'en-tête doivent utiliser des caractères minuscules, apparaître dans l'ordre alphabétique et être suivis de deux points (:). Pour les valeurs, éliminez les espaces de début et de fin, convertissez les espaces séquentiels en un seul espace et séparez les valeurs d'un en-tête à valeurs multiples à l'aide de virgules. Vous devez inclure l'en-tête host (HTTP/1.1) ou l'en-tête :authority (HTTP/2), ainsi que tout en-tête x-amz-* dans la signature. Vous pouvez éventuellement inclure d'autres en-têtes standard dans la signature, tels que content-type.

  • SignedHeaders : liste des en-têtes que vous avez inclus dans CanonicalHeaders, séparés par des points-virgules (;). Cela indique quels en-têtes font partie du processus de signature. Les noms d'en-tête doivent utiliser des caractères minuscules et apparaître dans l'ordre alphabétique.

  • HashedPayload : chaîne créée en utilisant la charge utile contenue dans le corps de la requête HTTP comme entrée dans une fonction de hachage. Cette chaîne utilise des caractères hexadécimaux minuscules. Si la charge utile est vide, utilisez une chaîne vide comme entrée de la fonction de hachage.

Voici un exemple de requête canonique qui appelle l'action de l'API DescribeInstances Amazon EC2.

GET / Action=DescribeInstances&Version=2016-11-15 content-type:application/x-www-form-urlencoded; charset=utf-8 host:ec2.amazonaws.com x-amz-date:20220830T123600Z host;x-amz-date payload-hash

Étape 2 : créer un hachage de la requête 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.

Étape 3 : créer une chaîne de connexion

Créez une chaîne en concaténant les chaînes suivantes, séparées par des fins de ligne. Ne terminez pas cette chaîne par un caractère de saut de ligne.

Algorithm RequestDateTime CredentialScope HashedCanonicalRequest
  • Algorithme : algorithme utilisé pour créer le hachage de la requête canonique. Pour SHA-256, l’algorithme est AWS4-HMAC-SHA256.

  • RequestDateTime :date et heure utilisées dans l’étendue des informations d'identification.

  • CredentialScope : étendue des informations d'identification. Cela limite la signature résultante à la région et au service spécifiés. La chaîne a le format suivant : AAAAMMJJ/region/service/aws4_request.

  • HashedCanonicalRequest : hachage de la requête canonique.

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

AWS4-HMAC-SHA256 20220830T123600Z 20220830/us-east-1/ec2/aws4_request canonical-request-hash

Étape 4 : calculer la signature

Après avoir créé la chaîne à signer, vous êtes prêt à calculer la signature pour les informations d'authentification que vous ajouterez à votre requête. Pour chaque étape, appelez la fonction de hachage avec la clé et les données requises.

hash(key, data)

Le résultat de chaque appel à la fonction de hachage devient l'entrée du prochain appel à la fonction de hachage.

Entrée obligatoire
  • Chaîne, Key, contenant votre clé d'accès secrète

  • Chaîne Date contenant la date utilisée dans l'étendue des informations d'identification, au format AAAAMMJJ

  • Chaîne, Region, contenant le code Région (par exemple, us-east-1)

  • Chaîne, Service, contenant le code de service (par exemple, ec2)

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

Pour calculer la signature
  1. Concaténez « AWS4 » et la 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.

    kDate = 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.

    kRegion = 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.

    kService = 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.

    kSigning = hash(kService, "aws4_request")
  5. 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(kSigning, string-to-sign)
  6. Convertissez la signature de la représentation binaire à la représentation hexadécimale, en caractères minuscules.

Étape 5 : ajouter la signature à la requête

Vous pouvez ajouter des informations d'authentification à une requête à l'aide de l'en-tête AuthorizationHTTP ou des paramètres de chaîne de requête. Vous ne pouvez pas ajouter d'informations d'authentification en utilisant à la fois les paramètres d'en-tête Authorization et de chaîne de requête.

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 code en URL. Dans votre code, la chaîne de requête doit être une chaîne continue codée en URL.

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

informations d'identification de sécurité temporaires

Au lieu d'utiliser des informations d'identification à long terme pour signer une requête, vous pouvez utiliser des informations d'identification 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 ajouterX-Amz-Security-Token à l'en-tête Authorization ou à 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 chaque Service AWS pour plus de détails.

Exemples de code dans les SDK AWS

Les SDK AWS incluent un code source de GitHub qui montre comment signer les requêtes d’API AWS.