View a markdown version of this page

Autenticazione delle richieste: utilizzo dei parametri di interrogazione (AWS Signature (versione 4) - Amazon Simple Storage Service

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

Autenticazione delle richieste: utilizzo dei parametri di interrogazione (AWS Signature (versione 4)

Come descritto nella panoramica sull'autenticazione (vedereMetodi di autenticazione), è possibile fornire informazioni di autenticazione utilizzando i parametri della stringa di query. L'utilizzo dei parametri di interrogazione per autenticare le richieste è utile quando si desidera esprimere una richiesta interamente in un URL. Questo metodo viene anche chiamato prefirma di un URL.

Uno scenario d'uso per gli URL prefirmati è la possibilità di concedere un accesso temporaneo alle risorse Amazon S3. Ad esempio, puoi incorporare un URL prefirmato nel tuo sito Web o, in alternativa, utilizzarlo in un client a riga di comando (come Curl) per scaricare oggetti.

Nota

Puoi anche usare il AWS CLI per creare URL prefirmati. Per ulteriori informazioni, consulta presign nella documentazione di riferimento dei comandi della AWS CLI .

Di seguito è riportato un esempio di URL prefirmato.

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request &X-Amz-Date=20130721T201207Z &X-Amz-Expires=86400 &X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

Nell'URL di esempio, nota quanto segue:

  • I feed di riga vengono aggiunti per motivi di leggibilità.

  • Il valore X-Amz-Credential nell'URL mostra il carattere “/” solo per leggibilità. In pratica, dovrebbe essere codificato come. %2F Ad esempio:

    &X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request

La tabella seguente descrive i parametri della query nell'URL che forniscono informazioni di autenticazione.

Nome parametro stringa di query Valore di esempio
X-Amz-Algorithm

Identifica la versione di AWS Signature e l'algoritmo utilizzato per calcolare la firma.

Per la versione 4 di AWS Signature, imposti il valore di questo parametro suAWS4-HMAC-SHA256. Questa stringa identifica AWS la versione 4 (AWS 4) di Signature e l' HMAC-SHA256 algoritmo (HMAC-SHA256).

X-Amz-Credential

Oltre all'ID della chiave di accesso, questo parametro fornisce anche l'ambito (Regione AWS e il servizio) per cui la firma è valida. Questo valore deve corrispondere all'ambito utilizzato nei calcoli della firma, illustrato nella sezione seguente. La forma generale per questo valore di parametro è la seguente:

<your-access-key-id>/<date>/<Regione AWS>/<AWS-service>/aws4_request

Ad esempio:

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

Per Amazon S3, la AWS-service stringa ès3. Per un elenco delle AWS-region stringhe S3, consulta Regioni ed endpoint in. Riferimenti generali di AWS

X-Amz-Date

Il formato di data e ora deve seguire lo standard ISO 8601 e deve essere formattato con il formato "yyyyMMddT Z». HHmmss Ad esempio, se la data e l'ora erano "08/01/2016 15:32:41.982-700", devono prima essere convertite in UTC (Coordinated Universal Time) e quindi inviate come «20160801T223241Z».

X-Amz-Expires

Fornisce il periodo di tempo, in secondi, per il quale l'URL prefirmato generato è valido. Ad 86400 esempio, (24 ore). Questo valore è un numero intero. Il valore minimo che puoi impostare è 1 e il massimo è 604800 (sette giorni).

Un URL prefirmato può essere valido per un massimo di sette giorni perché la chiave di firma utilizzata nel calcolo della firma è valida per un massimo di sette giorni.

X-Amz-SignedHeaders

Elenca le intestazioni che hai utilizzato per calcolare la firma. Per i calcoli delle firme sono necessarie le seguenti intestazioni:

  • L'hostintestazione HTTP.

  • Tutte le x-amz-* intestazioni che intendi aggiungere alla richiesta.

Nota

Per maggiore sicurezza, devi firmare tutte le intestazioni della richiesta che intendi includere nella richiesta.

X-Amz-Signature

Fornisce la firma per autenticare la richiesta. Questa firma deve corrispondere alla firma calcolata da Amazon S3; in caso contrario, Amazon S3 respinge la richiesta. Ad esempio, 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7

I calcoli delle firme sono descritti nella sezione seguente.

X-Amz-Security-Token

Parametro opzionale delle credenziali se si utilizzano credenziali provenienti dal servizio STS.

Calcolo di una firma

Il diagramma seguente illustra il processo di calcolo della firma.

AWS Processo di firma versione 4 con richiesta canonica, stringa da firmare e fasi di generazione della firma.

La tabella seguente descrive le funzioni mostrate nel diagramma. Per queste funzioni devi implementare il codice.

Funzione Description
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'algoritmo SHA256 con la chiave di firma fornita. Questa è la firma definitiva.
Trim() Rimuove eventuali spazi bianchi all'inizio o alla fine della stringa.
UriEncode()

L'URI codifica ogni byte. UriEncode() deve applicare le seguenti regole:

  • L'URI codifica ogni byte tranne i caratteri senza riserve: '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 codificato in URI è formato da una '%' 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à nelle RFC sottostanti. Ti consigliamo di scrivere una UriEncode funzione personalizzata per assicurarti che la codifica funzioni.

Di seguito è riportata una funzione example UriEncode () in Java.

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

Per ulteriori informazioni sul processo di firma (dettagli sulla creazione di una richiesta canonica, stringa da firmare e calcoli della firma), vedere. Calcolo delle firme per l'intestazione di autorizzazione: trasferimento del payload in un unico blocco (AWS Signature (versione 4) Il processo è generalmente lo stesso, tranne per il fatto che la creazione di CanonicalRequest un URL prefirmato è diversa come segue:

  • Non includi un hash del payload nella richiesta canonica, perché quando crei un URL prefirmato, non conosci il contenuto del payload perché l'URL viene utilizzato per caricare un payload arbitrario. Invece, usi una stringa costante. UNSIGNED-PAYLOAD

  • La Canonical Query String deve includere tutti i parametri di query della tabella precedente ad eccezione di. X-Amz-Signature

  • Per S3, è necessario includere il parametro di X-Amz-Security-Token query nell'URL se si utilizzano credenziali provenienti dal servizio STS.

  • Le intestazioni canoniche devono includere l'intestazione HTTP. host Se prevedi di includere una qualsiasi delle intestazioni, queste x-amz-* intestazioni devono essere aggiunte anche per il calcolo della firma. Facoltativamente, puoi aggiungere tutte le altre intestazioni che intendi includere nella richiesta. Per una maggiore sicurezza, dovresti firmare quante più intestazioni possibile. Se aggiungi un'intestazione firmata che è anche un parametro di query con firma e il valore differisce, riceverai un InvalidRequest errore poiché l'input è in conflitto.

Un esempio

Supponiamo di avere un oggetto test.txt nel examplebucket secchio. Vuoi condividere questo oggetto con altri per un periodo di 24 ore (86400 secondi) creando un URL prefirmato.

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

I passaggi seguenti illustrano prima i calcoli della firma e poi la costruzione dell'URL prefirmato. L'esempio formula i seguenti presupposti aggiuntivi:

  • Il timestamp della richiesta è. Fri, 24 May 2013 00:00:00 GMT

  • Il bucket si trova nella regione Stati Uniti orientali (Virginia settentrionale) e le credenziali Scope e i Signing Key calcoli vengono utilizzati us-east-1 come identificatori della regione. Per ulteriori informazioni, consulta la sezione relativa a regioni ed endpoint nella Riferimenti generali di AWS.

È possibile utilizzare questo esempio come test case per verificare la firma calcolata dal codice; tuttavia, è necessario utilizzare lo stesso nome del bucket, chiave oggetto, timestamp e le seguenti credenziali di esempio:

Parametro Valore
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  1. StringToSign
    1. CanonicalRequest

      GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Firma

    aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

    Ora hai tutte le informazioni per creare un URL prefirmato. L'URL risultante per questo esempio è mostrato come segue (puoi usarlo per confrontare il tuo URL prefirmato):

    https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

Esempio 2

Di seguito è riportato un esempio (non correlato all'esempio precedente) che mostra un URL prefirmato con il parametro. X-Amz-Security-Token

https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>