Comment résoudre les erreurs de non-concordance de signature lors de création de demandes signées SigV4 avec l'authentification IAM pour API Gateway ?

Lecture de 5 minute(s)
0

La demande signée Signature Version 4 (SigV4) adressée à Amazon API Gateway a échoué en renvoyant une réponse 403 et une erreur. L'erreur est du type : « The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. » (La signature de la demande que nous avons calculée ne correspond pas à celle que vous avez fournie. Vérifiez votre clé d'accès secrète AWS et votre méthode de signature.)

Brève description

Les points de terminaison d'API API Gateway utilisant l'authentification AWS Identity and Access Management (IAM) peuvent renvoyer des erreurs 403 si :

  • La demande d'API n'est pas signée et utilise l'authentification IAM.
  • Les informations d'identification IAM utilisées pour signer la demande sont incorrectes ou ne disposent pas des autorisations nécessaires pour appeler l'API.
  • La signature de la demande d'API signée ne correspond pas à la signature du point de terminaison d'API API Gateway.
  • L'en-tête de la demande d'API est incorrect.

Solution

Authentification IAM

Assurez-vous que la demande d'API qui utilise l'authentification IAM est signée avec SigV4. Si la demande d'API n'est pas signée, vous pouvez recevoir l'erreur suivante : « Missing Authentication Token » (Jeton d'authentification manquant).

Informations d'identification IAM

Vérifiez que les informations d'identification pour la clé d'accès et la clé secrète sont correctes. Si la clé d'accès est incorrecte, vous pouvez recevoir l'erreur suivante : « The security token included in the request is invalid. » (Le jeton de sécurité inclus dans la demande n'est pas valide.)

Assurez-vous que l'entité IAM utilisée pour signer la demande dispose des autorisations execute-api:Invoke. Si l'entité IAM ne dispose pas des autorisations execute-api:Invoke, vous risquez de recevoir l'erreur suivante : « User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource » (L'utilisateur : arn:aws:iam::xxxxxxxxxxxx:user/username n'est pas autorisé à exécuter : execute-api:Invoke sur la ressource)

Non concordance de signature

Si la clé d'accès secrète est incorrecte, vous pouvez recevoir l'erreur suivante : « The request signature we calculated does not match the signature you provided. » (La signature de la demande que nous avons calculée ne correspond pas à celle que vous avez fournie.)

La clé d'accès secrète doit correspondre à l'ID de la clé d'accès dans le paramètre Credential. Pour obtenir des instructions, suivez la section Envoyer une demande pour tester les paramètres d'authentification dans Comment activer l'authentification IAM pour les API REST API Gateway ?

Assurez-vous que vous avez suivi les instructions pour le processus de signature SigV4. Si l'une des valeurs du calcul de la signature est incorrecte, vous risquez de recevoir l'erreur suivante : « The request signature we calculated does not match the signature you provided. » (La signature de la demande que nous avons calculée ne correspond pas à celle que vous avez fournie.)

Lorsque API Gateway reçoit une demande signée, il recalcule la signature. S'il y a des différences dans les valeurs, API Gateway obtient alors une signature différente. Comparez la demande canonique et la chaîne de votre demande signée avec la valeur du message d'erreur. Modifiez le processus de signature s'il y a des différences.

Exemple de demande 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 any 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 request                       
x-amz-date:20220806T024003Z                              

content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- hash of the payload

Exemple de réponse d'erreur canonique :

<ErrorResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
  <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.

The canonical string for this request should have been 'GET / Action=ListGroupsForUser&MaxItems=100&UserName=Test&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential
=AKIAIOSFODNN7EXAMPLE%2F20120223%2Fus-east-1%2Fiam%2Faws4_request&X-Amz-Date=20120223T063000Z&X-Amz-SignedHeaders=host
host:iam.amazonaws.com

host
<hashed-value>'

The String-to-Sign should have been
'AWS4-HMAC-SHA256
20120223T063000Z
20120223/us-east-1/iam/aws4_request
<hashed-value>'
</Message>
  </Error>
  <RequestId>4ced6e96-5de8-11e1-aa78-a56908bdf8eb</RequestId>
</ErrorResponse>

Remarque : pour les en-têtes de passerelle d'API, seuls les en-têtes host et x-amz-date sont requis.

En-tête de demande d'API

Assurez-vous que l'en-tête d'autorisation SigV4 comprend la bonne clé d'informations d'identification similaire à ce qui suit :

Authorization: AWS4-HMAC-SHA256 
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date,
Signature=example-generated-signature

Si la clé d'informations d'identification est manquante ou incorrecte, vous pourriez recevoir l'erreur suivante : « Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. » (L'en-tête d'autorisation nécessite le paramètre « Credential ». L'en-tête d'autorisation nécessite le paramètre « Signature ».)

Assurez-vous que la demande d'autorisation SigV4 inclut également la date de la demande en utilisant soit HTTP Date, soit l'en-tête x-amz-date.


Informations connexes

Exemples de code dans les AWS SDK

Comment résoudre les erreurs HTTP 403 à partir d'API Gateway ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an