Chaque requête API KMS doit inclure une signature valide. Alibaba Cloud utilise cette signature pour vérifier l'identité de l'appelant, détecter toute altération des données en transit et rejeter les requêtes rejouées.
Si vous utilisez un SDK ou la CLI Alibaba Cloud, la signature est gérée automatiquement. Cette rubrique s'adresse uniquement aux développeurs qui créent un client HTTP personnalisé ou effectuent des appels API bruts sans recourir à un SDK.
Fonctionnement de la signature
La signature d'une requête KMS comprend deux étapes :
Construisez la chaîne à signer — Triez et encodez en pourcentage tous les paramètres de la requête pour former une chaîne de requête canonique, puis ajoutez en préfixe la méthode HTTP et une barre oblique encodée en pourcentage.
Calculez la signature — Calculez un hachage HMAC-SHA1 de la chaîne à signer en utilisant votre secret AccessKey comme clé, encodez le résultat en Base64 et ajoutez-le à la requête en tant que paramètre
Signature.
La formule de signature est la suivante :
Signature = Base64( HMAC-SHA1( AccessKey Secret, UTF-8-Encoding-Of(StringToSign)) )
L'URL finale de la requête présente la structure suivante :
https://<endpoint>/?Action=<operation>&SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=<encoded-signature>&...
Paramètres de signature
| Paramètre | Valeur | Description |
|---|---|---|
SignatureMethod |
HMAC-SHA1 |
Algorithme de signature |
SignatureVersion |
1.0 |
Version de l'algorithme de signature |
Signature |
<calculated> |
Chaîne de signature, encodée URL selon la norme RFC 3986 |
Fonctions requises
Pour mettre en œuvre la signature, vous avez besoin des fonctions suivantes :
| Fonction | Description |
|---|---|
percentEncode() |
Encodage en pourcentage basé sur UTF-8 ; consultez les règles d'encodage et l'implémentation Java à l'étape 1,1 |
HMAC-SHA1() |
Fonction de hachage avec clé définie dans la RFC 2104 |
Base64() |
Encodage Base64 standard |
Étape 1 : Construire la chaîne à signer
Étape 1.1 : Créer la chaîne de requête canonique
Collectez tous les paramètres de la requête, à l'exception de
Signature. Cela inclut les paramètres communs (tels queAction,Version,AccessKeyId,SignatureMethod,SignatureVersion,TimestampetFormat) ainsi que tous les paramètres spécifiques à l'opération.Triez les paramètres par ordre alphabétique selon leur nom.
-
Encodez en pourcentage chaque nom et valeur de paramètre en utilisant UTF-8. Les règles d'encodage sont les suivantes :
Cette méthode diffère de
application/x-www-form-urlencoded(encodage MIME). Si vous utilisezjava.net.URLEncoderde Java, appliquez d'abord l'encodage MIME, puis remplacez+par%20,*par%2A, et%7Epar~. La méthodepercentEncodesuivante implémente cette logique : ``java private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING) .replace("+", "%20") .replace("*", "%2A") .replace("%7E", "~") : null; }``Type de caractère Règle d'encodage Lettres majuscules/minuscules, chiffres, -,_,.,~Aucun encodage nécessaire Tous les autres caractères Format %XY, oùXYreprésente le code ASCII en hexadécimal (par exemple,"→%22)Caractères UTF-8 étendus Format %XY%ZA…Espaces %20— n'utilisez pas+ Associez chaque nom et valeur encodés avec
=, puis reliez toutes les paires avec&dans l'ordre trié. Vous obtenez ainsi votre chaîne de requête canonique.
Étape 1.2 : Construire la StringToSign
Construisez la StringToSign en utilisant le format suivant :
StringToSign =
HTTPMethod + "&" +
percentEncode("/") + "&" +
percentEncode(CanonicalizedQueryString)
| Composant | Description |
|---|---|
HTTPMethod |
Méthode HTTP utilisée pour la requête, telle que GET |
percentEncode("/") |
Barre oblique encodée en pourcentage, soit %2F |
percentEncode(CanonicalizedQueryString) |
Chaîne de requête canonique issue de l'étape 1.1, encodée une seconde fois en pourcentage |
Étape 2 : Calculer la signature
-
Calculez le code d'authentification de message basé sur un hachage (HMAC) de la
StringToSignen utilisant l'algorithme SHA1 (RFC 2104). La clé HMAC correspond à votre secret AccessKey suivi d'une esperluette (&, ASCII 38) :key = AccessKey Secret + "&" Encodez la sortie HMAC en Base64 pour obtenir la chaîne de signature.
Encodez la chaîne de signature en URL selon la norme RFC 3986 et ajoutez-la à la requête en tant que paramètre
Signature.
Exemple
L'exemple suivant illustre la signature d'une requête CreateKey.
Paramètres de la requête (avant signature)
https://kms.cn-hangzhou.aliyuncs.com/?Action=CreateKey
&SignatureVersion=1.0
&Format=json
&Version=2016-01-20
&AccessKeyId=testid
&SignatureMethod=HMAC-SHA1
&Timestamp=2016-03-28T03:13:08Z
Construction de la StringToSign
Après tri alphabétique et encodage en pourcentage, la chaîne de requête canonique est la suivante :
AccessKeyId%3Dtestid%26Action%3DCreateKey%26Format%3Djson%26SignatureMethod%3DHMAC-SHA1%26SignatureVersion%3D1.0%26Timestamp%3D2016-03-28T03%253A13%253A08Z%26Version%3D2016-01-20
La StringToSign complète est :
GET&%2F&AccessKeyId%3Dtestid%26Action%3DCreateKey%26Format%3Djson%26SignatureMethod%3DHMAC-SHA1%26SignatureVersion%3D1.0%26Timestamp%3D2016-03-28T03%253A13%253A08Z%26Version%3D2016-01-20
Chaque composant correspond à :
| Composant | Valeur |
|---|---|
HTTPMethod |
GET |
percentEncode("/") |
%2F |
percentEncode(CanonicalizedQueryString) |
La chaîne encodée ci-dessus |
Calcul de la signature
| Entrée | Valeur |
|---|---|
| AccessKey ID | testid |
| Secret AccessKey | testsecret |
| Clé HMAC | testsecret& |
| Valeur de la signature | 41wk2SSX1GJh7fwnc5eqOfiJPF**** |
URL de la requête signée
https://kms.cn-hangzhou.aliyuncs.com/?Action=CreateKey
&SignatureVersion=1.0
&Format=json
&Version=2016-01-20
&AccessKeyId=testid
&SignatureMethod=HMAC-SHA1
&Timestamp=2016-03-28T03:13:08Z
&Signature=41wk2SSX1GJh7fwnc5eqOfiJPF****