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.
Résolution des problèmes de signature de Signature Version 4 pour les requêtes d’API AWS
Important
À moins que vous n'utilisiez les kits SDK AWS ou la CLI, vous devez écrire du code pour calculer les signatures qui fournissent des informations d'authentification dans vos demandes. Le calcul de la signature SigV4 peut s'avérer complexe et nous vous recommandons d'utiliser les kits SDK ou la CLI AWS dans la mesure du possible.
Lorsque vous développez du code qui crée une requête signée, vous pouvez recevoir des erreurs HTTP 403 SignatureDoesNotMatch provenant d'Services AWS. Cette erreur signifie que la valeur de signature de votre requête HTTP à AWS ne correspond pas à la signature calculée par l'Service AWS. Les erreurs HTTP 401 Unauthorized sont renvoyées lorsque les autorisations ne permettent pas à l'appelant d'effectuer la requête.
Les demandes d'API peuvent renvoyer une erreur si :
-
La demande d'API n'est pas signée et elle utilise l'authentification IAM.
-
Les informations d'identification IAM utilisées pour signer la demande sont incorrectes ou ne sont pas autorisées à invoquer l'API.
-
La signature de la demande d'API signée ne correspond pas à la signature calculée par le service AWS.
-
L'en-tête de demande d'API est incorrect.
Note
Mettez à jour votre protocole de AWS Signature version 2 (SigV2) à AWS Signature version 4 (SigV4) avant d'explorer d'autres solutions aux erreurs. Les services, tels qu’Amazon S3, et les régions ne prennent plus en charge la signature SigV2.
Causes possibles :
Erreurs d'informations d'identification
Assurez-vous que la demande d'API est signée avec SigV4. Si la demande d'API n'est pas signée, il se peut que vous receviez le message d'erreur : Missing Authentication Token. Ajoutez la signature manquante et renvoyez la demande.
Vérifiez que les informations d'identification de la clé d'accès et de la clé secrète sont correctes. Si la clé d'accès est incorrecte, le message d'erreur suivant peut s'afficher : Unauthorized. Assurez-vous que l'entité utilisée pour signer la demande est autorisée à effectuer cette dernière. Pour en savoir plus, consultez Résolution des problèmes liés aux messages d’erreur d’accès rejeté.
Erreurs de requête canonique et de chaîne de signature
Si le calcul de la requête canonique est incorrect dans Création d’un hachage de la requête canonique ou Création d’une chaîne à signer, l'étape de vérification de la signature effectuée par le service échoue avec le message d'erreur :
The request signature we calculated does not match the signature you provided
Lorsque le service AWS reçoit une requête signée, il recalcule la signature. S'il existe des différences entre les valeurs, les signatures ne correspondent pas. Comparez la requête canonique et la chaîne à votre demande signée avec la valeur du message d'erreur. Modifiez le processus de signature en cas de différence.
Note
Vous pouvez également vérifier que vous n'avez pas envoyé la requête via un proxy qui modifie les en-têtes ou la requête.
Exemple de requête canonique
GET -------- HTTP method / -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path} -------- Query string key-value pair. Leave it blank if the request doesn't have a query string. content-type:application/json -------- Header key-value pair. One header per line. host:0123456789.execute-api.us-east-1.amazonaws.com -------- Host and x-amz-date are required headers for all signed requests. x-amz-date:20220806T024003Z content-type;host;x-amz-date -------- A list of signed headers d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501 -------- Hash of the payload
Pour vérifier que la clé secrète correspond à l'ID de la clé d'accès, vous pouvez les tester avec une implémentation fonctionnelle connue. Par exemple, utilisez un kit SDK AWS ou la CLI AWS pour envoyer une requête à AWS.
En-tête de la demande d'API
Lorsque l’en-tête d’autorisation est vide, que la clé ou la signature des informations d’identification est manquante ou incorrecte, que l’en-tête ne commence pas par un nom d’algorithme ou que les paires clé-valeur n’incluent pas de signe égal, vous recevez l’une des erreurs suivantes :
-
L’en-tête d’autorisation ne peut pas être vide.
-
L’en-tête d’autorisation nécessite le paramètre « Informations d’identification ».
-
L’en-tête d’autorisation nécessite le paramètre « Signature ».
-
La signature contient une paire clé=valeur non valide (signe égal manquant) dans l’en-tête d’autorisation.
Assurez-vous que l’en-tête d’autorisation SigV4 que vous avez ajouté dans Calcul de la signature comprend la clé d’informations d’identification correcte, ainsi que la date de la requête à l’aide de HTTP Date ou de l’en-tête x-amz-date.
Si vous avez reçu une erreur IncompleteSignatureException et que la création de la signature est correcte, vous pouvez vérifier que l’en-tête d’autorisation n’a pas été modifié en transit vers le Service AWS en calculant un hachage SHA-256 et un codage B64 de l’en-tête d’autorisation dans votre requête côté client.
-
Obtenez l’en-tête d’autorisation que vous avez envoyé dans la requête. Votre en-tête d’autorisation ressemble à l’exemple suivant :
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature -
Calculez un hachage SHA-256 de l’en-tête d’autorisation.
hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader -
Codez l’en-tête d’autorisation haché au format Base64.
base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader -
Comparez la chaîne hachée et codée que vous venez de calculer à la chaîne que vous avez reçue dans votre message d’erreur. Votre message d’erreur doit ressembler à l’exemple suivant :
com.amazon.coral.service#IncompleteSignatureException: The signature contains an in-valid key=value pair (missing equal-sign) in Authorization header (hashed with SHA-256 and encoded with Base64): '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
-
Si les deux hachages diffèrent, c’est qu’une partie de l’en-tête d’autorisation a été modifiée en transit Ce changement peut être dû au fait que les gestionnaires de votre réseau ou de votre client attachent des en-têtes signés ou modifient l’en-tête d’autorisation d’une manière ou d’une autre.
-
Si les deux hachages correspondent, l’en-tête d’autorisation que vous avez envoyé dans la requête correspond à celui reçu par AWS. Consultez le message d’erreur que vous avez reçu pour déterminer si le problème est dû à des informations d’identification ou à une signature incorrectes. Ces erreurs sont traitées dans les autres sections de cette page.
Erreurs d’étendue des informations d'identification
Le champ d'application des informations d'identification dans Création d’une chaîne à signer limite une signature à une date, une région et un service spécifiques. Cette chaîne présente le format suivant :
YYYYMMDD/region/service/aws4_request
Note
Si vous utilisez SigV4a, la région n'est pas incluse dans le champ d'application des informations d'identification.
Date
Si l'étendue des informations d'identification ne spécifie pas la même date que l'en-tête x-amz-date, l'étape de vérification de la signature échoue avec le message d'erreur suivant :
Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP
Si la requête indique une date future, l'étape de vérification de la signature échoue avec le message d'erreur suivant :
Signature not yet current:dateis still later thandate
Si la requête a expiré, l'étape de vérification de la signature échoue avec le message d'erreur suivant :
Signature expired:dateis now earlier thandate
Région
Si l'étendue des informations d'identification ne spécifie pas la même Région que la requête, l'étape de vérification de la signature échoue avec le message d'erreur suivant :
Credential should be scoped to a valid Region, not region-code
Service
Si l'étendue des informations d'identification ne spécifie pas le même service que l'en-tête host, l'étape de vérification de la signature échoue avec le message d'erreur suivant :
Credential should be scoped to correct service: 'service'
Chaîne de terminaison
Si l'étendue des informations d'identification ne se termine pas par aws4_request, l'étape de vérification de la signature échoue avec le message d'erreur suivant :
Credential should be scoped with a valid terminator: 'aws4_request'
Erreurs de signature de clé
Les erreurs causées par une dérivation incorrecte de la clé de signature ou une utilisation inappropriée du chiffrement sont plus difficiles à résoudre. Après avoir vérifié que la chaîne canonique et la chaîne à signer sont correctes, vous pouvez également vérifier l'existence de l'un des problèmes suivants :
-
La clé d'accès secrète ne correspond pas à l'ID de clé d'accès que vous avez spécifiée.
-
Votre code de dérivation de clé pose problème.
Pour vérifier que la clé secrète correspond à l'ID de la clé d'accès, vous pouvez les tester avec une implémentation fonctionnelle connue. Par exemple, utilisez un SDK AWS ou AWS CLI pour envoyer une demande à AWS. Pour obtenir des exemples, veuillez consulter Demander des exemples de signature