In che modo è possibile risolvere gli errori di mancata corrispondenza delle firme quando si effettuano richieste firmate SigV4 con l'autenticazione IAM a Gateway Amazon API?

4 minuti di lettura
0

La richiesta firmata Signature Version 4 (SigV4) a Gateway Amazon API non è riuscita, restituendo una risposta 403 e un errore. L'errore è simile al seguente: “The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method" (La firma di richiesta che abbiamo calcolato non corrisponde alla firma che hai fornito. Controlla la tua chiave di accesso segreta AWS e il metodo di firma).

Breve descrizione

Gli endpoint API di Gateway Amazon API che utilizzano l'autenticazione AWS Identity and Access Management (IAM) potrebbero restituire errori 403 se:

  • La richiesta API non è firmata e utilizza l'autenticazione IAM.
  • Le credenziali IAM utilizzate per firmare la richiesta non sono corrette o non dispongono delle autorizzazioni per richiamare l'API.
  • La firma della richiesta API firmata non corrisponde alla firma per l'endpoint API di Gateway Amazon API.
  • L'intestazione della richiesta API non è corretta.

Risoluzione

Autenticazione IAM

Assicurati che la richiesta API che utilizza l'autenticazione IAM sia firmata con SigV4. Se la richiesta API non è firmata, potresti ricevere il seguente messaggio di errore: "Missing Authentication Token" (Token di autenticazione mancante).

Credenziali IAM

Verifica che le credenziali di autenticazione per la chiave di accesso e la chiave segreta siano corrette. Se la chiave di accesso non è corretta, potresti ricevere il messaggio di errore: "The security token included in the request is invalid" (Il token di sicurezza incluso nella richiesta non è valido).

Assicurati che l'entità IAM utilizzata per firmare la richiesta disponga delle autorizzazioni execute-api:Invoke. Se l'entità IAM non dispone delle autorizzazioni execute-api:Invoke, potresti ricevere il seguente messaggio di errore: "User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource" (Utente: arn:aws:iam::xxxxxxxxxxxx:utente/nome utente non è autorizzato a eseguire: execute-api:Invoke sulla risorsa)

Mancata corrispondenza della firma

Se la chiave di accesso segreta non è corretta, potresti ricevere il seguente messaggio di errore: "The request signature we calculated does not match the signature you provided" (La firma della richiesta che abbiamo calcolato non corrisponde alla firma che hai fornito).

La chiave di accesso segreta deve corrispondere all'ID della chiave di accesso nel parametro Credential (Credenziali). Per istruzioni, consulta la sezione Send a request to test the authentication settings (Invia una richiesta per testare le impostazioni di autenticazione) nella pagina How do I activate IAM authentication for API Gateway REST APIs? (Come posso attivare l'autenticazione IAM per le REST API di Gateway Amazon API?)

Assicurati di aver seguito le istruzioni per il processo di firma SigV4. Se alcuni valori nel calcolo della firma non sono corretti, potresti ricevere il seguente messaggio di errore: "The request signature we calculated does not match the signature you provided" (La firma della richiesta che abbiamo calcolato non corrisponde alla firma che hai fornito).

Quando Gateway Amazon API riceve una richiesta firmata, ricalcola la firma. Se ci sono differenze nei valori, Gateway Amazon API ottiene una firma diversa. Confronta la richiesta canonica e la stringa con la richiesta firmata con il valore indicato nel messaggio di errore. Modifica il processo di firma se ci sono differenze.

Esempio di richiesta canonica:

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

Esempio di risposta all'errore canonico:

<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>

Nota: per le intestazioni del gateway API, sono necessarie solo le intestazioni host e x-amz-date.

Intestazione della richiesta API

Assicurati che l'intestazione di autorizzazione SigV4 includa la chiave delle credenziali corretta simile alla seguente:

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

Se la chiave delle credenziali è mancante o errata, potresti ricevere il seguente messaggio di errore: "Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter." (L'intestazione dell'autorizzazione richiede il parametro 'Credenziale'. L'intestazione dell'autorizzazione richiede il parametro 'Firma').

Assicurati che la richiesta di autorizzazione SigV4 includa anche la data della richiesta utilizzando HTTP Date o l'intestazione x-amz-date.


Informazioni correlate

Esempi di codice negli SDK AWS

Come posso risolvere gli errori HTTP 403 di API Gateway?