View a markdown version of this page

Cálculos de firma para el encabezado de Authorization: transferencia de la carga útil en un solo fragmento (AWS Signature Version 4) - Amazon Simple Storage Service

Cálculos de firma para el encabezado de Authorization: transferencia de la carga útil en un solo fragmento (AWS Signature Version 4)

Cuando se utiliza el encabezado Authorization para autenticar las solicitudes, el valor del encabezado incluye, entre otras cosas, una firma. Los cálculos de la firma varían según lo que elija para transferir la carga útil (Descripción general). En esta sección, se explican los cálculos de la firma cuando se elige transferir la carga útil en un solo fragmento. La sección de ejemplos (consulte Ejemplos: Cálculos de firma) muestra los cálculos de firma y los encabezados Authorization resultantes que puede utilizar como conjunto de pruebas para verificar el código.

importante

Al transferir la carga útil en un único fragmento, si lo desea, puede optar por incluir el hash de la carga útil en los cálculos de firma, lo que se denomina carga útil firmada (si no la incluye, la carga útil se considera no firmada). El procedimiento de firma analizado en la siguiente sección se aplica a ambos, pero hay que tener en cuenta las siguientes diferencias:

  • Opción de carga firmada: se incluye el hash de carga útil al crear la solicitud canónica (que luego pasa a formar parte de StringToSign, como se explica en la sección de cálculo de firmas). También se especifica el mismo valor que el valor del encabezado x-amz-content-sha256 al enviar la solicitud a S3.

  • Opción de carga útil sin firmar: se incluye la cadena literal UNSIGNED-PAYLOAD al crear una solicitud canónica y se establece el mismo valor que el valor del encabezado x-amz-content-sha256 al enviar la solicitud a Amazon S3.

Al enviar la solicitud a Amazon S3, el valor del encabezado x-amz-content-sha256 informa a Amazon S3 de si la carga útil está firmada o no. Amazon S3 puede entonces crear la firma correspondiente para su verificación.

En ambos casos, dado que el valor del encabezado x-amz-content-sha256 ya forma parte de HashedPayload, no es necesario que incluya el encabezado x-amz-content-sha256 como canónico.

Cálculo de una firma

A fin de calcular una firma, primero necesita una cadena para firmar. Luego, se calcula un hash HMAC-SHA256 de la cadena que se va a firmar mediante una clave de firma. En el siguiente diagrama, se ilustra el proceso, incluidos los distintos componentes de la cadena que se crea para la firma

Cuando Amazon S3 recibe una solicitud autenticada, calcula la firma y luego la compara con la firma proporcionada en la solicitud. Por este motivo, se debe calcular la firma utilizando el mismo método que use Amazon S3. El proceso de poner una solicitud en una forma acordada para la firma se llama canonicalización.

Diagrama de proceso de firma AWS4-HMAC-SHA256 que muestra los pasos de solicitud canónica, StringToSign y firma.

En la siguiente tabla, se describen las funciones que se muestran en el diagrama. Debe implementar código para estas funciones.

Función Descripción
Lowercase() Convierta la cadena de caracteres en minúsculas.
Hex() Codificación en minúsculas en base 16.
SHA256Hash() Función de hash criptográfico del algoritmo de hash seguro (SHA).
HMAC-SHA256() Calcula el HMAC mediante el algoritmo SHA256 con la clave de firma proporcionada. Esta es la firma final.
Trim() Elimine cualquier espacio en blanco inicial o final.
UriEncode()

El URI codifica cada byte. UriEncode() debe aplicar las siguientes reglas:

  • El URI codifica todos los bytes excepto los caracteres no reservados: “A”-“Z”, “a”-“z”, “0”-“9”, “-”, “.”, “_” y “~”.

  • El carácter de espacio es un carácter reservado y debe codificarse como “%20” (y no como “+”).

  • Cada byte codificado en URI se encuentra formado por un “%” y el valor hexadecimal de dos dígitos del byte.

  • Las letras del valor hexadecimal deben estar en mayúsculas, por ejemplo, “%1A”.

  • Codifique el carácter de barra diagonal, “/”, en todas partes excepto en el nombre de la clave del objeto. Por ejemplo, si el nombre de la clave del objeto es photos/Jan/sample.jpg, la barra diagonal del nombre de la clave no se encuentra codificada.

importante

Es posible que las funciones estándar de UriEncode que proporciona su plataforma de desarrollo no funcionen debido a las diferencias en la implementación y a la ambigüedad relacionada en las RFC subyacentes. Le recomendamos que escriba su propia función UriEncode personalizada para asegurarse de que la codificación funcione.

A continuación, se muestra una función UriEncode() de ejemplo en Java.

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

Tarea 1: Crear una solicitud canónica

En esta sección, se proporciona información general sobre la creación de una solicitud canónica.

A continuación, se muestra el formato de solicitud canónica que Amazon S3 utiliza para calcular una firma. Para que las firmas coincidan, debe crear una solicitud canónica en este formato:

<HTTPMethod>\n <CanonicalURI>\n <CanonicalQueryString>\n <CanonicalHeaders>\n <SignedHeaders>\n <HashedPayload>

Donde:

  • HTTPMethod es uno de los métodos HTTP, por ejemplo GET, PUT, HEAD y DELETE.

  • CanonicalURI es la versión codificada del URI del componente de ruta absoluta del URI, todo lo que comienza con la “/” que sigue al nombre de dominio y continúa hasta el final de la cadena o del signo de interrogación (“?”) si tiene parámetros de cadena de consulta. El URI del siguiente ejemplo, /examplebucket/myphoto.jpg, es la ruta absoluta y no se codifica la “/” en la ruta absoluta:

    http://s3.amazonaws.com/examplebucket/myphoto.jpg

    nota

    No se normalizan las rutas de URI para las solicitudes a Amazon S3. Por ejemplo, puede tener un bucket con un objeto denominado “my-object//example//photo.user”. Al normalizar la ruta, el nombre del objeto de la solicitud pasa a ser “my-object/example/photo.user”. Esta es una ruta incorrecta para ese objeto.

  • CanonicalQueryString especifica los parámetros de la cadena de consulta codificados en URI. Codifique en URI el nombre y los valores de forma individual. También debe ordenar los parámetros de la cadena de consulta canónica alfabéticamente por nombre de clave. La clasificación se produce después de la codificación. La cadena de consulta del siguiente ejemplo de URI es prefix=somePrefix&marker=someMarker&max-keys=20:

    http://s3.amazonaws.com/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=20

    La cadena de consulta canónica es la siguiente (se agregan saltos de línea a este ejemplo para facilitar la lectura):

    UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix")

    Cuando una solicitud se dirige a un subrecurso, el valor del parámetro de consulta correspondiente será una cadena vacía (“”). Por ejemplo, el siguiente URI identifica el subrecurso ACL en el bucket examplebucket:

    http://s3.amazonaws.com/examplebucket?acl

    En este caso, la cadena CanonicalQueryString es la siguiente:

    UriEncode("acl") + "=" + ""

    Si el URI no incluye un “?”, no hay ninguna cadena de consulta en la solicitud y establece la cadena de consulta canónica en una cadena vacía (“”). Aún tendrá que incluir “\n”.

  • CanonicalHeaders es una lista de los encabezados de las solicitudes con sus valores. Los pares individuales de nombre y valor del encabezado se encuentran separados por el carácter de nueva línea (“\n”). Los nombres de los encabezados deben estar en minúsculas. Debe ordenar alfabéticamente los nombres de encabezado para crear la cadena, como se muestra en el siguiente ejemplo:

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

    Las funciones Lowercase() y Trim() que se utilizan en este ejemplo se describen en la sección anterior.

    La lista CanonicalHeaders debe incluir lo siguiente:

    • Encabezado de host HTTP.

    • Si el encabezado Content-MD5 se encuentra en la solicitud, debe agregarlo a la lista CanonicalHeaders.

    • También debe agregar cualquier encabezado x-amz-* que planea incluir en su solicitud. Por ejemplo, si utiliza credenciales de seguridad temporales, debe incluir x-amz-security-token en su solicitud. Debe agregar este encabezado a la lista de CanonicalHeaders.

    nota
    • El encabezado x-amz-content-sha256 es obligatorio para todas las solicitudes de Signature Version 4 de AWS. Proporciona un hash de la carga de solicitud. Sin embargo, no es necesario que incluya x-amz-content-sha256 como encabezado canónico porque S3 utilizará automáticamente su valor al calcular el hash de carga útil enviado en la solicitud.

    • Si no hay ninguna carga, debe proporcionar el hash de una cadena vacía.

    • Si no desea que S3 compruebe el hash de la solicitud, puede usar la cadena literal "UNSIGNED-PAYLOAD" en su lugar.

    A continuación, se muestran cadenas de CanonicalHeaders de ejemplo. Los nombres de encabezado se encuentran en minúsculas y ordenados.

    ejemplo Ejemplo 1
    host:s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130708T220855Z
    ejemplo Ejemplo 2
    host:s3.amazonaws.com x-amz-content-sha256:UNSIGNED-PAYLOAD x-amz-date:20130708T220855Z
    ejemplo Ejemplo 3
    host:s3.amazonaws.com x-amz-date:20130708T220855Z
    nota

    Para calcular una firma de autorización, se requieren el encabezado del host y todos los encabezados x-amz-*, excepto x-amz-content-sha256. Sin embargo, a fin de evitar la manipulación de datos, debería considerar la posibilidad de incluir todos los encabezados en el cálculo de la firma.

    Firmar el encabezado x-amz-content-sha256 es opcional porque S3 usará su valor al calcular el hash de carga útil de la solicitud recibida.

  • SignedHeaders es una lista ordenada alfabéticamente y separada por punto y coma de nombres de encabezados de solicitudes en minúsculas. Los encabezados de las solicitudes de la lista son los mismos que incluyó en la cadena de CanonicalHeaders. En los ejemplos anteriores, el valor de SignedHeaders sería el siguiente:

    ejemplo Ejemplos 1 y 2
    host;x-amz-content-sha256;x-amz-date
    ejemplo Ejemplo 3
    host;x-amz-date
  • HashedPayload es el valor hexadecimal del hash SHA256 de la carga útil de la solicitud.

    Hex(SHA256Hash(<payload>)

    Si no hay ninguna carga en la solicitud, se calcula un hash de la cadena vacía de la siguiente manera:

    Hex(SHA256Hash(""))

    El hash devuelve los siguientes valores:

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

    Por ejemplo, cuando carga un objeto mediante una solicitud PUT, proporciona los datos del objeto en el cuerpo. Al recuperar un objeto mediante una solicitud GET, se calcula el hash de la cadena vacía.

Tarea 2: Crear una cadena para firmar

En esta sección, se proporciona información general sobre la creación de una cadena para firmar. Para obtener instrucciones paso a paso, consulte Tarea 2: Crear una cadena para firmar en Referencia general de AWS.

La cadena para firmar es una concatenación de las cadenas siguientes:

"AWS4-HMAC-SHA256" + "\n" + timeStampISO8601Format + "\n" + <Scope> + "\n" + Hex(SHA256Hash(<CanonicalRequest>))

La cadena constante AWS4-HMAC-SHA256 especifica el algoritmo hash que está utilizando, HMAC-SHA256. timeStamp es la hora UTC actual en formato ISO 8601 (por ejemplo, 20130524T000000Z).

Scope vincula la firma resultante a una fecha, una Región de AWS y un servicio específicos. Por lo tanto, la firma resultante solo funcionará en la región específica y para un servicio específico. La firma es válida durante siete días a partir de la fecha especificada.

date.Format(<YYYYMMDD>) + "/" + <region> + "/" + <service> + "/aws4_request"

Para Amazon S3, la cadena del servicio es s3. Para obtener una lista de cadenas de regiones, consulte Regiones y puntos de conexión en Referencia general de AWS. La columna Región de esta tabla proporciona la lista de cadenas de región válidas.

El siguiente alcance restringe la firma resultante a la región us-east-1 y Amazon S3.

20130606/us-east-1/s3/aws4_request

nota

Scope debe utilizar la misma fecha que utiliza para calcular la clave de firma, tal y como se explica en la siguiente sección.

Tarea 3: Cálculo de la firma

En AWS Signature Version 4, en lugar de utilizar las claves de acceso de AWS para firmar una solicitud, se crea primero una clave de firma que se limita a una región y un servicio específicos.  Para obtener más información sobre cómo firmar claves, consulte Introducción a la firma de solicitudes.

DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")

nota

Algunos casos de uso pueden procesar claves de firma durante un máximo de 7 días. Para obtener más información, consulte Compartir un objeto con otros.

Para obtener una lista de cadenas de regiones, consulte Regiones y puntos de conexión en Referencia general de AWS.

El uso de una clave de firma permite guardar las credenciales de AWS en un lugar seguro. Por ejemplo, si tiene varios servidores que se comunican con Amazon S3, comparte la clave de firma con esos servidores; no tiene que guardar una copia de la clave de acceso secreta en cada servidor. La clave de firma es válida durante un máximo de siete días. Por lo tanto, cada vez que calcule la clave de firma, tendrá que compartirla con los servidores. Para obtener más información, consulte Autenticación de solicitudes (AWS Signature Version 4).

La firma final es el hash HMAC-SHA256 de la cadena a firmar, mediante la clave de firma como clave.

HMAC-SHA256(SigningKey, StringToSign)

Para obtener instrucciones paso a paso sobre cómo crear una firma, consulte Tarea 3: Crear una firma en Referencia general de AWS.

Ejemplos: Cálculos de firma

Puede utilizar los ejemplos en esta sección como referencia para comprobar los cálculos de firma en el código. Los cálculos que se muestran en los ejemplos utilizan los siguientes datos:

  • Ejemplo de claves de acceso.

    Parámetro Valor
    AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
    AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  • Marca temporal de solicitud de 20130524T000000Z (Fri, 24 May 2013 00:00:00 GMT).

  • Nombre del bucket: examplebucket.

  • Se supone que el bucket está en la región Este de EE. UU. (Norte de Virginia). La credencial Scope y los cálculos de Signing Key utilizan us-east-1 como especificador de región. Para obtener información sobre otras regiones, consulte Regiones y puntos de conexión en Referencia general de AWS.

  • Puede utilizar solicitudes de tipo ruta o de alojamiento virtual. Los ejemplos siguientes muestran cómo firmar una solicitud de tipo de alojamiento virtual, por ejemplo:

    https://examplebucket.s3.amazonaws.com/photos/photo1.jpg

    Para obtener más información, consulte Alojamiento virtual de buckets en la Guía del usuario de Amazon Simple Storage Service.

Ejemplo: objeto GET

El ejemplo siguiente obtiene los primeros 10 bytes de un objeto (test.txt) de examplebucket. Para obtener más información sobre la acción de la API, consulte GetObject.

GET /test.txt HTTP/1.1 Host: examplebucket.s3.amazonaws.com Authorization: SignatureToBeCalculated Range: bytes=0-9 x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date: 20130524T000000Z

Como esta solicitud GET no proporciona ningún contenido en el cuerpo, el valor x-amz-content-sha256 puede ser el hash del cuerpo vacío de la solicitud o la cadena literal "UNSIGNED-PAYLOAD". Los pasos siguientes muestran los cálculos de firma y la construcción del encabezado Authorization mediante el hash de una cadena vacía.

  1. StringToSign
    1. CanonicalRequest

      GET /test.txt host:examplebucket.s3.amazonaws.com range:bytes=0-9 x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130524T000000Z host;range;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

      En la cadena de solicitud canónica, la última línea es el hash del cuerpo de la solicitud vacío. La tercera línea se encuentra vacía porque no hay parámetros de consulta en la solicitud.

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 7344ae5b7ee6c3e7e6b0fe0640412a37625d1fbfff95c48bbb2dc43964946972

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Signature

    f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41

  4. Encabezado Authorization

    El encabezado de Authorization resultante es el siguiente:

    AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;range;x-amz-content-sha256;x-amz-date,Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41

Ejemplo: objeto PUT

En este ejemplo de solicitud PUT se crea un objeto (test$file.text) en examplebucket. El ejemplo supone lo siguiente:

  • Para solicitar REDUCED_REDUNDANCY como clase de almacenamiento, agregue el encabezado de solicitud x-amz-storage-class. Para obtener información sobre las clases de almacenamiento, consulte Clases de almacenamiento en la Guía del usuario de Amazon Simple Storage Service.

  • El contenido del archivo cargado es una cadena, "Welcome to Amazon S3." El valor de x-amz-content-sha256 en la solicitud se basa en esta cadena.

Para obtener información acerca de la acción de la API, consulte PutObject.

PUT test$file.text HTTP/1.1 Host: examplebucket.s3.amazonaws.com Date: Fri, 24 May 2013 00:00:00 GMT Authorization: SignatureToBeCalculated x-amz-date: 20130524T000000Z x-amz-storage-class: REDUCED_REDUNDANCY x-amz-content-sha256: 44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072 <Payload>

Los pasos siguientes muestran cálculos de firma.

  1. StringToSign
    1. CanonicalRequest

      PUT /test%24file.text date:Fri, 24 May 2013 00:00:00 GMT host:examplebucket.s3.amazonaws.com x-amz-content-sha256:44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072 x-amz-date:20130524T000000Z x-amz-storage-class:REDUCED_REDUNDANCY date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class 44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072

      En la solicitud canónica, la tercera línea se encuentra vacía porque no hay parámetros de consulta en la solicitud. El encabezado canónico x-amz-content-sha256 puede firmarse opcionalmente, ya que su hash de carga útil ya está incluido en la parte inferior de la solicitud. La última línea es el hash del cuerpo, que debe ser igual al valor x-amz-content-sha256 header enviado a S3 en la solicitud HTTP.

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 9e0e90d9c76de8fa5b200d8c849cd5b8dc7a3be3951ddb7f6a76b4158342019d

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Signature

    98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd

  4. Encabezado Authorization

    El encabezado de Authorization resultante es el siguiente:

    AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd

Ejemplo: ciclo de vida de bucket GET

La solicitud GET siguiente recupera la configuración del ciclo de vida de examplebucket. Para obtener información sobre la acción de la API, consulte GetBucketLifecycleConfiguration.

GET ?lifecycle HTTP/1.1 Host: examplebucket.s3.amazonaws.com Authorization: SignatureToBeCalculated x-amz-date: 20130524T000000Z x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Como la solicitud no proporciona ningún contenido en el cuerpo, el valor del encabezado x-amz-content-sha256 es el hash del cuerpo vacío de la solicitud. Los pasos siguientes muestran cálculos de firma.

  1. StringToSign
    1. CanonicalRequest

      GET / lifecycle= host:examplebucket.s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130524T000000Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

      En la solicitud canónica, la última línea es el hash del cuerpo de la solicitud vacío.

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 9766c798316ff2757b517bc739a67f6213b4ab36dd5da2f94eaebf79c77395ca

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Signature

    fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543

  4. Encabezado Authorization

    El encabezado de Authorization resultante es el siguiente:

    AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543

Ejemplo: obtener Bucket (Mostrar objetos)

En el ejemplo siguiente, se recupera una lista de objetos del bucket examplebucket. Para obtener información acerca de la acción de la API, consulte ListObjects.

GET ?max-keys=2&prefix=J HTTP/1.1 Host: examplebucket.s3.amazonaws.com Authorization: SignatureToBeCalculated x-amz-date: 20130524T000000Z x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Como la solicitud no proporciona un cuerpo, el valor de x-amz-content-sha256 es el hash del cuerpo vacío de la solicitud. Los pasos siguientes muestran cálculos de firma.

  1. StringToSign
    1. CanonicalRequest

      GET / max-keys=2&prefix=J host:examplebucket.s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130524T000000Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

      En la cadena canónica, la última línea es el hash del cuerpo de la solicitud vacío.

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request df57d21db20da04d7fa30298dd4488ba3a2b47ca3a489c74750e0f1e7df1b9b7

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Signature

    34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7

  4. Encabezado Authorization

    El encabezado de Authorization resultante es el siguiente:

    AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7