Toda solicitud a la API de KMS debe incluir una firma válida. Alibaba Cloud utiliza esta firma para verificar la identidad del solicitante, detectar alteraciones durante la transmisión y rechazar solicitudes repetidas.
Si utiliza un SDK o la CLI de Alibaba Cloud, el proceso de firma se gestiona automáticamente. Este tema aplica únicamente a desarrolladores que construyen un cliente HTTP personalizado o que realizan llamadas directas a la API sin usar un SDK.
Funcionamiento de la firma
El proceso para firmar una solicitud de KMS consta de dos pasos:
Construir la cadena por firmar: ordene y codifique en porcentaje todos los parámetros de la solicitud para formar una cadena de consulta canónica; después, anteponga el método HTTP y una barra diagonal codificada en porcentaje.
Calcular la firma: calcule un hash HMAC-SHA1 de la cadena por firmar mediante su AccessKey secret como clave, codifique el resultado en Base64 y añádalo a la solicitud como el parámetro
Signature.
La fórmula de la firma es la siguiente:
Signature = Base64( HMAC-SHA1( AccessKey Secret, UTF-8-Encoding-Of(StringToSign)) )
La URL final de la solicitud tiene esta estructura:
https://<endpoint>/?Action=<operation>&SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=<encoded-signature>&...
Parámetros de la firma
|
Parámetro |
Valor |
Descripción |
|
|
|
Algoritmo de firma |
|
|
|
Versión del algoritmo de firma |
|
|
|
Cadena de la firma, codificada según RFC 3986 |
Funciones obligatorias
Para implementar la firma, necesita las siguientes funciones:
|
Función |
Descripción |
|
|
Codificación en porcentaje basada en UTF-8; consulte las reglas de codificación y la implementación en Java en el paso 1.1 |
|
|
Función de hash con clave definida en RFC 2104 |
|
|
Codificación Base64 estándar |
Paso 1: Construir la cadena por firmar
Paso 1.1: Crear la cadena de consulta canónica
Recopile todos los parámetros de la solicitud excepto
Signature. Esto incluye tanto los parámetros comunes (comoAction,Version,AccessKeyId,SignatureMethod,SignatureVersion,TimestampyFormat) como cualquier parámetro específico de la operación.Ordene los parámetros alfabéticamente por nombre.
-
Codifique en porcentaje cada nombre y valor de parámetro mediante UTF-8. Las reglas de codificación son las siguientes:
Este proceso difiere de
application/x-www-form-urlencoded(codificación MIME). Si utilizajava.net.URLEncoderde Java, aplique primero la codificación MIME y luego reemplace+por%20,*por%2Ay%7Epor~. El siguiente métodopercentEncodeimplementa esta lógica: ``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; }``Tipo de carácter
Regla de codificación
Letras mayúsculas y minúsculas, dígitos,
-,_,.,~No requieren codificación
Todos los demás caracteres
Formato
%XY, dondeXYes el código ASCII en hexadecimal (por ejemplo,"→%22)Caracteres UTF-8 extendidos
Formato
%XY%ZA…Espacios
%20— no utilice+ Una cada nombre y valor codificados con
=y luego una todos los pares con&siguiendo el orden de clasificación. El resultado es su cadena de consulta canónica.
Paso 1.2: Construir StringToSign
Construya StringToSign con el siguiente formato:
StringToSign =
HTTPMethod + "&" +
percentEncode("/") + "&" +
percentEncode(CanonicalizedQueryString)
|
Componente |
Descripción |
|
|
Método HTTP utilizado para la solicitud, como |
|
|
Barra diagonal codificada en porcentaje, cuyo valor es |
|
|
Cadena de consulta canónica obtenida en el paso 1.1, codificada en porcentaje por segunda vez |
Paso 2: Calcular la firma
-
Calcule el código de autenticación de mensajes basado en hash (HMAC) de
StringToSignmediante el algoritmo SHA1 (RFC 2104). La clave HMAC se forma con su AccessKey secret seguida de un ampersand (&, ASCII 38):key = AccessKey Secret + "&" Codifique la salida HMAC en Base64 para obtener la cadena de la firma.
Codifique la cadena de la firma según RFC 3986 y agréguela a la solicitud como el parámetro
Signature.
Ejemplo
A continuación se muestra cómo firmar una solicitud de CreateKey.
Parámetros de la solicitud (antes de firmar)
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
Construcción de StringToSign
Tras ordenar alfabéticamente y codificar en porcentaje, la cadena de consulta canónica queda así:
AccessKeyId%3Dtestid%26Action%3DCreateKey%26Format%3Djson%26SignatureMethod%3DHMAC-SHA1%26SignatureVersion%3D1.0%26Timestamp%3D2016-03-28T03%253A13%253A08Z%26Version%3D2016-01-20
La cadena completa de StringToSign es:
GET&%2F&AccessKeyId%3Dtestid%26Action%3DCreateKey%26Format%3Djson%26SignatureMethod%3DHMAC-SHA1%26SignatureVersion%3D1.0%26Timestamp%3D2016-03-28T03%253A13%253A08Z%26Version%3D2016-01-20
Cada componente corresponde a:
|
Componente |
Valor |
|
|
|
|
|
|
|
|
La cadena codificada mostrada anteriormente |
Cálculo de la firma
|
Entrada |
Valor |
|
AccessKey ID |
|
|
AccessKey secret |
|
|
Clave HMAC |
|
|
Valor de la firma |
|
URL de la solicitud firmada
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****