Amazon Web Services
Référence générale (Version 1.0)

Processus de signature Signature Version 2

Vous pouvez utiliser Signature Version 2 pour signer les demandes d'API. Cependant, nous vous recommandons de signer votre demande avec Signature Version 4. Pour plus d'informations, consultez Processus de signature Signature Version 4.

Régions et services pris en charge

Les régions suivantes ne prennent pas en charge Signature Version 2. Vous devez utiliser Signature Version 4 pour signer les demandes d'API dans les régions suivantes :

  • Région USA Est (Ohio)

  • Région Canada (Centre)

  • Région Asie-Pacifique (Mumbai)

  • Région Asie-Pacifique (Séoul)

  • Région UE (Francfort)

  • Région UE (Londres)

  • Région Chine (Pékin)

Les services suivants prennent en charge Signature Version 2 dans toutes les autres régions.

Services AWS prenant en charge Signature Version 2

Amazon EC2 Auto Scaling

Référence de l'API Amazon EC2 Auto Scaling

AWS CloudFormation

AWS CloudFormation API Reference

Amazon CloudWatch

Amazon CloudWatch API Reference

AWS Elastic Beanstalk

AWS Elastic Beanstalk API Reference

Amazon Elastic Compute Cloud (Amazon EC2)

Amazon EC2 API Reference

Elastic Load Balancing

Elastic Load Balancing API Reference version 2012-06-01

Amazon EMR

Amazon EMR API Reference

Amazon ElastiCache

Amazon ElastiCache API Reference

AWS Identity and Access Management (IAM)

IAM API Reference

AWS Import/Export

AWS Import/Export API Reference

Amazon Relational Database Service (Amazon RDS

Amazon RDS API Reference

Amazon Simple Notification Service (Amazon SNS)

Amazon Simple Notification Service API Reference

Amazon Simple Queue Service (Amazon SQS)

Amazon Simple Queue Service API Reference

Amazon SimpleDB

Amazon SimpleDB Référence d'API

Composants d'une demande Query pour Signature Version 2

AWS exige que chaque demande Query HTTP ou HTTPS au format Signature Version 2 contienne les éléments suivants :

Point de terminaison

Egalement appelé partie hôte d'une demande HTTP. Il s'agit du nom DNS de l'ordinateur sur lequel vous envoyez la demande Query. Il est différent pour chaque région AWS. Pour connaître la liste des points de terminaison pour chaque service, consultez Régions et points de terminaison AWS.

Action

Action que vous souhaitez qu'un service web effectue. Cette valeur détermine les paramètres utilisés dans la demande.

AWSAccessKeyId

Valeur distribuée par AWS lorsque vous vous inscrivez à un compte AWS.

SignatureMethod

Protocole basé sur le hachage utilisé pour calculer la signature. Pour Signature Version 2, il peut s'agir de HMAC-SHA1 ou HMAC-SHA256.

SignatureVersion

Version du protocole de signature AWS.

Horodatage

Heure d'envoi de la demande. Incluez cette valeur dans la demande Query pour empêcher des tiers de l'intercepter.

Paramètres obligatoires et facultatifs

Chaque action a un ensemble de paramètres obligatoires et facultatifs qui définissent l'appel d'API.

Signature

Valeur calculée qui garantit que la signature est valide et n'a pas été falsifiée.

Voici un exemple de demande Query Amazon EMR au format de demande HTTPS GET.

  • Le point de terminaison, elasticmapreduce.amazonaws.com, est le point de terminaison par défaut, mappé à la région us-east-1.

  • L'action est DescribeJobFlows, qui demande des informations sur un ou plusieurs flux de travail.

Note

Dans la demande Query réelle, il n'y a aucun espace, ni aucun saut de ligne. La demande est une ligne de texte continue. La version ci-dessous a été mise en forme de façon à faciliter la lecture.

https://elasticmapreduce.amazonaws.com? &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &Action=DescribeJobFlows &SignatureMethod=HmacSHA256 &SignatureVersion=2 &Timestamp=2011-10-03T15%3A19%3A30 &Version=2009-03-31 &Signature=calculated value

Comment générer une signature Signature Version 2 pour une demande Query

Les demandes de service web sont envoyées via Internet et sont vulnérables aux falsifications. Pour vérifier que la demande n'a pas été modifiée, AWS calcule la signature pour déterminer si un des paramètres ou une valeur de paramètre a été modifié en cours de route. AWS exige une signature dans chaque demande.

Note

Veillez à ce qu'URI code la demande. Par exemple, les espaces dans votre demande doivent être codés sous la forme %20. Bien qu'un espace non codé soit normalement autorisé par la spécification du protocole HTTP, les caractères non codés créent une signature non valide dans votre demande Query. Ne codez pas les espaces sous la forme d'un signe plus (+) car cela entraîne des erreurs.

Les rubriques suivantes décrivent les étapes nécessaires pour calculer une signature à l'aide d'AWS Signature Version 2.

Tâche 1 : formater la demande Query

Pour pouvoir signer la demande Query, formatez-la en utilisant un format normalisé (canonique). Cette étape est nécessaire car les différentes façons de formater une demande Query aboutissent à différentes signatures HMAC. Formatez la demande dans un format canonique avant de la signer. Cela garantit que votre application et AWS calculeront la même signature pour une demande.

Pour créer la chaîne à signer, vous devez concaténer les composants de la demande Query. L'exemple suivant génère la chaîne à signer pour l'appel suivant de l'API Amazon EMR.

https://elasticmapreduce.amazonaws.com? Action=DescribeJobFlows &Version=2009-03-31 &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2011-10-03T15:19:30

Note

Dans la demande précédente, les quatre derniers paramètres (AWSAccessKeyID à Timestamp) sont appelés les paramètres d'authentification. Ils sont obligatoires dans chaque demande Signature Version 2. AWS les utilise pour identifier la personne qui envoie la demande et déterminer s'il convient d'accorder l'accès demandé.

Pour créer la chaîne à signer (Signature Version 2)

  1. Commencez par la méthode de demande (GET ou POST), suivie d'un caractère de saut de ligne. Pour faciliter la lecture, le caractère de saut de ligne est représenté sous la forme \n.

    GET\n
  2. Ajoutez l'en-tête d'hôte HTTP (point de terminaison) en minuscules, suivi d'un caractère de saut de ligne. Les informations sur le port sont omises s'il s'agit du port standard pour le protocole (le port 80 pour HTTP et le port 443 pour HTTPS), mais elles sont incluses s'il s'agit d'un port non standard.

    elasticmapreduce.amazonaws.com\n
  3. Ajoutez la version codée en URL de chaque segment de chemin de l'URI, c'est-à-dire tout ce qui est compris entre l'en-tête d'hôte HTTP et le point d'interrogation (?) qui commence les paramètres de chaîne de requête, suivi d'un caractère de saut de ligne. Ne codez pas la barre oblique (/) qui délimite chaque segment de chemin.

    Dans cet exemple, si le chemin absolu est vide, utilisez une barre oblique (/).

    /\n
    1. Ajoutez les composants de la chaîne de requête, tels que les caractères UTF-8 qui sont codés en URL (les caractères hexadécimaux doivent être en majuscules). Vous ne devez pas coder le point d'interrogation (?) initial dans la demande. Pour plus d'informations, consultez RFC 3986.

    2. Triez les composants de la chaîne de requête dans l'ordre des octets. L'ordre des octets est sensible à la casse. AWS trie ces composants en fonction des octets bruts.

      Par exemple, voici l'ordre d'origine des composants de la chaîne de requête :

      Action=DescribeJobFlows Version=2009-03-31 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE SignatureVersion=2 SignatureMethod=HmacSHA256 Timestamp=2011-10-03T15%3A19%3A30

      Les composants de la chaîne de requête seraient réorganisés comme suit :

      AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE Action=DescribeJobFlows SignatureMethod=HmacSHA256 SignatureVersion=2 Timestamp=2011-10-03T15%3A19%3A30 Version=2009-03-31
    3. Séparez les noms de paramètres de leurs valeurs par le signe égal (=), même si la valeur est vide. Séparez les paires de paramètre et valeur par le caractère esperluette (&). Concaténez les paramètres et leurs valeurs pour créer une longue chaîne sans espace. Les espaces au sein d'une valeur de paramètre sont autorisés, mais doivent être codés en URL sous la forme %20. Dans la chaîne concaténée, les points (.) ne sont pas placés dans une séquence d'échappement. RFC 3986 considère le point comme un caractère non réservé ; celui-ci n'est donc pas codé en URL.

      Note

      RFC 3986 ne spécifie pas ce qui se passe avec les caractères de contrôle ASCII, les caractères UTF-8 étendus, ni les autres caractères réservés par RFC 1738. Dans la mesure où toutes les valeurs peuvent être transmises dans une valeur de chaîne, ces autres caractères doivent être codés en pourcentage sous la forme %XY où X et Y sont des caractères hexadécimaux en majuscules. Les caractères UTF-8 étendus prennent la forme %XY%ZA... (ce format traite les multioctets).

    L'exemple suivant montre les composants de la chaîne de requête, avec les paramètres concaténés avec le caractère esperluette (&) et triés dans l'ordre des octets.

    AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-3
  4. Pour construire la demande canonique finie, combinez tous les composants de chaque étape. Comme illustré, chaque composant se termine par un caractère de saut de ligne.

    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31

Tâche 2 : calculer la signature

Après avoir créé la chaîne canonique comme décrit dans Tâche 1 : formater la demande Query, calculez la signature en créant un code d'authentification de message basé sur le hachage (HMAC) qui utilise le protocole HMAC-SHA1 ou HMAC-SHA256. Le protocole HMAC-SHA256 est préférable.

Dans cet exemple, la signature est calculée en utilisant la chaîne canonique et la clé secrète suivantes comme entrées d'une fonction de hachage à clé :

  • Chaîne de requête canonique :

    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
  • Exemple de clé secrète :

    wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

La signature obtenue doit être encodée en Base64.

i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

Ajoutez la valeur obtenue à la demande Query en tant que paramètre Signature. Lorsque vous ajoutez ce paramètre à la demande, vous devez l'encoder sous forme d'URI comme tout autre paramètre. Vous pouvez utiliser la demande signée dans un appel HTTP ou HTTPS.

https://elasticmapreduce.amazonaws.com?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31&Signature=i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

Note

Vous pouvez utiliser les informations d'identification de sécurité temporaires fournies par AWS Security Token Service (AWS STS) pour signer une demande. Le processus est similaire à l'utilisation des informations d'identification à long terme, mais les demandes nécessitent un paramètre supplémentaire pour le jeton de sécurité.

La demande suivante utilise un ID de clé d'accès temporaire et le paramètre SecurityToken.

Exemple de demande avec des informations d'identification de sécurité temporaires

https://sdb.amazonaws.com/ ?Action=GetAttributes &AWSAccessKeyId=access-key-from-AWS Security Token Service &DomainName=MyDomain &ItemName=MyItem &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2010-01-25T15%3A03%3A07-07%3A00 &Version=2009-04-15 &Signature=signature-calculated-using-the-temporary-access-key &SecurityToken=session-token

Pour de plus amples informations, veuillez consulter les ressources suivantes :

  • Le Guide du développeur Amazon EMR contient des informations sur les appels d'API Amazon EMR.

  • La documentation sur l'API de chaque service contient des informations sur les exigences et les paramètres spécifiques pour une action.

  • Les kits SDK AWS offrent des fonctions permettant de générer des signatures de demande Query. Pour voir un exemple d'utilisation du kit AWS SDK for Java, consultez Utilisation du kit SDK Java pour signer une demande Query.

Résolution des problèmes liés aux demandes Signatures Version 2

Cette section décrit certains codes d'erreur qui sont susceptibles de s'afficher lorsque vous développez initialement du code pour générer la signature devant signer les demandes Query.

Erreur de signature SignatureDoesNotMatch dans un service web

La réponse d'erreur suivante est renvoyée lorsqu'un service web tente de valider la signature de la demande en recalculant la valeur de signature et génère une valeur qui ne correspond pas à la signature que vous avez ajoutée à la demande. Cela peut se produire parce que la demande a été modifiée entre le moment où vous l'avez envoyée et le moment où elle a atteint un point de terminaison de service web (ce qui est précisément le type de problème que la signature est conçue pour détecter) ou parce que la signature a été mal calculée. Une cause courante du message d'erreur suivant est la création incorrecte de la chaîne à signer, par exemple, l'oubli des caractères de codage par URL tels que le signe deux-points (:) et la barre oblique (/) dans les noms de compartiment Amazon S3.

<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message> </Error> <RequestId>7589637b-e4b0-11e0-95d9-639f87241c66</RequestId> </ErrorResponse>

Erreur de signature IncompleteSignature dans un service web

L'erreur suivante indique qu'il manque des informations dans la signature ou que celle-ci a été mal formée.

<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>IncompleteSignature</Code> <Message>Request must contain a signature that conforms to AWS standards</Message> </Error> <RequestId>7146d0dd-e48e-11e0-a276-bd10ea0cbb74</RequestId> </ErrorResponse>

Utilisation du kit SDK Java pour signer une demande Query

L'exemple suivant utilise le package amazon.webservices.common du kit AWS SDK pour Java afin de générer une signature de demande Query AWS Signature Version 2. Pour ce faire, il crée une signature HMAC conforme à RFC 2104. Pour plus d'informations sur HMAC, consultez HMAC: Keyed-Hashing for Message Authentication.

Note

Java est utilisé comme exemple d'implémentation. Vous pouvez utiliser le langage de programmation de votre choix pour implémenter l'algorithme HMAC afin de signer les demandes Query.

import java.security.SignatureException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import com.amazonaws.util.*; /** * This class defines common routines for generating * authentication signatures for AWS Platform requests. */ public class Signature { private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; /** * Computes RFC 2104-compliant HMAC signature. * * @param data * The signed data. * @param key * The signing key. * @return * The Base64-encoded RFC 2104-compliant HMAC signature. * @throws * java.security.SignatureException when signature generation fails */ public static String calculateRFC2104HMAC(String data, String key) throws java.security.SignatureException { String result; try { // Get an hmac_sha256 key from the raw key bytes. SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF8"), HMAC_SHA256_ALGORITHM); // Get an hmac_sha256 Mac instance and initialize with the signing key. Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); mac.init(signingKey); // Compute the hmac on input data bytes. byte[] rawHmac = mac.doFinal(data.getBytes("UTF8")); // Base64-encode the hmac by using the utility in the SDK result = BinaryUtils.toBase64(rawHmac); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } return result; } }