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à.
Creare una richiesta AWS API firmata
Importante
Se utilizzi uno strumento AWS SDK (vedi Codice di esempio e librerie
Nelle regioni che supportano più versioni di firma, per le richieste di firma manuale è necessario specificare quale versione della firma viene utilizzata. Quando si forniscono richieste a punti di accesso multiregionali SDKs e la CLI passa automaticamente all'utilizzo della versione 4A di Signature senza configurazioni aggiuntive.
È possibile utilizzare il protocollo di firma AWS SigV4 per creare una richiesta firmata per le richieste API. AWS
-
Creazione di una richiesta canonica basata sui dettagli della richiesta.
-
Calcolo di una firma utilizzando le tue credenziali. AWS
-
L'aggiunta di questa firma alla richiesta come intestazione di autorizzazione.
AWS quindi replica questo processo e verifica la firma, concedendo o negando l'accesso di conseguenza.
Per scoprire come utilizzare AWS SigV4 per firmare le richieste API, consulta. Richiesta di esempi di firma
La tabella seguente descrive le funzioni utilizzate nel processo di creazione di una richiesta firmata. Per queste funzioni devi implementare il codice. Per ulteriori informazioni, consulta gli esempi di codice in. AWS SDKs
| Funzione | Description |
|---|---|
|
|
Converte la stringa in minuscolo. |
|
|
Codifica in base 16 minuscola. |
|
|
Funzione hash crittografica Secure Hash Algorithm (SHA). |
|
|
Calcola HMAC utilizzando l' SHA256 algoritmo con la chiave di firma fornita. Questa è la firma definitiva quando firmi con SigV4. |
|
|
Firma ECDSA (Elliptic Curve Digital Signature Algorithm) calcolata utilizzando firme asimmetriche basate sulla crittografia a chiave pubblica/privata. |
|
|
|
|
|
Una funzione da ottetto a numero intero come descritto in ANSI X9.62. |
|
|
Rimuove eventuali spazi bianchi all'inizio o alla fine della stringa. |
|
|
L'URI codifica ogni byte. UriEncode() deve applicare le seguenti regole:
ImportanteLe UriEncode funzioni standard fornite dalla piattaforma di sviluppo potrebbero non funzionare a causa delle differenze di implementazione e della relativa ambiguità nella base. RFCs Ti consigliamo di scrivere una UriEncode funzione personalizzata per assicurarti che la codifica funzioni. Per vedere un esempio di UriEncode funzione in Java, consulta Java Utilities sul GitHub sito |
Nota
Quando firmi le tue richieste, puoi usare AWS SigV4 o SigV4a. AWS La differenza fondamentale tra le due versioni è determinata dalla modalità di calcolo della firma. Con SigV4a, il set di Regioni è incluso nella stringa da firmare, ma non fa parte della fase di derivazione delle credenziali.
Firma delle richieste con credenziali di sicurezza provvisorie
Invece di utilizzare credenziali a lungo termine per firmare una richiesta, è possibile utilizzare credenziali di sicurezza temporanee fornite da (). AWS Security Token Service AWS STS
Quando si utilizzano credenziali di sicurezza temporanee, è necessario aggiungere X-Amz-Security-Token all'intestazione di autorizzazione o includerlo nella stringa di query per contenere il token di sessione. Alcuni servizi richiedono l'aggiunta di X-Amz-Security-Token alla richiesta canonica. Per gli altri servizi, aggiungi il parametro X-Amz-Security-Token alla fine, dopo aver calcolato la firma. Consultate la documentazione relativa a ciascuno di essi Servizio AWS per conoscere i requisiti specifici.
Riepilogo delle fasi di firma
Creare una richiesta canonica
Disponi i contenuti della tua richiesta (host, operazione, intestazioni, ecc.) in un formato standard (canonico). La richiesta canonica è uno degli input utilizzati per creare la stringa da firmare. Per i dettagli sulla creazione della richiesta canonica, consulta Elementi della firma di una richiesta AWS API
Creare un hash della richiesta canonica
Crea un hash della richiesta canonica con lo stesso algoritmo utilizzato per creare l'hash del payload. L'hash della richiesta canonica è una stringa di caratteri esadecimali minuscoli.
Creare una stringa da firmare
Crea una stringa da firmare con la richiesta canonica e informazioni aggiuntive, ad esempio l'algoritmo, la data della richiesta, l'ambito delle credenziali e l'hash della richiesta canonica.
Derivare una chiave di firma
Usa la chiave di accesso segreta per derivare la chiave utilizzata per firmare la richiesta.
Calcolare la firma
Esegui un’operazione di hash con chiave sulla stringa da firmare utilizzando la chiave di firma derivata come chiave hash.
Aggiungere la firma alla richiesta
Aggiungi la firma calcolata a un'intestazione HTTP o alla stringa di query della richiesta.
Creare una richiesta canonica
Per creare una richiesta canonica concatena le seguenti stringhe, separate da caratteri di nuova riga. Questo aiuta a garantire che la firma calcolata possa corrispondere alla firma AWS calcolata.
<HTTPMethod>\n<CanonicalURI>\n<CanonicalQueryString>\n<CanonicalHeaders>\n<SignedHeaders>\n<HashedPayload>
-
HTTPMethod— Il metodo HTTP, ad esempioGET,PUTHEAD, eDELETE. -
CanonicalUri— La versione con codifica URI dell'URI del componente del percorso assoluto, a partire da/quella che segue il nome di dominio e fino alla fine della stringa o fino al punto interrogativo (?) se sono presenti parametri della stringa di query. Se il percorso assoluto è vuoto, usa una barra (/). L'URI nell'esempio seguente,/amzn-s3-demo-bucket/myphoto.jpg, è il percorso assoluto e non devi codificare la/nel percorso assoluto:http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg -
CanonicalQueryString— I parametri della stringa di query con codifica URI. Ogni nome e ogni valore vengono codificati singolarmente tramite URI. È inoltre necessario ordinare i parametri nella stringa di query canonica in ordine alfabetico in base al nome della chiave. L'ordinamento avviene dopo la codifica. La stringa di query nell'esempio di URI seguente è:http://s3.amazonaws.com/amzn-s3-demo-bucket?prefix=somePrefix&marker=someMarker&max-keys=2La stringa di query canonica è la seguente (le interruzioni di riga vengono aggiunte a questo esempio a fini di leggibilità):
UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix")Quando una richiesta ha come target una sottorisorsa, il valore del parametro di query corrispondente sarà una stringa vuota (
""). Ad esempio, il seguente URI identifica la sottorisorsaACLsul bucketamzn-s3-demo-bucket:http://s3.amazonaws.com/amzn-s3-demo-bucket?aclIn questo caso, sarebbe: CanonicalQueryString
UriEncode("acl") + "=" + ""Se l'URI non include un
?, la richiesta non contiene una stringa di query e occorre impostare la stringa di query canonica su una stringa vuota (""). Dovrai comunque includere il carattere di nuova riga ("\n"). -
CanonicalHeaders— Un elenco di intestazioni di richiesta con i relativi valori. Le singole coppie di nome e valore dell'intestazione sono separate dal carattere di nuova riga ("\n"). Di seguito è riportato un esempio di CanonicalHeader:Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n" Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n" ... Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"CanonicalHeaders l'elenco deve includere quanto segue:
-
Intestazione
hostHTTP. -
Se l'
Content-Typeintestazione è presente nella richiesta, è necessario aggiungerla all'CanonicalHeaderselenco. -
Devi aggiungere anche qualsiasi intestazione
x-amz-*che desideri includere nella richiesta. Ad esempio, se utilizzi credenziali di sicurezza temporanee, nella tua richiesta devi includerex-amz-security-token. È necessario aggiungere questa intestazione nell'elenco di.CanonicalHeaders -
Per SigV4a, è necessario includere un’intestazione dell’insieme di Regioni che specifichi l’insieme delle Regioni in cui la richiesta sarà valida. L’intestazione
X-Amz-Region-Setè specificata come un elenco di valori separati da virgole. L’esempio seguente mostra un’intestazione di Regione che consente di effettuare una richiesta sia nella Regione us-east-1 sia in us-west-1.X-Amz-Region-Set=us-east-1,us-west-1È possibile utilizzare i caratteri jolly (*) nelle Regioni per specificare più Regioni. Nell’esempio seguente, l’intestazione consente di effettuare una richiesta sia in us-west-1 sia in us-west-2.
X-Amz-Region-Set=us-west-*
Nota
L'intestazione
x-amz-content-sha256è necessaria per le richieste AWS Amazon S3. Fornisce un hash del payload di richiesta. Se non è presente alcun payload, devi indicare l'hash di una stringa vuota.Il nome di ogni intestazione deve:
-
usare caratteri minuscoli.
-
in ordine alfabetico.
-
seguiti da due punti (
:).
Per i valori, devi:
-
eliminare eventuali spazi all'inizio o alla fine.
-
convertire gli spazi sequenziali in uno spazio singolo.
-
separare i valori per un'intestazione multivalore con virgole.
-
Nella firma devi includere l'intestazione dell'host (HTTP/1.1) o l'intestazione :authority (HTTP/2) e tutte le intestazioni
x-amz-*. Facoltativamente puoi includere altre intestazioni standard nella firma, ad esempio content-type.
Le funzioni
Lowercase()eTrim()utilizzate in questo esempio sono descritte nella sezione precedente.Di seguito è riportata una stringa
CanonicalHeadersdi esempio. I nomi di intestazione sono in caratteri minuscoli e in ordine alfabetico.host:s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130708T220855ZNota
Ai fini del calcolo di una firma di autorizzazione, sono richiesti solo l’host e qualsiasi altra intestazione
x-amz-*; tuttavia, per evitare la manomissione dei dati, nel calcolo della firma è consigliabile includere intestazioni aggiuntive.Non includete hop-by-hop intestazioni che vengono modificate frequentemente durante il transito su un sistema complesso. Questo comprende tutte le intestazioni di trasporto volatili che vengono modificate da proxy, bilanciatori del carico e nodi in un sistema distribuito, tra cui
connection,x-amzn-trace-id,user-agent,keep-alive,transfer-encoding,TE,trailer,upgrade,proxy-authorizationeproxy-authenticate. -
-
SignedHeaders— Un elenco in ordine alfabetico e separati da punto e virgola di nomi di intestazioni di richiesta in lettere minuscole. Le intestazioni della richiesta nell'elenco sono le stesse che hai incluso nella stringaCanonicalHeaders. Nell'esempio precedente, il valore di sarebbe il seguente:SignedHeadershost;x-amz-content-sha256;x-amz-date -
HashedPayload— Una stringa creata utilizzando il payload nel corpo della richiesta HTTP come input per una funzione hash. Questa stringa utilizza caratteri esadecimali minuscoli.Hex(SHA256Hash(<payload>>))Se non è presente alcun payload nella richiesta, calcola un hash della stringa vuota, ad esempio quando recupera un oggetto utilizzando una richiesta
GET, non è presente nulla nel payload.Hex(SHA256Hash(""))Nota
Per Amazon S3, includi la stringa letterale
UNSIGNED-PAYLOADdurante la creazione di una richiesta canonica e imposta lo stesso valore dell'intestazionex-amz-content-sha256quando invii la richiesta.Hex(SHA256Hash("UNSIGNED-PAYLOAD"))
Creare un hash della richiesta canonica
Crea un hash (digest) della richiesta canonica con lo stesso algoritmo utilizzato per creare l'hash del payload. L'hash della richiesta canonica è una stringa di caratteri esadecimali minuscoli.
Creare una stringa da firmare
Per creare una stringa, concatenare le seguenti stringhe, separate da caratteri di nuova riga. Non terminare questa stringa con un carattere di nuova riga.
Algorithm \n
RequestDateTime \n
CredentialScope \n
HashedCanonicalRequest
-
Algorithm— L'algoritmo utilizzato per creare l'hash della richiesta canonica.-
SigV4: utilizza
AWS4-HMAC-SHA256per specificare l’algoritmo hashHMAC-SHA256. -
SigV4a: utilizza
AWS4-ECDSA-P256-SHA256per specificare l’algoritmo hashECDSA-P256-SHA-256.
-
-
RequestDateTime— La data e l'ora utilizzate nell'ambito delle credenziali. Questo valore è l'ora UTC corrente in formato ISO 8601 (ad esempio,20130524T000000Z). -
CredentialScope— L'ambito delle credenziali, che limita la firma risultante alla regione e al servizio specificati.-
SigV4: le credenziali includono una stringa composta dall’ID della chiave di accesso, dalla data in formato
YYYYMMDD, dal codice della Regione, dal codice del servizio e dalla stringa di chiusuraaws4_request, separati da barre (/). Devi utilizzare caratteri minuscoli per la regione, il codice del servizio e la stringa di chiusura. La stringa ha il seguente formato:YYYYMMDD/region/service/aws4_request. -
SigV4a: le credenziali includono la data in formato
YYYYMMDD, il nome del servizio e la stringa di chiusuraaws4_request, separati da barre (/). Ricorda che l’ambito delle credenziali non include la Regione, poiché è indicata in un’intestazione separataX-Amz-Region-Set. La stringa ha il seguente formato:YYYYMMDD/service/aws4_request.
-
-
HashedCanonicalRequest— L'hash della richiesta canonica, calcolato nel passaggio precedente.
Di seguito è riportata una stringa di esempio da firmare.
"<Algorithm>" + "\n" +
timeStampISO8601Format + "\n" +
<Scope> + "\n" +
Hex(<Algorithm>(<CanonicalRequest>))
Derivare una chiave di firma
Per derivare una chiave di firma, scegli uno dei seguenti processi per calcolare una chiave di firma per SigV4 o SigV4a.
Derivazione di una chiave di firma per SigV4
Per derivare una chiave di firma per SigV4, esegui una serie di operazioni hash con chiave (HMAC) sulla data, sulla regione e sul servizio della richiesta, utilizzando la chiave di accesso AWS segreta come chiave per l'operazione di hashing iniziale.
Per ogni passaggio, richiama la funzione hash con la chiave e i dati richiesti. Il risultato di ogni chiamata alla funzione hash diventa l'input per la chiamata successiva alla funzione.
L'esempio seguente mostra come derivare l'elemento SigningKey utilizzato nella sezione successiva di questa procedura, mostrando l'ordine in cui l'input viene concatenato e sottoposto ad hash. HMAC-SHA256 è la funzione hash utilizzata per eseguire l'hash dei dati come mostrato.
DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
Input richiesto
-
Key: una stringa che contiene la tua chiave di accesso segreta. -
Date: una stringa che contiene la data utilizzata nell’ambito delle credenziali, nel formato AAAAMMGG. -
Region: una stringa che contiene il codice della Regione (ad esempio,us-east-1).Per un elenco delle stringhe delle regioni, consulta la pagina Endpoint regionali in Riferimenti generali di AWS.
-
Service: una stringa che contiene il codice del servizio (ad esempio,ec2). -
La stringa da firmare creata nel passaggio precedente.
Per derivare una chiave di firma per SigV4
-
Concatena
"AWS4"e la chiave di accesso segreta. Chiama la funzione hash con la stringa concatenata come stringa di chiave e data come dati.DateKey = hash("AWS4" + Key, Date) -
Chiama la funzione hash con il risultato della chiamata precedente come stringa di chiave e regione come dati.
DateRegionKey = hash(kDate, Region) -
Chiama la funzione hash con il risultato della chiamata precedente come stringa di chiave e servizio come dati.
Il codice del servizio è definito dal servizio. Puoi utilizzare get-products
nella CLI di AWS Pricing per restituire il codice di servizio per un servizio. DateRegionServiceKey = hash(kRegion, Service) -
Chiama la funzione hash con il risultato della chiamata precedente come chiave e "aws4_request" come dati.
SigningKey = hash(kService, "aws4_request")
Derivazione di una chiave di firma per SigV4a
Per creare una chiave di firma per SigV4Aa, utilizza il seguente processo per derivare una coppia di chiavi dalla chiave di accesso segreta. Per un esempio di implementazione di questa derivazione, vedete l'implementazione dell'autenticazione lato client nella libreria C99 AWS
n = [NIST P-256 elliptic curve group order] G = [NIST P-256 elliptic curve base point] label = "AWS4-ECDSA-P256-SHA256" akid = [AWS access key ID as a UTF8 string] sk = [AWS secret access Key as a UTF8 Base64 string] input_key = "AWS4A" || sk count = 1 while (counter != 255) { context = akid || counter// note: counter is one bytekey = KDF(input_key, label, context, 256) c = Oct2Int(key) if (c > n - 2) { counter++ } else { k = c + 1// private keyQ = k * G// public key} } if (c < 255) { return [k, Q] } else { return FAILURE }
Calcolare la firma
Una volta derivata la chiave di firma, puoi calcolare la firma da aggiungere alla richiesta. Questa procedura varia in base alla versione di firma utilizzata.
Per calcolare una firma per SigV4
-
Chiama la funzione hash con il risultato della chiamata precedente come chiave e stringa da firmare come dati. Usa la chiave di firma derivata come chiave hash per questa operazione. Il risultato è la firma come valore binario.
signature = hash(SigningKey,string-to-sign) -
Converti la firma da rappresentazione binaria a esadecimale, in caratteri minuscoli.
Per calcolare una firma per SigV4a
-
Utilizzando l’algoritmo di firma digitale (ECDSA P-256), firma la stringa da firmare che hai creato nel passaggio precedente. La chiave utilizzata per questa firma è la chiave asimmetrica privata derivata dalla chiave di accesso segreta come descritto sopra.
signature = base16(ECDSA-Sign(k,string-to-sign)) -
Converti la firma da rappresentazione binaria a esadecimale, in caratteri minuscoli.
Aggiungere la firma alla richiesta
Aggiungi la firma calcolata alla tua richiesta.
Esempio: intestazione di autorizzazione
SigV4
L'esempio seguente mostra un'Authorizationintestazione per l'azione che utilizza SigV4. DescribeInstances AWS Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga. Nel tuo codice, deve essere una stringa continua. Non vi è alcun virgola tra l'algoritmo e Credential. Tuttavia, gli altri elementi devono essere separati da virgole.
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-date,
Signature=calculated-signatureSigV4a
L'esempio seguente mostra un'intestazione di autorizzazione per l'azione che utilizza SigV4a. CreateBucket AWS Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga. Nel tuo codice, deve essere una stringa continua. Non vi è alcun virgola tra l’algoritmo e le credenziali. Tuttavia, gli altri elementi devono essere separati da virgole.
Authorization: AWS4-ECDSA-P256-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/s3/aws4_request,
SignedHeaders=host;x-amz-date;x-amz-region-set,
Signature=calculated-signature
Esempio: richiesta con parametri di autenticazione nella stringa di query
SigV4
L'esempio seguente mostra una query per l'DescribeInstancesazione che utilizza AWS SigV4 che include le informazioni di autenticazione. Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga e non è codificato con l'URL. Nel codice, la stringa di query deve essere una stringa continua con codifica URL.
https://ec2.amazonaws.com/?
Action=DescribeInstances&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date&
X-Amz-Signature=calculated-signatureSigV4a
L’esempio seguente mostra una query per l’operazione CreateBucket utilizzando AWS SigV4a che include le informazioni di autenticazione. Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga e non è codificato con l'URL. Nel codice, la stringa di query deve essere una stringa continua con codifica URL.
https://ec2.amazonaws.com/?
Action=CreateBucket&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/s3/aws4_request&
X-Amz-Region-Set=us-west-1&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date;x-amz-region-set&
X-Amz-Signature=calculated-signature