Signature des requêtes - Amazon S3 Glacier

Cette page est réservée aux clients existants du service S3 Glacier utilisant Vaults et l'original REST API de 2012.

Si vous recherchez des solutions de stockage d'archives, nous vous conseillons d'utiliser les classes de stockage S3 Glacier dans Amazon S3, S3 Glacier Instant Retrieval, S3 Glacier Flexible Retrieval et S3 Glacier Deep Archive. Pour en savoir plus sur ces options de stockage, consultez les sections Classes de stockage S3 Glacier et Stockage de données à long terme à l'aide des classes de stockage S3 Glacier dans le guide de l'utilisateur Amazon S3. Ces classes de stockage utilisent Amazon S3API, sont disponibles dans toutes les régions et peuvent être gérées au sein de la console Amazon S3. Ils offrent des fonctionnalités telles que l'analyse des coûts de stockage, Storage Lens, des fonctionnalités de chiffrement optionnelles avancées, etc.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Signature des requêtes

S3 Glacier vous impose d'authentifier chaque demande que vous envoyez en la signant. Pour signer une demande, vous calculez une signature numérique à l'aide d'une fonction de hachage cryptographique. Un hachage cryptographique est une fonction qui renvoie une valeur de hachage unique basée sur l'entrée. L'entrée de la fonction de hachage contient le texte de la demande et votre clé d'accès secrète. La fonction de hachage renvoie une valeur de hachage que vous incluez dans la demande comme votre signature. La signature fait partie de l'en-tête Authorization de votre demande.

Après avoir reçu votre demande, S3 Glacier recalcule la signature en utilisant la fonction de hachage et l'entrée que vous avez utilisées pour signer la demande. Si la signature obtenue correspond à la signature de la demande, S3 Glacier traite cette dernière. Sinon, la demande est rejetée.

S3 Glacier prend en charge l'authentification avec AWS Signature Version 4. Le processus de calcul d'une signature peut être divisé en trois tâches :

  • Tâche 1 : créer une demande canonique

    Réorganiser votre demande HTTP dans un format canonique. L'utilisation d'une forme canonique est nécessaire, car S3 Glacier utilise la même forme canonique lorsqu'il recalcule une signature à comparer à celle que vous avez envoyée.

  • Tâche 2 : créer une chaîne de connexion

    Créez une chaîne que vous utiliserez comme une des valeurs d'entrée pour votre fonction de hachage cryptographique. La chaîne, appelée la chaîne de connexion, est une concaténation du nom de l'algorithme de hachage, de la date de la demande, d'une chaîne d'informations d'identification et de la demande convertie sous forme canonique de la tâche précédente. La chaîne de portée des informations d'identification elle-même est une concaténation de date, de région AWS et d'informations de service.

  • Tâche 3 : créer une signature

    Créez une signature pour votre demande à l'aide d'une fonction de hachage cryptographique qui accepte deux chaînes d'entrée : votre chaîne de connexion et une clé dérivée. La clé dérivée est calculée en commençant par votre clé d'accès secrète et en utilisant la chaîne d'informations d'identification pour créer un ensemble de codes d'authentification de message basés sur le hachage (HMAC). Notez que la fonction de hachage utilisée dans cette étape de signature n'est pas l'algorithme de hachage d'arborescence utilisé dans les API S3 Glacier qui chargent les données.

Exemple de calcul de signature

L'exemple suivant vous guide à travers les détails de la création d'une signature pour Création de coffre (PUT vault). L'exemple peut être utilisé comme référence pour vérifier votre méthode de calcul de signature. Pour plus d’informations, reportez-vous à Signature des demandes d’API AWS dans le Guide de l’utilisateur IAM.

Dans cet exemple il est supposé que :

  • L'horodatage de la demande est Fri, 25 May 2012 00:24:53 GMT.

  • Le point de terminaison est la région USA Est (Virginie du Nord), us-east-1.

La syntaxe générale de la requête (y compris le corps JSON) est :

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

La forme canonique de la demande calculée pour Tâche 1 : Créer une demande canonique est :

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

La dernière ligne de la demande canonique est le hachage du corps de la demande. Notez également la troisième ligne vide dans la demande canonique. Elle provient du fait qu'il n'y a aucun paramètre de requête pour cette API.

La chaîne de connexion pour la tâche 2 : créer une chaîne de connexion est :

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

La première ligne de la chaîne de connexion est l'algorithme, la deuxième ligne est l'horodatage, la troisième ligne est les informations d'identification, et la dernière ligne est un hachage de la demande canonique issu de la tâche 1 : créer une demande canonique. Le nom du service à utiliser dans les informations d'identification est glacier.

Pour la tâche 3 : créer une signature, la clé dérivée peut être représentée sous la forme :

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

Si la clé d'accès secrète wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY est utilisée, la signature calculée est :

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

L'étape finale consiste à construire l'en-tête Authorization. Pour la clé d'accès de la démonstration AKIAIOSFODNN7EXAMPLE, l'en-tête (avec les sauts de ligne ajoutés pour faciliter la lecture) est :

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

Calcul des Signatures pour les opérations de streaming

Chargement d'archive (POST archive) et Partie chargement (PUT uploadID) sont des opérations de streaming qui exigent d'inclure un en-tête supplémentaire x-amz-content-sha256 lors de la signature et de l'envoi de votre demande. Les étapes de signature pour les opérations de streaming sont identiques à celles des autres opérations, mais comprennent aussi l'ajout de l'en-tête de streaming.

Le calcul de l'en-tête de streaming x-amz-content-sha256 repose sur le hachage SHA256 de l'ensemble du contenu (charge utile) qui doit être chargé. Notez que ce calcul est différent du hachage d'arborescence SHA256 (Calcul des totaux de contrôle). En dehors des cas extrêmement simples, la valeur de hachage SHA 256 des données de la charge utile est différente de la valeur de hachage d'arborescence SHA256 des données de la charge utile.

Si les données de la charge utile sont spécifiées sous forme de tableau d'octets, vous pouvez utiliser l'extrait de code Java suivant pour calculer le hachage 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(); }

De même, en C#, vous pouvez calculer le hachage SHA256 des données de la charge utile comme l'illustre l'extrait de code suivant.

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

Exemple de calcul de signature pour l'API de streaming

L'exemple suivant vous montre de façon détaillée comment créer une signature pour Chargement d'archive (POST archive), l'une des deux API de streaming dans S3 Glacier. Dans cet exemple il est supposé que :

  • L'horodatage de la demande est Mon, 07 May 2012 00:00:00 GMT.

  • Le point de terminaison est la région USA Est (Virginie du Nord), us-east-1.

  • La charge utile du contenu est une chaîne « Bienvenue dans S3 Glacier ».

La syntaxe de demande générale (y compris le corps JSON) est illustrée dans l'exemple ci-dessous. Notez que l'en-tête x-amz-content-sha256 est inclus. Dans cet exemple simplifié, le paramètre x-amz-sha256-tree-hash et le paramètre x-amz-content-sha256 ont la même valeur. Cependant, ce n'est pas le cas pour les téléchargements d'archives supérieures à 1 Mo.

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

La forme canonique de la demande calculée pour la tâche 1 : créer une demande canonique est illustrée ci-dessous : Notez que l'en-tête de streaming x-amz-content-sha256 est inclus avec sa valeur. Cela signifie que vous devez lire la charge utile, commencer par calculer le hachage SHA256 et calculer ensuite la signature.

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

Le reste du calcul de la signature suit les étapes décrites dans Exemple de calcul de signature. L'en-tête Authorization qui utilise la clé d'accès secrète wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY et la clé d'accès AKIAIOSFODNN7EXAMPLE est illustré ci-dessous (avec des sauts de ligne ajoutés pour faciliter la lecture) :

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