Creare una AWS API richiesta firmata - AWS Identity and Access Management

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 AWS API richiesta firmata

Importante

Se utilizzi uno strumento AWS SDK (vedi Codice di esempio e librerieAWS CLI) o AWS Command Line Interface () a cui inviare API richieste AWS, puoi saltare questa sezione perché i CLI client SDK e autenticano le tue richieste utilizzando le chiavi di accesso fornite. A meno che tu non abbia una buona ragione per non farlo, ti consigliamo di utilizzare sempre uno SDK o il. CLI

Nelle regioni che supportano più versioni con firma, la firma manuale delle richieste significa che è necessario specificare quale versione di firma viene utilizzata. Quando si forniscono richieste a punti di accesso multiregionali SDKs e si passa CLI 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. AWS API

  1. Creazione di una richiesta canonica basata sui dettagli della richiesta.

  2. Calcolo di una firma utilizzando le tue credenziali. AWS

  3. Aggiungere 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, vedi API Richiesta di esempi di firma

Il diagramma seguente illustra il processo di firma SigV4, inclusi i vari componenti della stringa creata per la firma.

Un'immagine delle parti di una richiesta canonica, inclusa la stringa da firmare, la chiave di firma e la firma.

La tabella seguente descrive le funzioni mostrate nel diagramma. Per queste funzioni devi implementare il codice. Per ulteriori informazioni, vedere gli esempi di codice in. AWS SDKs

Funzione Descrizione

Lowercase()

Converte la stringa in minuscolo.

Hex()

Codifica in base 16 minuscola.

SHA256Hash()

Funzione hash crittografica Secure Hash Algorithm (SHA).

HMAC-SHA256()

Calcola HMAC utilizzando l'SHA256algoritmo con la chiave di firma fornita. Questa è la firma definitiva.

Trim()

Rimuove eventuali spazi bianchi all’inizio o alla fine della stringa.

UriEncode()

URIcodifica ogni byte. UriEncode() deve applicare le seguenti regole:

  • URIcodifica tutti i byte tranne i caratteri non riservati: 'A'-'Z', 'a'-'z', '0'-'9', ',' . ',' _ 'e '~'.

  • Il carattere di spazio è un carattere riservato e deve essere codificato come "%20" (e non come "+").

  • Ogni byte URI codificato è formato da un '%' e dal valore esadecimale a due cifre del byte.

  • Le lettere nel valore esadecimale devono essere maiuscole, ad esempio "%1A".

  • Codifica la barra, '/', ovunque tranne nel nome della chiave dell'oggetto. Ad esempio, se il nome della chiave dell'oggetto è photos/Jan/sample.jpg, la barra nel nome della chiave non è codificata.

Importante

Le 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 Web.

Nota

Quando firmi le tue richieste, puoi utilizzare AWS Signature Version 4 o AWS Signature Version 4A. La differenza fondamentale tra le due versioni è determinata dalla modalità di calcolo della firma. Con AWS Signature Version 4A, la firma non include informazioni specifiche della regione e viene calcolata utilizzando l'algoritmo. AWS 4-ECDSA-P256-SHA256

Richieste di firma con credenziali di sicurezza temporanee

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 utilizzate credenziali di sicurezza temporanee, dovete aggiungerle X-Amz-Security-Token all'intestazione Authorization o includerle 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. Consulta la documentazione relativa a ciascuno di essi Servizio AWS per conoscere i requisiti specifici.

Riepilogo delle fasi di firma

Crea 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, vedere. Elementi della firma di una AWS API richiesta

Crea un hash della richiesta canonica

Effettua l'hash della richiesta canonica utilizzando lo stesso algoritmo utilizzato per creare l'hash del payload. L'hash della richiesta canonica è una stringa di caratteri esadecimali minuscoli.

Crea una stringa da firmare

Crea una stringa da firmare con la richiesta canonica e informazioni aggiuntive come l'algoritmo, la data della richiesta, l'ambito delle credenziali e l'hash della richiesta canonica.

Ricava una chiave di firma

Esegui una serie di operazioni hash con chiave (HMAC) nella data, nella regione e nel servizio della richiesta, utilizzando la chiave di accesso AWS segreta come chiave per l'operazione di hashing iniziale.

Calcola la firma

Eseguite un'operazione di hash con chiave (HMAC) sulla stringa da firmare utilizzando la chiave di firma derivata come chiave hash.

Aggiungi la firma alla richiesta

Aggiungi la firma calcolata a un'HTTPintestazione o alla stringa di query della richiesta.

Crea 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 calcolata. AWS

<HTTPMethod>\n <CanonicalURI>\n <CanonicalQueryString>\n <CanonicalHeaders>\n <SignedHeaders>\n <HashedPayload>
  • HTTPMethod — Il HTTP metodo, ad esempioGET, PUTHEAD, eDELETE.

  • CanonicalUri — La versione con URI codifica del componente del percorso assolutoURI, 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, utilizzate una barra (). / L'URIesempio seguente/amzn-s3-demo-bucket/myphoto.jpg, è il percorso assoluto e non lo codificate / nel percorso assoluto:

    http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg
  • CanonicalQueryString — I parametri della URI stringa di interrogazione con codifica. Si URI codifica singolarmente ogni nome e valore. È 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'URIesempio seguente è:

    http://s3.amazonaws.com/amzn-s3-demo-bucket?prefix=somePrefix&marker=someMarker&max-keys=2

    La 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 è indirizzata a una sottorisorsa, il valore del parametro di query corrispondente sarà una stringa vuota (""). Ad esempio, quanto segue URI identifica la ACL sottorisorsa nel bucket: amzn-s3-demo-bucket

    http://s3.amazonaws.com/amzn-s3-demo-bucket?acl

    In questo caso, sarebbe: CanonicalQueryString

    UriEncode("acl") + "=" + ""

    Se URI non include a?, non è presente alcuna stringa di query nella richiesta e si imposta 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:

    • HTTPhostintestazione.

    • Se l'Content-Typeintestazione è presente nella richiesta, è necessario aggiungerla al CanonicalHeaders elenco.

    • Devi aggiungere anche qualsiasi intestazione x-amz-* che desideri includere nella richiesta. Ad esempio, se utilizzi credenziali di sicurezza temporanee, nella tua richiesta devi includere x-amz-security-token. È necessario aggiungere questa intestazione nell'elenco di CanonicalHeaders.

    Nota

    L'x-amz-content-sha256intestazione è necessaria per le richieste Amazon AWS 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.

    • essere seguito 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.

    • È necessario includere l'intestazione host (HTTP/1.1) o l'intestazione:authority (HTTP/2) e tutte le intestazioni nella firma. x-amz-* Facoltativamente puoi includere altre intestazioni standard nella firma, ad esempio content-type.

    Le funzioni Lowercase() e Trim() utilizzate in questo esempio sono descritte nella sezione precedente.

    Di seguito è riportata una stringa CanonicalHeaders di 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:20130708T220855Z

    Nota

    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 tutte le intestazioni.

  • 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 stringa CanonicalHeaders. Nell'esempio precedente, il valore di SignedHeaders sarebbe il seguente:

    host;x-amz-content-sha256;x-amz-date
  • HashedPayload — Una stringa creata utilizzando il payload nel corpo della HTTP richiesta come input per una funzione hash. Questa stringa utilizza caratteri esadecimali minuscoli.

    Hex(SHA256Hash(<payload>>))

    Se non è presente alcun payload nella richiesta, si calcola un hash della stringa vuota, ad esempio quando si recupera un oggetto utilizzando una GET richiesta, non c'è nulla nel payload.

    Hex(SHA256Hash(""))
    Nota

    Per Amazon S3, includi la stringa letterale UNSIGNED-PAYLOAD durante la creazione di una richiesta canonica e imposta lo stesso valore dell'x-amz-content-sha256intestazione quando invii la richiesta.

    Hex(SHA256Hash("UNSIGNED-PAYLOAD"))

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

Crea una stringa da firmare

Per creare una stringa da firmare, concatenate 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. Per SHA -256, l'algoritmo è. AWS4-HMAC-SHA256

  • RequestDateTime — La data e l'ora utilizzate nell'ambito delle credenziali. Questo valore è l'UTCora corrente nel formato ISO 8601 (ad esempio,20130524T000000Z).

  • CredentialScope — L'ambito delle credenziali, che limita la firma risultante alla regione e al servizio specificati. La stringa ha il seguente formato: YYYYMMDD/region/service/aws4_request.

  • HashedCanonicalRequest — L'hash della richiesta canonica, calcolato nel passaggio precedente.

Di seguito è riportata una stringa di esempio da firmare.

"AWS4-HMAC-SHA256" + "\n" + timeStampISO8601Format + "\n" + <Scope> + "\n" + Hex(SHA256Hash(<CanonicalRequest>))

Ricava una chiave di firma

Per derivare una chiave di firma, esegui una serie di operazioni hash con chiave (HMAC) nella data, nella regione e nel 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 derivate le informazioni SigningKey utilizzate nella sezione successiva di questa procedura, mostrando l'ordine in cui l'input viene concatenato e sottoposto a 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 chiave di accesso segreta.

  • Date, una stringa che contiene la data utilizzata nell'ambito delle credenziali, nel formato YYYYMMDD.

  • Region, una stringa che contiene il codice regionale (ad esempio,us-east-1).

    Per un elenco delle stringhe Regional, consulta Regional Endpoints in. Riferimenti generali di AWS

  • Service, una stringa che contiene il codice di servizio (ad esempio,ec2).

  • La stringa da firmare creata nel passaggio precedente.

Per derivare una chiave di firma
  1. Concatenate "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)
  2. Chiama la funzione hash con il risultato della chiamata precedente come stringa di chiave e regione come dati.

    DateRegionKey = hash(kDate, Region)
  3. 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 sezione AWS Prezzi CLI per restituire il codice di servizio di un servizio.

    DateRegionServiceKey = hash(kRegion, Service)
  4. Chiama la funzione hash con il risultato della chiamata precedente come chiave e "aws4_request" come dati.

    SigningKey = hash(kService, "aws4_request")

Calcola la firma

Dopo aver derivato la chiave di firma, calcola la firma eseguendo un'operazione di hash con chiave sulla stringa da firmare. Usa la chiave di firma derivata come chiave hash per questa operazione.

Per calcolare una firma
  1. Chiama la funzione hash con il risultato della chiamata precedente come chiave e stringa da firmare come dati. Il risultato è la firma come valore binario.

    signature = hash(SigningKey, string-to-sign)
  2. Converti la firma da rappresentazione binaria a esadecimale, in caratteri minuscoli.

Aggiungi la firma alla richiesta

Aggiungi la firma calcolata alla tua richiesta.

Esempio: intestazione di autorizzazione

Nell'esempio seguente viene mostrata una intestazione Authorization per l'operazione DescribeInstances. 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-signature
Esempio: richiesta con parametri di autenticazione nella stringa di query

L'esempio seguente mostra una query per l'operazione DescribeInstances che include le informazioni di autenticazione. Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga e non URL è codificato. Nel codice, la stringa di query deve essere una stringa continua codificata. 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-signature