Tous les produits
Search
Centre de documentation

Object Storage Service:Inclure une signature V4 dans l'en-tête Authorization (recommandé)

Dernière mise à jour :Sep 24, 2026

Lorsque vous envoyez des requêtes à OSS, vous devez inclure un en-tête de requête Authorization contenant une signature V4 pour garantir une authentification réussie. Privilégiez l'utilisation du SDK fourni par OSS pour envoyer vos requêtes, car le SDK intègre déjà l'algorithme de signature V4 complexe. Consultez cette documentation pour implémenter manuellement l'algorithme de signature V4 uniquement si l'utilisation du SDK n'est pas possible.

Utiliser les SDK OSS pour implémenter automatiquement les signatures V4

Si vous devez implémenter l'algorithme de signature V4, nous vous recommandons de vous inspirer de l'implémentation disponible dans les SDK OSS.

SDK

Implémentation

Java

OSSV4Signer.java

Python

v4.py

Go

v4.go

JavaScript

client.js

PHP

SignerV4.php

C#

SignerV4.cs

Android

OSSV4Signer.java

Swift

SignerV4.swift

Objective-C

OSSV4Signer.m

C++

SignerV4.cc

C

oss_auth.c

En-têtes de requête Authorization

Lors de l'envoi d'une requête à OSS, vous devez implémenter la signature dans l'en-tête Authorization afin de vérifier la requête.

Voici la syntaxe de l'en-tête Authorization :

Authorization: OSS4-HMAC-SHA256 Credential=<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request, AdditionalHeaders=<AdditionalHeadersVal>, Signature=<SignatureVal>

Le tableau ci-dessous décrit l'en-tête Authorization :

Composant

Description

OSS4-HMAC-SHA256

Spécifie l'algorithme utilisé pour calculer la signature. Cette chaîne indique la version de la signature et l'algorithme de signature (HMAC-SHA256). La valeur OSS4-HMAC-SHA256 est requise lors de l'utilisation des signatures V4 pour l'authentification.

Credential

Spécifie l'ID AccessKey et la portée, qui inclut la date, la région et le service cloud utilisés pour calculer la signature. Ce champ est requis lors de l'utilisation des signatures V4 pour l'authentification.

Voici la syntaxe :

<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request

Où :

  • AccessKeyId : votre ID AccessKey, qui est un identifiant unique utilisé pour vérifier l'identité du demandeur.

  • SignDate : la date de signature au format AAAAMMJJ.

  • SignRegion : l'ID de région utilisé pour la requête. Exemple : cn-hangzhou.

  • oss : une chaîne fixe qui identifie le service demandé comme étant Alibaba Cloud Object Storage Service (OSS).

  • aliyun_v4_request : une chaîne fixe qui spécifie la version de la signature comme étant V4.

AdditionalHeaders

Spécifiez les en-têtes de requête facultatifs inclus dans le calcul de la signature (vous n'avez pas besoin de spécifier les en-têtes obligatoires qui doivent être inclus dans le calcul de la signature). Ce champ contient uniquement des noms d'en-tête en minuscules, triés par ordre lexicographique et séparés par des points-virgules (;).

Voici un exemple :

content-disposition;content-length

Signature

La signature calculée. Le champ est requis lors de l'utilisation des signatures V4 pour l'authentification.

L'exemple de code suivant illustre une valeur de signature de 256 bits représentée par 64 chiffres hexadécimaux en minuscules :

3938**********************************dcdc

Calcul de la signature

Après avoir reçu une requête, OSS calcule la signature et la compare à celle présente dans l'en-tête de requête Authorization . Si elles correspondent, la requête aboutit. Sinon, la requête échoue.

Processus de calcul de la signature

La figure suivante illustre le processus de calcul de la signature :

image

Le processus de calcul de la signature comprend les trois étapes suivantes :

  1. Construire une requête canonique : formatez la requête conformément aux spécifications de signature OSS pour générer une requête canonique.

  2. Construire une chaîne à signer : concaténez la requête canonique pour obtenir la chaîne à signer.

  3. Calculer la signature : effectuez plusieurs opérations de hachage sur la clé secrète AccessKey Secret pour générer une clé dérivée, puis utilisez cette clé dérivée pour calculer la chaîne à signer afin d'obtenir la signature finale. En réalisant plusieurs opérations HMAC-SHA256 sur la clé secrète AccessKey Secret, une clé dérivée sera générée pour calculer le hachage HMAC-SHA256 de la chaîne à signer, ce qui donnera la signature finale.

1. Construire une requête canonique

Voici la syntaxe d'une requête canonique :

HTTP Verb + "\n" +
Canonical URI + "\n" +
Canonical Query String + "\n" +
Canonical Headers + "\n" +
Additional Headers + "\n" +
Hashed PayLoad

Le tableau suivant décrit les paramètres d'une requête canonique :

Paramètre

Description

HTTP Verb

La méthode de requête HTTP, notamment PUT, GET, POST, HEAD, DELETE et OPTIONS.

Canonical URI

Chemin de ressource encodé en URI. Le chemin de ressource n'inclut pas la chaîne de requête et l'encodage des barres obliques (/) n'est pas requis.

  • Si la cible de la requête est OSS, le chemin de ressource est / et le chemin de ressource encodé en URI est UriEncode("/").

  • Si la cible de la requête est un bucket, le chemin de ressource est /examplebucket/ et le chemin de ressource encodé en URI est UriEncode("/examplebucket/").

  • Si la cible de la requête est un objet dans un bucket, le chemin de ressource est /examplebucket/exampleobject et le chemin de ressource encodé en URI est UriEncode("/examplebucket/exampleobject").

Canonical Query String

Paramètres de requête encodés en URI et triés par ordre lexicographique.

  • Si les paramètres de requête incluent à la fois des noms et des valeurs de paramètre, encodez en URI le nom et la valeur de chaque paramètre séparément, puis triez les paramètres par ordre lexicographique en fonction de leurs noms encodés. Notez que le tri est effectué après l'encodage. Utilisez = pour connecter le nom et la valeur encodés, et utilisez & pour concaténer les différents paramètres.

    • Paramètres de requête : prefix=somePrefix&marker=someMarker&max-keys=20

    • Paramètres de requête canoniques :

      UriEncode("marker")+"="+UriEncode("someMarker")+"&"+UriEncode("max-keys")+"="+UriEncode("20")+"&"+UriEncode("prefix")+"="+UriEncode("somePrefix")
  • Si le paramètre de requête contient uniquement le nom du paramètre, effectuez un encodage URI sur le nom du paramètre.

    • Paramètre de requête : ?acl

    • Paramètre de requête canonique : UriEncode("acl")

  • S'il n'y a aucun paramètre de requête, c'est-à-dire si l'URI de la requête ne contient pas de ?, la chaîne de requête canonique est définie comme une chaîne vide ("").

Canonical Headers

La liste des en-têtes de requête.

Les en-têtes de requête se répartissent dans les trois catégories suivantes :

  • En-têtes qui doivent exister dans la requête et être inclus dans le calcul de la signature :

    • x-oss-content-sha256 : seule la valeur UNSIGNED-PAYLOAD est prise en charge.

  • En-têtes qui doivent être inclus dans le calcul de la signature s'ils existent dans la requête :

    • Content-Type

    • Content-MD5

    • x-oss-* : autres en-têtes de requête commençant par x-oss-. Par exemple, lors de l'accès via STS AK, le SecurityToken est décrit par x-oss-security-token:security-token. Par exemple, l'heure de la requête est décrite par x-oss-date et la syntaxe doit respecter le format horaire standard ISO8601, tel que 20231203T121212Z.

  • En-têtes de requête facultatifs spécifiés dans AdditionalHeaders.

La syntaxe est la suivante :

Lowercase(<HeaderName1>) + ":" + Trim(<value>) + "\n"
Lowercase(<HeaderName2>) + ":" + Trim(<value>) + "\n"
...
Lowercase(<HeaderNameN>) + ":" + Trim(<value>) + "\n"

L'exemple de code suivant illustre cette syntaxe :

content-disposition:attachment
content-length:3
content-md5:ICy5YqxZB1uWSwcVLSNLcA==
content-type:text/plain
x-oss-content-sha256:UNSIGNED-PAYLOAD
x-oss-date:20250328T101048Z

Additional Headers

Spécifie les en-têtes de requête facultatifs inclus dans le calcul de la signature (vous n'avez pas besoin de spécifier les en-têtes obligatoires qui doivent être inclus dans le calcul de la signature). Ce champ contient uniquement des noms d'en-tête en minuscules, triés par ordre lexicographique et séparés par des points-virgules (;), conformément à AdditionalHeaders.

Spécifiez les en-têtes facultatifs inclus dans le calcul de la signature (à l'exclusion des en-têtes obligatoires) ; seuls les noms d'en-tête en minuscules sont inclus et triés par ordre lexicographique. Ils sont séparés par des points-virgules (;) et conformes à AdditionalHeaders.

L'exemple de code suivant illustre cette syntaxe :

content-disposition;content-length

Hashed PayLoad

La représentation hexadécimale de la valeur de hachage SHA256 de la charge utile de la requête. Seule la valeur UNSIGNED-PAYLOAD est prise en charge.

2. Construire une chaîne à signer

La syntaxe de la chaîne à signer est la suivante :

"OSS4-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
Scope + "\n" +
Hex(SHA256Hash(<CanonicalRequest>))

Le tableau suivant décrit les paramètres de la chaîne à signer :

Paramètre

Description

OSS4-HMAC-SHA256

L'algorithme de hachage de la signature, la valeur doit être OSS4-HMAC-SHA256.

TimeStamp

L'heure UTC actuelle, dont la syntaxe doit être conforme à la norme ISO8601, par exemple 20250320T083322Z.

Scope

L'ensemble de paramètres permettant d'obtenir/récupérer la clé dérivée. Cet ensemble de paramètres spécifie la date, la région et le service. Par conséquent, la signature calculée à l'aide de la clé dérivée n'est valide que pour la date, la région et le service spécifiés.

La syntaxe est la suivante :

<SignDate>/<SignRegion>/oss/aliyun_v4_request

Description :

  • SignDate : la date au format AAAAMMJJ incluse dans la signature.

  • SignRegion : l'ID de région utilisé pour la signature, par exemple cn-hangzhou.

  • oss : le nom du service inclus dans la signature, fixé à oss.

  • aliyun_v4_request : la version incluse dans la signature, fixée à aliyun_v4_request.

CanonicalRequest

La requête canonique construite.

3. Calculer une signature

Le calcul d'une signature implique les deux étapes suivantes :

  1. Calculez la SigningKey .

    DateKey = HMAC-SHA256("aliyun_v4" + SK, Date);
    DateRegionKey = HMAC-SHA256(DateKey, Region);
    DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "oss");
    SigningKey = HMAC-SHA256(DateRegionServiceKey, "aliyun_v4_request");
    • SK : la clé secrète AccessKey Secret incluse dans la signature.

    • Date : la date au format YYYYMMDD incluse dans la signature, qui doit être cohérente avec la SignDate de la chaîne à signer.

    • Region : l'ID de région utilisé pour la signature, par exemple cn-hangzhou , qui doit être cohérent avec la SignRegion de la chaîne à signer.

  2. Calculez la Signature à l'aide de la SigningKey et de la chaîne à signer.

    Signature = HEX(HMAC-SHA256(SigningKey, StringToSign))

Exemple de calcul de signature

L'exemple suivant montre comment calculer une signature en appelant l'opération PutObject.

Paramètres pour le calcul de la signature

Paramètre

Valeur

AccessKeyId

LTAI

AccessKeySecret

yourAccessKeySecret

Timestamp

20250411T064124Z

Bucket

examplebucket

Object

exampleobject

Region

cn-hangzhou

Exemple de calcul de signature

  1. Construisez une requête canonique.

    PUT
    /examplebucket/exampleobject
    
    content-disposition:attachment
    content-length:3
    content-md5:ICy5YqxZB1uWSwcVLSNLcA==
    content-type:text/plain
    x-oss-content-sha256:UNSIGNED-PAYLOAD
    x-oss-date:20250411T064124Z
    
    content-disposition;content-length
    UNSIGNED-PAYLOAD
  2. Construisez une chaîne à signer.

    OSS4-HMAC-SHA256
    20250411T064124Z
    20250411/cn-hangzhou/oss/aliyun_v4_request
    c46d96390bdbc2d739ac9363293ae9d710b14e48081fcb22cd8ad54b63136eca
  3. Calculez la signature.

    1. Calculez la SigningKey.

      Remarque

      Pour faciliter la lecture, la SigningKey suivante est affichée au format hexadécimal.

      3543b7686e65eda71e5e5ca19d548d78423c37e8ddba4dc9d83f90228b457c76
    2. Calculez la Signature.

      053edbf550ebd239b32a9cdfd93b0b2b3f2d223083aa61f75e9ac16856d61f23