Créer une demande canonique

Vous pouvez normaliser les informations de votre demande dans un format canonique.

Vous devez utiliser un format canonique pour votre demande car 3DS OUTSCALE utilise ce même format pour recalculer la signature lorsque vous envoyez votre demande.

Une fois la demande canonique hachée, vous devez l’ajouter à la chaîne à signer que vous créez dans Créer une chaîne à signer.

Vous n’avez pas besoin de faire cette procédure si vous utilisez OSC CLI, AWS CLI, ou un SDK pour votre demande d’API.

  1. Spécifiez la méthode de demande HTTP (GET ou POST) suivant cette syntaxe (où \n correspond à un saut de ligne) :

    Exemple de méthode de demande
    GET\n
  2. Ajoutez l’URI canonique suivant cette syntaxe (où \n correspond à un saut de ligne) :

    Exemple d’URI canonique avec encodage
    /documents%2520and%2520settings/\n
    • L’URI canonique correspond à la version encodée du chemin d’accès de l’URI, c’est-à-dire tout ce qui est contenu entre l’hôte HTTP et le point d’interrogation ("?") qui précède les paramètres de la chaîne de requête.

    • Vous devez normaliser les chemins d’accès à l’URI selon le RFC 3986. Vous devez donc supprimer toutes les parties redondantes et relatives dans les chemins d’accès.

    Si le chemin d’accès absolu est vide, utilisez une barre oblique (/) :

    Exemple d’URI canonique
    /\n
  3. Ajoutez la chaîne de requête canonique suivant cette syntaxe (où \n correspond à un saut de ligne) :

    Exemple de chaîne de requête canonique
    Action=DescribeInstances&Version=2016-09-15\n

    Pour construire cette chaîne de caractère canonique :

    1. Triez les noms de paramètres selon les points de code des caractères dans l’ordre croissant.

    2. Encodez au format URI chaque nom et valeur de paramètres selon les règles suivantes :

      • N’encodez pas au format URI les caractères autorisés définis dans le RFC 3986 : a-z, A-Z, 0-9 et -_.~

      • Encodez avec pourcentage tous les autres caractères : %XY, où X et Y correspondent aux caractères hexadécimaux (0 à 9 et A à F). Par exemple, le caractère espace doit être encodé %20.

    3. Construisez la chaîne de requête canonique en commençant par le nom du premier paramètre de la liste triée.

    4. Pour chaque paramètre, ajoutez le nom de paramètre encodé au format URI, suivi du signe égal (=), suivi de la valeur du paramètre encodé au format URI. Pour les paramètres qui n’ont pas de valeur, utilisez une chaîne vide.

    5. Ajoutez le caractère esperluette (&) après chaque valeur de paramètre, sauf pour la dernière valeur de la liste.

      Si la demande ne contient pas de chaîne de requête, utilisez une chaîne vide.

  4. Ajoutez les en-têtes canoniques suivant cette syntaxe (où \n correspond à un saut de ligne) :

    Exemple d’en-têtes signés
    content-type:application/x-www-form-urlencoded; charset=utf-8\n
    host:fcu.eu-west-2.outscale.com\n
    x-amz-date:20180915T163400Z\n

    Les en-têtes canoniques correspondent à la liste de tous les en-têtes HTTP inclus dans la demande signée.

    L’en-tête host est obligatoire. Les autres en-têtes standard comme content-type sont optionnels.

    Pour construire la liste des en-têtes canoniques, référez-vous au pseudo-code suivant :

    Exemple d’en-têtes signés
    CanonicalHeaders =
    CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ... + CanonicalHeadersEntryN
    CanonicalHeadersEntry =
    Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'

    La fonction Lowercase convertit tous les caractères en minuscule. La fonction Trimall supprime les espaces superflus avant et après les valeurs, et remplace les suites d’espaces par des espaces simples.

    Construisez la liste des en-têtes canoniques par un tri sur le code de caractère, puis par itération.

    Construisez chaque en-tête selon les règles suivantes :

    • Ajoutez le nom d’en-tête en minuscules suivi d’un deux-points (":")

    • Ajoutez une liste de valeurs séparées par des points-virgules (";") pour cet en-tête. Ne triez pas les valeurs dans les en-têtes ayant plusieurs valeurs.

    • Ajoutez un caractère de saut de ligne (\n)

    Exemple d’en-têtes d’origine
    Host:fcu.eu-west-2.outscale.com\n
    Content-Type:application/x-www-form-urlencoded; charset=utf-8\n
    My-header1:    a   b   c  \n
    X-Amz-Date:20180915T163400Z\n
    My-Header2:    "a   b   c"  \n
    Exemple d’en-têtes au format canonique
    content-type:application/x-www-form-urlencoded; charset=utf-8\n
    host:fcu.eu-west-2.outscale.com\n
    my-header1:a b c\n
    my-header2:"a b c"\n
    x-amz-date:20180915T163400Z\n
  5. Ajoutez les en-têtes signés suivant cette syntaxe (où \n correspond à un saut de ligne) :

    Exemple d’en-têtes signés
    content-type;host;x-amz-date\n

    Les en-têtes signés correspondent à la liste des en-têtes que vous avez inclus dans les en-têtes canoniques.

    L’en-tête host est un en-tête signé obligatoire. Si vous ajoutez une date ou un en-tête x-amz-date, vous devez également inclure cet en-tête dans la liste des en-têtes signés.

    Pour construire la liste des en-têtes signés, référez-vous au pseudo-code suivant :

    Exemple d’en-têtes signés
    SignedHeaders =
    Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... + Lowercase(HeaderNameN)

    Convertissez tous les noms d’en-tête en minuscules (grâce à la fonction Lowercase), triez-les par code de caractère et utilisez un point-virgule (";") pour séparer les noms d’en-tête.

  6. Utilisez une fonction de hachage pour créer une valeur hachée à partir de la charge utile du corps de la demande HTTP.

    Exemple de structure d’une charge utile
    HashedPayload = Lowercase(HexEncode(Hash(requestPayload)))
    • La charge utile hachée doit être sous la forme d’une chaîne hexadécimale en minuscules.

    • Si la charge utile est vide, utilisez une chaîne vide pour la fonction de hachage. Dans notre exemple, la charge utile est vide.

    La charge utile est hachée.

    Exemple de charge utile hachée (chaîne vide)
    ae14e49469bac4395994faf4b0b3e9824c41b724914c1fc98c69585b2729fb58
  7. Pour construire la demande canonique, combinez tous les éléments des étapes précédentes :

    Exemple de requête canonique
    GET
    /
    Action=DescribeInstances&Version=2016-09-15
    content-type:application/x-www-form-urlencoded; charset=utf-8
    host:fcu.eu-west-2.outscale.com
    x-amz-date:20180915T163400Z
    
    content-type;host;x-amz-date
    ae14e49469bac4395994faf4b0b3e9824c41b724914c1fc98c69585b2729fb58
  8. Hachez la demande canonique avec le même algorithme que vous avez utilisé pour hacher la charge utile.

    Exemple de demande canonique hachée
    0547bdda2966fc9a3a76269a3193bed373a56072cfa77949936bc2a556016f32

    La demande canonique est hachée. Vous devez ensuite l’inclure dans la chaîne à signer que vous créez dans Créer une chaîne à signer.

Pages connexes

AWS™ et Amazon Web Services™ sont des marques de commerce d’Amazon Technologies, Inc. ou de ses affiliées aux États-Unis et/ou dans les autres pays.