Firmare le richieste - Amazon S3 Glacier

Questa pagina è riservata ai clienti esistenti del servizio S3 Glacier che utilizzano Vaults e l'originale del 2012. REST API

Se stai cercando soluzioni di archiviazione, ti consigliamo di utilizzare le classi di storage S3 Glacier in Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval e S3 Glacier Deep Archive. Per ulteriori informazioni su queste opzioni di storage, consulta le classi di storage S3 Glacier e lo storage dei dati a lungo termine con le classi di storage S3 Glacier nella Amazon S3 User Guide. Queste classi di storage utilizzano Amazon S3API, sono disponibili in tutte le regioni e possono essere gestite all'interno della console Amazon S3. Offrono funzionalità come Storage Cost Analysis, Storage Lens, funzionalità di crittografia opzionali avanzate e altro ancora.

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

Firmare le richieste

S3 Glacier richiede l'autenticazione con firma di ogni richiesta inviata. Per firmare una richiesta, è necessario calcolare una firma digitale utilizzando una funzione hash crittografica. Una funzione hash crittografica è una funzione che restituisce un valore hash univoco basato sull'input. L'input alla funzione hash include il testo della richiesta e la tua chiave di accesso segreta. La funzione hash restituisce un valore hash che includi nella richiesta come firma. La firma è parte dell'intestazione Authorization della richiesta.

Dopo aver ricevuto la richiesta, S3 Glacier ricalcola la firma utilizzando la stessa funzione hash e lo stesso input utilizzati per firmare la richiesta. Se la firma risultante corrisponde alla firma nella richiesta, S3 Glacier elabora la richiesta. In caso contrario, la richiesta viene respinta.

supporta l'autenticazione con AWS Signature Version 4. La procedura per il calcolo di una firma può essere suddivisa in tre fasi:

  • Fase 1. Creazione di una richiesta canonica

    Riorganizza la richiesta HTTP in un formato canonico. L'utilizzo di un formato canonico è necessario in quanto S3 Glacier utilizza quel formato quando ricalcola una firma da confrontare con quella che hai inviato.

  • Fase 2. Creazione di una stringa di firma

    Crea una stringa che utilizzerai come uno dei valori di input per la funzione hash crittografica. La stringa, denominata stringa di firma, è una concatenazione del nome dell'algoritmo hash, della data della richiesta, di una stringa di ambito credenziali e della richiesta in formato canonico creata nella fase precedente. La stringa ambito credenziali è anch'essa una concatenazione di data, regione AWS e informazioni sul servizio.

  • Fase 3. Creazione di una firma

    Crea una firma per la tua richiesta utilizzando una funzione hash crittografica che accetta due stringhe di input: la tua stringa di firma e una chiave derivata. La chiave derivata viene calcolata a partire dalla tua Secret Access Key e utilizzando la stringa di ambito credenziali per creare una serie di codici HMAC (Hashed Message Authentication Code). Nota che la funzione hash utilizzata in questa fase non è l'algoritmo della struttura hash utilizzato nelle API di S3 Glacier che caricano i dati.

Esempio di calcolo di firma

L'esempio in questa sezione mostra come creare una firma per Create Vault (PUT vault). L'esempio può essere utilizzato come riferimento per verificare il metodo di calcolo della firma. Per ulteriori informazioni, consulta la pagina Firma delle richieste API AWS nella Guida per l'utente IAM.

L'esempio presuppone quanto segue:

  • Il time stamp della richiesta è Fri, 25 May 2012 00:24:53 GMT.

  • L'endpoint è la regione Stati Uniti orientali (Virginia settentrionale), us-east-1.

La sintassi generale della richiesta (incluso il corpo JSON) è:

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

Il formato canonico della richiesta calcolata per Fase 1: creazione di una richiesta canonica è:

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

L'ultima riga della richiesta canonica è l'hash del corpo della richiesta. Nota inoltre la terza riga vuota nella richiesta canonica. Ciò è dovuto alla mancanza di parametri di query per questa API.

La stringa di firma per Fase 2. Creazione di una stringa di firma è:

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

La prima riga della stringa di firma è l'algoritmo, la seconda è il timestamp, la terza è l'ambito credenziali e l'ultima è un hash del formato della richiesta canonica in Fase 1: creazione di una richiesta canonica. Il nome del servizio da utilizzare nell'ambito credenziali è glacier.

In Fase 3. Creazione di una firma, la chiave derivata può essere rappresentata come segue:

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

Se viene utilizzata la chiave di accesso segreta wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, la firma calcolata è:

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

La fase finale consiste nel creare l'intestazione Authorization. Per la chiave di accesso AKIAIOSFODNN7EXAMPLE, l'intestazione (con interruzioni di riga aggiunte per facilitare la lettura) è:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

Calcolo di firme per le operazioni di streaming

Upload Archive (POST archive) e Upload Part (PUT uploadID) sono operazioni di streaming che richiedono l'inclusione di un'ulteriore intestazione x-amz-content-sha256 per la firma e l'invio della richiesta. Le fasi relative alla firma per le operazioni di streaming sono esattamente le stesse delle altre operazioni, con l'aggiunta dell'intestazione di streaming.

Il calcolo dell'intestazione di streaming x-amz-content-sha256 è basato sull'hash SHA256 dell'intero contenuto (payload) da caricare. Nota che questo calcolo è differente dalla struttura hash SHA256 (Calcolo di checksum). Salvo nei casi estremamente semplici, il valore hash SHA 256 dei dati di payload sarà differente dalla struttura hash SHA256 dei dati di payload.

Se i dati del payload sono specificati come matrice di byte, puoi utilizzare il frammento di codice Java che segue per calcolare l'hash SHA256.

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

Anche in C# puoi calcolare l'hash SHA256 dei dati del payload come illustrato nel frammento di codice seguente.

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

Esempio di calcolo di firma per l'API di streaming

L'esempio seguente mostra come creare una firma per Upload Archive (POST archive), ovvero una delle due API di streaming di S3 Glacier. L'esempio presuppone quanto segue:

  • Il time stamp della richiesta è Mon, 07 May 2012 00:00:00 GMT.

  • L'endpoint è la regione Stati Uniti orientali (Virginia settentrionale), us-east-1.

  • Il payload del contenuto è una stringa "Welcome to S3 Glacier".

La sintassi generale della richiesta (incluso il corpo JSON) è illustrata nell'esempio seguente. Nota che è inclusa l'intestazione x-amz-content-sha256. In questo esempio semplificato, x-amz-sha256-tree-hash e x-amz-content-sha256 hanno lo stesso valore, ma nel caso di caricamenti di archivi superiori a 1 MB sono differenti.

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

Il formato canonico della richiesta calcolata per Fase 1. Creazione di una richiesta canonica è riportato di seguito. Nota che l'intestazione di streaming x-amz-content-sha256 è inclusa con il relativo valore. Ciò significa che devi dapprima leggere il payload e calcolare l'hash SHA256 e quindi calcolare la firma.

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

Il resto della procedura di calcolo della firma segue le fasi descritte in Esempio di calcolo di firma. L'intestazione Authorization che utilizza la Secret Access Key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY e la chiave di accesso AKIAIOSFODNN7EXAMPLE è esposta di seguito (con interruzioni di riga aggiunte per facilitare la lettura):

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6