Processus de signature Signature Version 2 - Références générales AWS

Si nous fournissons une traduction de la version anglaise du guide, la version anglaise du guide aura préséance en cas de contradiction. La traduction sera une traduction automatique.

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

Vous pouvez utiliser Signature version 2 pour signer les demandes d'API pour certains services AWS de certaines régions AWS. Dans le cas contraire, vous devez utiliser Signature Version 4 pour signer les demandes d'API.

Régions prenant en charge Signature Version 2

  • Région USA Est (Virginie du N.)

  • Région USA Ouest (Californie du Nord)

  • Région USA Ouest (Oregon)

  • Région Europe (Irlande)

  • Région Asie-Pacifique (Tokyo)

  • Région Asie-Pacifique (Singapour)

  • Région Asie-Pacifique (Sydney)

  • Région Amérique du Sud (São Paulo)

Services prenant en charge Signature Version 2

  • Amazon EC2 Auto Scaling

  • AWS CloudFormation

  • Amazon CloudWatch

  • AWS Elastic Beanstalk

  • Amazon Elastic Compute Cloud (Amazon EC2)

  • Elastic Load Balancing

  • Amazon EMR

  • Amazon ElastiCache

  • AWS Identity and Access Management (IAM)

  • AWS Import/Export

  • Amazon Relational Database Service (Amazon RDS)

  • Amazon Simple Notification Service (Amazon SNS)

  • Amazon Simple Queue Service (Amazon SQS)

  • Amazon SimpleDB

Services pour lesquels Signature Version 2 est obsolète

Composants d'une demande de requête 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. Différent pour chaque région AWS. Pour connaître la liste des points de terminaison pour chaque service, consultez Points de terminaison de service 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 pour une demande de requête

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.

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 de requête (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 de connexion, vous devez concaténer les composants de la demande Query. L'exemple suivant génère la chaîne de connexion 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 de connexion

  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 de requête (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 :

Résolution des problèmes liés aux signatures des demandes

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 de connexion, 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 de requête (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("UTF-8"), 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("UTF-8")); // 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; } }