Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Firma e autenticazione delle richieste REST (AWS firma (versione 2)
Argomenti
Nota
In questo argomento viene illustrato come autenticare le richieste tramite Signature Version 2. Amazon S3 supporta ora il più recente Signature Version 4. L'ultima versione è ora supportata in tutte le regioni e le regioni create dopo il 30 gennaio 2014 supporteranno solo Signature Version 4. Per ulteriori informazioni, consulta Authenticating Requests (AWS Signature Version 4) nel Amazon Simple Storage Service API Reference.
Per autenticazione si intende il processo di attestazione dell'identità in un sistema. L'identità è un importante fattore per le decisioni di controllo degli accessi in Amazon S3. Le richieste vengono accettate o rifiutate in parte anche in base all'identità del richiedente. Ad esempio, il diritto di creare bucket è riservato agli sviluppatori registrati e, di default, è solo il proprietario del bucket in questione ad avere il diritto di creare oggetti al suo interno. Poiché gli sviluppatori inviano richieste che invocano questi privilegi, dovranno provare la propria identità al sistema autenticando le richieste: in questa sezione viene illustrato come procedere.
Nota
I contenuti di questa sezione non si applicano alle richieste HTTP POST. Per ulteriori informazioni, consulta Browser-based caricamenti utilizzando POST (AWS firma (versione 2).
Per l'autenticazione, l'API REST di Amazon S3 utilizza uno schema HTTP personalizzato basato su un codice HMAC (Hash Message Authentication Code) con chiave. Per autenticare una richiesta, è necessario in primo luogo concatenare alcuni elementi della richiesta per formare una stringa, Quindi utilizzi la tua chiave di accesso AWS segreta per calcolare l'HMAC di quella stringa. Informalmente, questo processo è chiamato «firma della richiesta» e l'output dell'algoritmo HMAC è la firma, poiché simula le proprietà di sicurezza di una firma reale. Infine, la firma viene aggiunta come parametro della richiesta tramite la sintassi descritta in questa sezione.
Quando il sistema riceve una richiesta autenticata, recupera la chiave di accesso AWS segreta che si afferma di avere e la utilizza allo stesso modo per calcolare una firma per il messaggio ricevuto. quindi confronta la firma calcolata con quella presentata dal richiedente. Se le due firme corrispondono, il sistema conclude che il richiedente deve avere accesso alla chiave di accesso AWS segreta e quindi agisce con l'autorità del mandante a cui è stata rilasciata la chiave. Se le due firme non coincidono, la richiesta viene scartata e il sistema risponde con un messaggio di errore.
Esempio Richiesta REST Amazon S3 autenticata
GET /photos/puppy.jpg HTTP/1.1 Host: awsexamplebucket1.us-west-1.s3.amazonaws.com Date: Tue, 27 Mar 2007 19:36:42 +0000Authorization: AWS AKIAIOSFODNN7EXAMPLE: qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
Utilizzo di credenziali di sicurezza temporanee
Se la richiesta viene firmata tramite credenziali di sicurezza temporanee (consulta Esecuzione di richieste), è necessario includere nella richiesta il corrispondente token di sicurezza aggiungendo l'intestazione x-amz-security-token.
Quando si ottengono credenziali di sicurezza temporanee utilizzando l'API Servizio di token di sicurezza AWS
, la risposta include le credenziali di sicurezza temporanee e un token di sessione. Il valore del token di sessione deve essere fornito nell'intestazione x-amz-security-token durante l'invio di richieste ad Amazon S3. Per informazioni sull' Servizio di token di sicurezza AWS API fornita da IAM, vai a Action in the Servizio di token di sicurezza AWS API Reference Guide.
Intestazione di autenticazione
L'API REST di Amazon S3 utilizza l'intestazione standard HTTP Authorization per passare le informazioni di autenticazione (il nome dell'intestazione standard è poco felice perché in realtà comunica informazioni sull'autenticazione, non sull'autorizzazione). Nell'ambito dello schema di autenticazione Amazon S3, l'intestazione Authorization ha il formato seguente:
Authorization: AWSAWSAccessKeyId:Signature
Agli sviluppatori vengono rilasciati un ID della chiave di AWS accesso e una chiave di accesso AWS segreta al momento della registrazione. Per l'autenticazione delle richieste, l'elemento AWSAccessKeyId identifica l'ID chiave di accesso utilizzata per calcolare la firma e, indirettamente, lo sviluppatore che invia la richiesta.
L'Signatureelemento è la RFC 2104 HMAC-SHA1 degli elementi selezionati dalla richiesta, pertanto la Signature parte dell'intestazione di autorizzazione varierà da richiesta a richiesta. Se la firma della richiesta calcolata dal sistema corrisponde a quella Signature inclusa nella richiesta, il richiedente avrà dimostrato il possesso della AWS chiave di accesso segreta. La richiesta verrà quindi elaborata con l'identità e l'autorità dello sviluppatore titolare della chiave.
Di seguito è riportato un esempio di grammatica che illustra la costruzione dell'intestazione Authorization per la richiesta. (Nell'esempio, l'elemento \n rappresenta il punto di codice Unicode U+000A, comunemente chiamato newline).
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ subresource, if present. For example "?acl", "?location", or "?logging"]; CanonicalizedAmzHeaders = <described below>
HMAC-SHA1 è un algoritmo definito da RFC 2104, Keyed-Hashing per l'autenticazione dei messaggi. YourSecretAccessKey) come chiave e la UTF-8 codifica come messaggio. StringToSign L'output di HMAC-SHA1 è anche una stringa di byte, chiamata digest. Il parametro di richiesta Signature viene costruito da Base64 codificando il digest.
Standardizzazione della richiesta per la firma
È importante ricordare che, quando il sistema riceve una richiesta di autenticazione, confronta la firma calcolata con la firma fornita nella richiesta in StringToSign. Per questo motivo, devi calcolare la firma con lo stesso metodo utilizzato da Amazon S3. Il processo di presentazione di una richiesta in una forma concordata per la firma della canonicalizzazione.
Costruzione dell'elemento CanonicalizedResource
CanonicalizedResource rappresenta la risorsa Amazon S3 cui è destinata la richiesta. È possibile costruire l'elemento per una richiesta REST nel modo seguente:
-
Iniziare con una stringa vuota (
""). -
Se la richiesta specifica un bucket tramite l'intestazione Host HTTP (in stile hosting virtuale), aggiungere il nome del bucket preceduto da
"/"(ad es., "/nomebucket"). Per le richieste in stile percorso o senza un bucket specifico, non è necessaria alcuna azione. Per ulteriori informazioni sulle richieste in stile host virtuale, vedere Hosting virtuale di bucket.Per una richiesta in stile host virtuale "«, è «https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg/awsexamplebucket1".
CanonicalizedResourcePer la richiesta in stile percorso, "«, è «». https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg
CanonicalizedResource -
Aggiungi la parte del percorso dell'HTTP non decodificato Request-URI, fino alla stringa di query ma non inclusa.
Per una richiesta in stile host virtuale "«, è https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg «//puppy.jpg».
CanonicalizedResourceawsexamplebucket1/photosPer una richiesta in stile percorso, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg«,
CanonicalizedResourceè «//puppy.jpg». awsexamplebucket1/photos A questo punto, l'elementoCanonicalizedResourceè lo stesso sia per le richieste in stile hosting virtuale che in stile percorso.Per una richiesta non indirizzata a un bucket, come GET Service, aggiungere "/".
-
Se la richiesta è indirizzata a una risorsa secondaria, come
?versioning,?location,?acl,?lifecycleo?versionid, aggiungere la risorsa secondaria, il suo valore (se disponibile) e il punto interrogativo. Nota che in caso di più sottorisorse, le sottorisorse devono essere ordinate lessicograficamente in base al nome della sottorisorsa e separate da '&', ad esempio? ACL&versionId=.valueLe risorse secondarie da includere nella costruzione dell' CanonicalizedResource elemento sono acl, lifecycle, location, logging, notification, partNumber, policy, requestPayment, uploadID, uploads, versionId, versionId, versioning, versions e website.
Se la richiesta specifica parametri della stringa di query che sostituiscono i valori dell'intestazione della risposta (consultare Get Object), aggiungere i parametri della stringa di query e i rispettivi valori. Al momento della firma questi valori non vanno codificati, ma i valori dei parametri devono essere codificati quando si invia la richiesta. I parametri della stringa di query in una richiesta GET includono
response-content-type,response-content-language,response-expires,response-cache-control,response-content-dispositioneresponse-content-encoding.Il parametro della stringa di
deletequery deve essere incluso quando si crea una richiesta di eliminazione per più oggetti. CanonicalizedResource
Gli elementi provenienti da HTTP Request-URI devono essere firmati letteralmente così come appaiono nella richiesta HTTP, inclusi i URL-Encoding metacaratteri. CanonicalizedResource
CanonicalizedResourcePotrebbe essere diverso dall'HTTP Request-URI. In particolare, se la richiesta utilizza l'Hostintestazione HTTP per specificare un bucket, il bucket non viene visualizzato nell'HTTP. Request-URI Tuttavia, nella CanonicalizedResource è sempre incluso il bucket. I parametri della stringa di query potrebbero essere visualizzati anche in Request-URI ma non sono inclusi in. CanonicalizedResource Per ulteriori informazioni, consulta Hosting virtuale di bucket.
Costruire l'elemento CanonicalizedAmzHeaders
Per creare la CanonicalizedAmzHeaders parte diStringToSign, seleziona tutte le intestazioni delle richieste HTTP che iniziano con 'x-amz-' (utilizzando un confronto senza distinzione tra maiuscole e minuscole) e usa la seguente procedura.
-
Convertire ciascun nome dell'intestazione HTTP in lettere minuscole. Ad esempio "
X-Amz-Date" diventa "x-amz-date". -
Disporre la raccolta delle intestazioni in ordine lessicografico in base al nome dell'intestazione.
-
Combinare i campi di intestazione con lo stesso nome in una coppia "nome-valore:elenco-valori-separati-da-virgole", come stabilito dallo standard RFC 2616, sezione 4.2, senza spazi tra i valori. Ad esempio, le due intestazioni con metadata "
x-amz-meta-username: fred" e "x-amz-meta-username: barney" verrebbero combinate nell'intestazione singola "x-amz-meta-username: fred,barney". -
"Aprire" le intestazioni più lunghe che occupano più righe (come consentito dallo standard RFC 2616, sezione 4.2) sostituendo gli spazi di folding (newline compreso) con un singolo spazio.
-
Rimuovere gli spazi attorno ai due punti nell'intestazione. Ad esempio, l'intestazione '' diventerebbe ''.
x-amz-meta-username: fred,barneyx-amz-meta-username:fred,barney -
Infine, aggiungere un carattere newline (
U+000A) a ogni intestazione standardizzata nell'elenco risultante. Costruisci l' CanonicalizedResource elemento concatenando tutte le intestazioni di questo elenco in un'unica stringa.
Elementi di intestazione HTTP posizionali e denominati StringToSign
I primi elementi di intestazione di StringToSign (Content-Type, Date e Content-MD5) sono di natura posizionale. StringToSignnon include i nomi di queste intestazioni, ma solo i valori relativi alla richiesta. Al contrario, gli elementi "x-amz-" sono denominati. In sono inclusi sia i nomi, sia i valori dell'intestazion StringToSign.
Se un'intestazione posizionale richiamata per la definizione di StringToSign non è presente nella richiesta (ad esempio, Content-Type o Content-MD5 sono facoltative per le richieste PUT e prive di senso per le richieste GET), la stringa vuota ("") per tale posizione va sostituita.
Necessità del time stamp
Per le richieste autenticate, è obbligatorio un time stamp valido (tramite intestazione Date HTTP o un'alternativa x-amz-date). Inoltre, alla ricezione di una richiesta autenticata, il timestamp del client incluso nella richiesta non deve differire di oltre 15 minuti rispetto all'orario di sistema in Amazon S3. In caso contrario, la richiesta avrà esito negativo con il codice di errore RequestTimeTooSkewed. Tali restrizioni hanno lo scopo di limitare le possibilità che una richiesta intercettata possa essere riproposta da un sistema avversario. Per una maggiore protezione contro le intercettazioni, utilizzare il protocollo di trasferimento HTTPS per le richieste autenticate.
Nota
Il vincolo relativo alla convalida della data della richiesta è valido solo per le richieste autenticate che non utilizzano l'autenticazione stringa di query. Per ulteriori informazioni, consulta Alternativa per l'autenticazione di una richiesta tramite stringa di query.
Alcune librerie client HTTP non danno la possibilità di impostare l'intestazione Date per una richiesta. Se includere il valore dell'intestazione "Date" nelle intestazioni standardizzate crea difficoltà, è possibile impostare il time stamp per la richiesta utilizzando l'intestazione "x-amz-date". Il valore dell'intestazione x-amz-date deve essere in uno dei formati RFC 2616 (http://www.ietf.org/rfc/rfc2616.txtx-amz-date, durante il calcolo della firma della richiesta il sistema ignorerà qualsiasi intestazione di tipo Date. Di conseguenza, se si include l'intestazione x-amz-date, va utilizzata la stringa vuota per il valore Date durante la costruzione della stringa StringToSign. Nella prossima sezione sarà riportato un esempio.
Esempi di autenticazione
Gli esempi in questa sezione utilizzano le credenziali (non funzionanti) incluse nella seguente tabella.
| Parametro | Valore |
|---|---|
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE |
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
Negli elementi StringToSign di esempio, la formattazione non è significativa, mentre l'elemento \n rappresenta il punto di codice Unicode U+000A, comunemente chiamato newline. Inoltre, negli esempi viene utilizzato "+0000" per identificare il fuso orario. Allo stesso scopo è anche possibile utilizzare "GMT", ma le firme mostrate nell'esempio saranno diverse.
Richiesta GET di un oggetto
Nell'esempio viene richiesto un oggetto dal bucket awsexamplebucket1.
| Richiesta | StringToSign |
|---|---|
|
|
Nota che CanonicalizedResource include il nome del bucket, ma l'HTTP Request-URI no. (Il bucket è specificato dall'intestazione Host).
Nota
Il seguente script Python calcola la firma precedente utilizzando i parametri forniti. Puoi usare questo script per creare le tue firme, sostituendo le chiavi e StringToSign se necessario.
import base64 import hmac from hashlib import sha1 access_key = 'AKIAIOSFODNN7EXAMPLE'.encode("UTF-8") secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'.encode("UTF-8") string_to_sign = 'GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg'.encode("UTF-8") signature = base64.b64encode( hmac.new( secret_key, string_to_sign, sha1 ).digest() ).strip() print(f"AWS {access_key.decode()}:{signature.decode()}")
Richiesta PUT di un oggetto
Nell'esempio viene inserito un oggetto nel bucket awsexamplebucket1.
| Richiesta | StringToSign |
|---|---|
|
|
Annota l' Content-Type intestazione nella richiesta e nel. StringToSign Nota inoltre che Content-MD5 è lasciato vuoto in StringToSign, perché non è presente nella richiesta.
List
Nell'esempio viene recuperato l'elenco dei contenuti del bucket awsexamplebucket1.
| Richiesta | StringToSign |
|---|---|
|
|
Nota la barra finale CanonicalizedResource e l'assenza di parametri della stringa di query.
Recupero
Nell'esempio viene recuperata la risorsa secondaria relativa alla policy di controllo degli accessi per il bucket "awsexamplebucket1".
| Richiesta | StringToSign |
|---|---|
|
|
Notate come il parametro della stringa di interrogazione della subrisorsa sia incluso in. CanonicalizedResource
Elimina
In questo esempio viene eliminato un oggetto dal bucket "awsexamplebucket1" utilizzando lo stile percorso e l'alternativa Date.
| Richiesta | StringToSign |
|---|---|
|
|
Nota il metodo alternativo 'x-amz-date' per specificare la data (perché la nostra libreria client ci ha impedito di impostare la data, ad esempio). In questo caso, il metodo x-amz-date prevale sull'intestazione Date. Di conseguenza, la voce relativa alla data nella firma deve contenere il valore dell'intestazione x-amz-date.
Caricamento
In questo esempio viene caricato un oggetto in un bucket CNAME in stile hosting virtuale con metadata.
| Richiesta | StringToSign |
|---|---|
|
|
Osserva il modo in cui le intestazioni "x-amz-" vengono ordinate, private degli spazi aggiuntivi e convertite in caratteri minuscoli. Inoltre, più intestazioni con lo stesso nome sono state unite, con i valori separati da virgole.
Si noti come solo le intestazioni delle entità HTTP Content-Type e Content-MD5 siano presenti in StringToSign, mentre le intestazioni dell'altra entità Content-* non lo sono.
Ancora una volta, nota che CanonicalizedResource include il nome del bucket, ma l'HTTP no. Request-URI (Il bucket è specificato dall'intestazione Host).
Elenco di tutti i bucket personali
| Richiesta | StringToSign |
|---|---|
|
|
Chiavi Unicode
| Richiesta | StringToSign |
|---|---|
|
|
Nota
Gli elementi StringToSign che ne derivano Request-URI sono presi alla lettera, compresi quelli URL-Encoding in maiuscolo.
Problemi con la firma delle richieste REST
In caso di errore nell'autenticazione delle richieste REST, il sistema risponde alla richiesta con un documento di errore XML, che contiene informazioni concepite per aiutare gli sviluppatori a individuare il problema. In particolare, l'elemento StringToSign del documento di errore SignatureDoesNotMatch indica esplicitamente il tipo di standardizzazione della richiesta usata dal sistema.
Alcuni kit di strumenti inseriscono tacitamente intestazioni non note in precedenza, ad esempio nel caso dell'aggiunta dell'intestazione Content-Type durante un'operazione PUT. In gran parte dei casi, il valore dell'intestazione inserita rimane costante: questo consente di scoprire le intestazioni mancanti utilizzando strumenti come Ethereal o tcpmon.
Alternativa per l'autenticazione di una richiesta tramite stringa di query
È possibile autenticare alcuni tipi di richieste passando le informazioni necessarie come parametri di una stringa di query, invece di utilizzare l'intestazione HTTP Authorization. Questa soluzione è utile per abilitare l'accesso diretto da parte di browser di terze parti ai dati Amazon S3 privati senza proxy della richiesta. L'idea è costruire di una richiesta "prefirmata" e codificarla come URL recuperabile da parte del browser di un utente finale. È inoltre possibile limitare una richiesta prefirmata specificando un periodo di scadenza.
Per ulteriori informazioni sull'utilizzo dei parametri di query per autenticare le richieste, consulta Authenticating Requests: Using Query Parameters (AWS Signature Version 4) nell'Amazon Simple Storage Service API Reference. Per esempi di utilizzo degli AWS SDK per generare URL prefirmati, consulta Condivisione di oggetti con URL prefirmati.
Creazione di una firma
Di seguito è riportato un esempio di richiesta REST Amazon S3 autenticata tramite stringa di query.
GET /photos/puppy.jpg ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Mon, 26 Mar 2007 19:37:58 +0000
Il metodo di autenticazione delle richieste tramite stringa di query non richiede particolari intestazioni HTTP. Gli elementi necessari all'autenticazione sono invece specificati come parametri della stringa di query:
| Nome parametro stringa di query | Valore di esempio | Description |
|---|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
L'ID della tua chiave di accesso. AWS Specifica la chiave di accesso AWS segreta utilizzata per firmare la richiesta e, indirettamente, l'identità dello sviluppatore che effettua la richiesta. |
Expires |
1141889120 |
L'ora di scadenza della firma, specificata come numero di secondi dal valore epoca (Unix epoch, ovvero 00:00:00 UTC del 1° gennaio 1970). Se ricevuta dopo l'ora indicata (secondo il server), la richiesta verrà rifiutata. |
Signature |
vjbyPxybdZaNmGa%2ByT272YEAiv4%3D |
La codifica URL della codifica Base64 di of. HMAC-SHA1 StringToSign |
Il metodo di autenticazione delle richieste tramite stringa di query varia leggermente rispetto al metodo tradizionale, ma solo nel formato del parametro di richiesta Signature e nell'elemento StringToSign. Di seguito è riportato un esempio di grammatica che illustra il metodo di autenticazione delle richieste tramite stringa di query.
Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) ); StringToSign = HTTP-VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Expires + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource;
YourSecretAccessKeyè l'ID della chiave di accesso AWS segreta che Amazon ti assegna quando ti registri per diventare uno sviluppatore di Amazon Web Service. Nota come Signature è URL-Encoded necessario renderlo adatto per il posizionamento nella stringa di query. Inoltre, in StringToSign, l'elemento posizionale HTTP Date è stato sostituito con l'elemento Expires, mentre CanonicalizedAmzHeaders e CanonicalizedResource restano invariati.
Nota
Nel metodo di autenticazione stringa di query, non si utilizzano né l'elemento Date né l'intestazione x-amz-date request per il calcolo della stringa da firmare.
Autenticazione di una richiesta tramite stringa di query
| Richiesta | StringToSign |
|---|---|
|
|
Questo esempio presuppone che quando un browser effettua la richiesta GET, non fornisca Content-MD5 né un' Content-Type intestazione né imposti alcuna intestazione x-amz-, quindi tali parti vengono lasciate vuote. StringToSign
Utilizzo della codifica Base64
Le firme di richiesta HMAC devono essere codificate in formato Base64. La codifica Base64 converte la firma in una stringa ASCII semplice che è possibile allegare alla richiesta. Se utilizzati in un URI, i caratteri che possono essere presenti in una firma, ad esempio il più (+), la barra (/) e l'uguale (=), devono essere codificati. Ad esempio, se il codice di autenticazione include un simbolo più (+), nella richiesta va codificato come %2B. La codifica per la barra è %2F, mentre per l'uguale è %3D.
Per esempi di codifica Base64, consulta di Amazon 3 Esempi di autenticazione.