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.
Table des matières
É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êtehost
(HTTP/1.1) ou l'en-tête:authority
(HTTP/2), ainsi que tout en-têtex-amz-*
dans la signature. Vous pouvez éventuellement inclure d'autres en-têtes standard dans la signature, tels quecontent-type
. -
SignedHeaders
: liste des en-têtes que vous avez inclus dansCanonicalHeaders
, 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 estAWS4-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èteChaîne
Date
contenant la date utilisée dans l'étendue des informations d'identification, au format AAAAMMJJChaî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
-
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)
-
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)
-
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)
-
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")
-
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
) -
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 Authorization
HTTP 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.
-
AWS SDK for .NET – AWS4Signer.cs
-
AWS SDK for C++ – AWSAuthV4Signer.cpp
-
AWS SDK for Go – v4.go
-
AWS SDK for Java – BaseAws4Signer.java
-
AWS SDK for JavaScript – v4.js
-
AWS SDK for PHP – SignatureV4.php
-
AWS SDK for Python (Boto) – signers.py
-
AWS SDK for Ruby – signer.rb