Risoluzione dei problemi relativi alla firma di Signature Version 4 per le richieste API AWS
Importante
A meno che non si utilizzino gli SDK o la CLI di AWS, è necessario scrivere il codice per calcolare le firme che forniscono le informazioni di autenticazione nelle richieste. Il calcolo della firma SigV4 può essere un'operazione complessa e consigliamo di utilizzare gli SDK o la CLI AWS quando possibile.
Quando si sviluppa il codice per l'elaborazione di una richiesta firmata, è possibile che vengano ricevuti errori HTTP 403 SignatureDoesNotMatch dai Servizi AWS. Questo errore indica che il valore della firma nella richiesta HTTP ad AWS non corrisponde alla firma calcolata dal Servizio AWS. Gli errori HTTP 401 Unauthorized vengono restituiti quando le autorizzazioni non consentono al chiamante di effettuare la richiesta.
Le richieste API potrebbero restituire un errore 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 calcolata dal servizio AWS.
-
L'intestazione della richiesta API non è corretta.
Nota
Aggiorna il protocollo di firma da AWS Signature Version 2 (SigV2) a AWS Signature Version 4 (SigV4) prima di esplorare altre soluzioni di errore. I servizi come Amazon S3 e le regioni non supportano più la firma SigV2.
Possibili cause
Errori delle credenziali
Assicurati che la richiesta dell'API sia firmata con SigV4. Se la richiesta API non è firmata, potresti ricevere l'errore: Missing Authentication Token. Aggiungi la firma mancante e invia nuovamente la richiesta.
Verifica che le credenziali di autenticazione della chiave di accesso e della chiave segreta siano corrette. Se la chiave di accesso non è corretta, potresti ricevere l'errore: Unauthorized. Assicurati che l'entità utilizzata per firmare la richiesta sia autorizzata a effettuare la richiesta. Per informazioni dettagliate, vedi Risoluzione dei problemi relativi ai messaggi di errore di accesso rifiutato.
Errori nella richiesta canonica e nella stringa di firma
Se hai calcolato la richiesta canonica in Creare un hash della richiesta canonica o Creare una stringa da firmare, la fase di verifica della firma eseguita dal servizio ha esito negativo con li seguente messaggio di errore:
The request signature we calculated does not match the signature you provided
Quando il servizio AWS riceve una richiesta firmata, ricalcola la firma. Se sussistono differenze nei valori, le firme non corrispondono. Confronta la stringa e la richiesta canonica con la tua richiesta firmata con il valore nel messaggio di errore. Modifica il processo di firma se riscontri differenze.
Nota
Puoi anche verificare di non aver inviato la richiesta tramite una proxy che modifica le intestazioni o la richiesta.
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 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
Per verificare che la chiave segreta corrisponda all'ID della chiave di accesso, puoi testarla con un'implementazione funzionante nota. Ad esempio, utilizza un SDK AWS o la CLI AWS per effettuare una richiesta ad AWS.
Intestazione della richiesta API
Quando l'intestazione di autorizzazione è vuota, la chiave o la firma della credenziale è mancante o errata, l'intestazione non inizia con il nome di un algoritmo o le coppie chiave-valore non includono un segno uguale, viene visualizzato uno dei seguenti errori:
-
L'intestazione dell'autorizzazione non può essere vuota.
-
L'intestazione di autorizzazione richiede il parametro "Credential".
-
L'intestazione di autorizzazione richiede il parametro "Signature".
-
La firma contiene una coppia chiave=valore non valida (segno di uguale mancante) nell'intestazione di autorizzazione.
Assicurati che l'intestazione di autorizzazione SigV4 aggiunta in Calcolare la firma includa la chiave di credenziali corretta e la data della richiesta utilizzando HTTP Date o l'intestazione x-amz-date.
Se hai ricevuto un errore IncompleteSignatureException e la costruzione della firma è corretta, puoi verificare che l'intestazione di autorizzazione non sia stata modificata in transito verso il Servizio AWS calcolando un hash SHA-256 e la codifica B64 dell'intestazione di autorizzazione nella tua richiesta lato client.
-
Ottieni l'intestazione di autorizzazione che hai inviato nella richiesta. L'aspetto dell'intestazione dell'autorizzazione è simile all'esempio seguente:
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature -
Calcola un hash SHA-256 dell'intestazione dell'autorizzazione
hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader -
Codifica l'intestazione di autorizzazione con hash nel formato Base64.
base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader -
Confronta la stringa con hash e codificata che hai appena calcolato con la stringa che hai ricevuto nel messaggio di errore. Il messaggio di errore dovrebbe essere simile al seguente esempio:
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'.
-
Se i due hash sono diversi, una parte dell'intestazione di autorizzazione è cambiata durante il transito. Questa modifica potrebbe essere dovuta al fatto che i gestori della rete o del client allegano intestazioni firmate o modificano in qualche modo l'intestazione di autorizzazione.
-
Se i due hash corrispondono, l'intestazione di autorizzazione inviata nella richiesta corrisponde a quella ricevuta da AWS. Controlla il messaggio di errore che hai ricevuto per determinare se il problema è il risultato di credenziali o firme errate. Questi errori sono descritti nelle altre sezioni di questa pagina.
Errori nell'ambito delle credenziali
L'ambito delle credenziali che hai creato in Creare una stringa da firmare limita una firma a una data, una regione e un servizio specifici. Questa stringa ha il seguente formato:
YYYYMMDD/region/service/aws4_request
Nota
Se si utilizza SigV4a, la regione non è inclusa nell'ambito delle credenziali.
Data
Se l'ambito delle credenziali non specifica la stessa data dell'intestazione di x-amz-date, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:
Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP
Se la richiesta specifica un orario futuro, la fase di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:
Signature not yet current:dateis still later thandate
Se la richiesta è scaduta, la fase di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:
Signature expired:dateis now earlier thandate
Regione
Se l'ambito delle credenziali non specifica la stessa regione della richiesta, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:
Credential should be scoped to a valid Region, not region-code
Servizio
Se l'ambito delle credenziali non specifica lo stesso servizio dell'intestazione di host, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:
Credential should be scoped to correct service: 'service'
Stringa di terminazione
Se l'ambito delle credenziali termina con aws4_request, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:
Credential should be scoped with a valid terminator: 'aws4_request'
Errori nella chiave di firma
Gli errori causati da un'errata derivazione della chiave di firma o dall'uso improprio della crittografia sono più difficili da risolvere. Dopo aver verificato che la stringa canonica e la stringa da firmare siano corrette, puoi anche verificare la presenza di uno dei seguenti problemi:
-
La chiave di accesso segreta non corrisponde all'ID della chiave di accesso specificato.
-
Si è verificato un problema con il codice di derivazione della chiave.
Per verificare che la chiave segreta corrisponda all'ID della chiave di accesso, puoi testarla con un'implementazione funzionante nota. Ad esempio, utilizza un SDK AWS o la AWS CLI per effettuare una richiesta ad AWS. Per degli esempi, consulta Richiesta di esempi di firma