Salta al contenuto

Come posso risolvere gli errori di mancata corrispondenza della firma quando effettuo richieste firmate con SIGv4 utilizzando l'autenticazione IAM in Gateway API?

5 minuti di lettura
0

Quando effettuo una richiesta firmata con Signature Version 4 (Sigv4) a Gateway Amazon API utilizzando l'autenticazione AWS Identity and Access Management (AWS IAM), ricevo un errore 403.

Risoluzione

Gli endpoint di Gateway API che utilizzano l'autenticazione IAM restituiscono errori 403 per diversi motivi. Utilizza le seguenti sezioni per identificare e risolvere la causa in base al messaggio di errore ricevuto.

Verifica l'autenticazione IAM

Verifica che la richiesta API che utilizza l'autenticazione IAM sia firmata con Sigv4. Per firmare la richiesta, segui la procedura di firma di SIGv4. Se la richiesta API non è firmata, ricevi il seguente errore:

"Missing Authentication Token."

Per risolvere il problema, aggiungi la firma mancante e invia nuovamente la richiesta.

Verifica le credenziali IAM

Verifica che la chiave di accesso e la chiave segreta siano corrette. Per controllare le credenziali, completa i seguenti passaggi:

  1. Apri la console IAM.
  2. Nel pannello di navigazione, scegliUtenti.
  3. Seleziona l'utente.
  4. Scegli la scheda Credenziali di sicurezza per rivedere le chiavi di accesso.

Se la chiave di accesso non è corretta, ricevi il seguente errore:

"The security token included in the request is invalid."

Per risolvere il problema, verifica che l'entità IAM utilizzata per firmare la richiesta abbia le autorizzazioni execute-api:Invoke. Per aggiungere l'autorizzazione, collega una policy IAM che includa l'azione execute-api:Invoke all'entità IAM. Per esempi di policy, consulta Esempi di policy IAM per le autorizzazioni di esecuzione di API.

Se manca l'autorizzazione execute-api:Invoke, la richiesta ha esito negativo e ricevi il seguente errore:

<region><api-id>"User: arn:aws:iam::xxxxxxxxxxxx:user/username is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api::xxxxxxxxxxxx:/stage/method/path because no identity-based policy allows the execute-api:Invoke action."

Risolvi la mancata corrispondenza della firma

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori relativi ad AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Se la chiave di accesso segreta non è corretta, ricevi il seguente errore:

"The request signature we calculated does not match the signature you provided."

La chiave di accesso segreta e la chiave di accesso sono accoppiate. Per convalidare la chiave di accesso segreta e la chiave di accesso e individuare qualsiasi potenziale problema durante il processo di firma, verifica la richiesta con il comando curl.

Per un utente IAM, esegui questo comando curl:

curl -v --aws-sigv4 'aws:amz:REGION:execute-api' --user 'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY' API_Gateway_endpoint

Nota: sostituisci REGION con la tua Regione AWS. Sostituisci AWS_ACCESS_KEY_ID con l'ID della chiave di accesso del tuo utente IAM. Sostituisci AWS_SECRET_ACCESS_KEY con la chiave di accesso segreta del tuo utente IAM. Sostituisci API_Gateway_endpoint con l'URL del tuo endpoint di Gateway API.

Per un ruolo IAM, ottieni prima le credenziali temporanee eseguendo questo comando AWS CLI assume-role:

aws sts assume-role --role-arn ROLE_ARN --role-session-name SESSION_NAME

Nota: sostituisci ROLE_ARN con il nome della risorsa Amazon (ARN) del ruolo IAM che desideri assumere. Sostituisci SESSION_NAME con un nome per identificare la sessione.

Quindi utilizza le credenziali temporanee restituite nell'azione precedente per eseguire questo comando:

curl -v --aws-sigv4 'aws:amz:REGION:execute-api' --user 'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY' --header "x-amz-security-token: AWS_SESSION_TOKEN" API_Gateway_endpoint

Nota: sostituisci REGION con la tua Regione AWS. Sostituisci AWS_ACCESS_KEY_ID con l'ID della chiave di accesso dell'output assume-role. Sostituisci AWS_SECRET_ACCESS_KEY con la chiave di accesso segreta dell'output assume-role. Sostituisci AWS_SESSION_TOKEN con il token di sessione dell'output assume-role. Sostituisci API_Gateway_endpoint con l'URL del tuo endpoint di Gateway API.

Quando Gateway API riceve una richiesta firmata, ricalcola la firma. Se il parametro o il payload della richiesta è diverso da quello che ha generato la firma originale, Gateway API ottiene un risultato diverso.

Confronta la richiesta canonica e la stringa di firma ottenute dal processo di firma con il valore restituito nel messaggio di errore. Modifica il processo di firma in caso di differenze. Per indicazioni sulla correzione del processo di firma, consulta Risolvi i problemi relativi alla firma di Signature Version 4 per richieste API AWS.

Utilizza il seguente esempio come riferimento quando confronti la richiesta canonica con il valore restituito nel messaggio di errore:

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 requests
x-amz-date:20220806T024003Z
content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- Hash of the payload

Di seguito è riportato un 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 di Gateway API, sono necessarie solo le intestazioni host e x-amz-date.

Correggi l'intestazione della richiesta API

Verifica che l'intestazione di autorizzazione di SIGv4 abbia il formato corretto. L'intestazione deve avere il seguente aspetto:

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

Se il formato non è corretto o se mancano dei parametri, aggiorna l'intestazione di autorizzazione nel codice di firma in modo da includere i seguenti parametri:

  • Credential
  • SignedHeaders
  • Signature

I parametri mancanti o errati generano i seguenti errori:

  • "Authorization header requires 'Credential' parameter."
  • "Authorization header requires 'Signature' parameter."
  • "Authorization header requires 'SignedHeaders' parameter."

Verifica che la richiesta di autorizzazione di SIGv4 includa la data della richiesta. Per aggiungere la data, includi l'intestazione HTTP Date o l'intestazione x-amz-date nella richiesta. Per ulteriori informazioni, consulta Crea una richiesta API AWS firmata. Se manca l'intestazione relativa alla data, ricevi il seguente errore:

"Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header."