

# Firma y autenticación de solicitudes de REST (AWS Signature Version 2)
<a name="RESTAuthentication"></a>

**Topics**
+ [Uso de credenciales de seguridad temporales](#UsingTemporarySecurityCredentials)
+ [El encabezado de autenticación](#ConstructingTheAuthenticationHeader)
+ [Solicitar canonicalización para firmas](#RESTAuthenticationRequestCanonicalization)
+ [Crear elemento CanonicalizedResource](#ConstructingTheCanonicalizedResourceElement)
+ [Crear el elemento CanonicalizedAmzHeaders](#RESTAuthenticationConstructingCanonicalizedAmzHeaders)
+ [Elementos StringToString de los encabezados HTTP: posicionales frente a denominados](#RESTAuthenticationStringToSign)
+ [Requisitos de marca temporal](#RESTAuthenticationTimeStamp)
+ [Ejemplos de autenticación](#RESTAuthenticationExamples)
+ [Problemas de firma con solicitudes REST](#RESTAuthenticationDebugging)
+ [Alternativa de autenticación por cadena de consulta de solicitudes](#RESTAuthenticationQueryStringAuth)

**nota**  
En este tema se explica la autenticación de solicitudes mediante el uso de Signature Versión 2. Amazon S3 ya es compatible con Signature Version 4. Esta última versión de Signature puede utilizarse en todas las regiones, y las nuevas regiones solo permitirán el uso de Signature versión 4 tras el 30 de enero de 2014. Para obtener más información, vaya a [Autenticación de solicitudes (AWS Signature Version 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) en la *Referencia de la API de Amazon Simple Storage Service*.

 La autenticación es el proceso que consiste en demostrar la identidad del usuario a un sistema. La identidad es un factor importante en las decisiones sobre el control de accesos en Amazon S3. Las solicitudes se admiten o se rechazan, en parte, en función de la identidad del solicitante. Por ejemplo, el derecho a crear buckets se reserva a los desarrolladores registrados, y el derecho a crear objetos en un bucket (de manera predeterminada) se reserva al propietario del bucket en cuestión. Como desarrollador, estará realizando solicitudes que invoquen estos privilegios, por lo que tendrá que demostrar su identidad al sistema autenticando sus solicitudes. En esta sección le demostramos cómo. 

**nota**  
 El contenido de esta sección no se aplica al método HTTP POST. Para obtener más información, consulte [Cargas basadas en el navegador con POST (AWS Signature Version 2)](UsingHTTPPOST.md). 

 La API de REST de Amazon S3 usa un esquema HTTP personalizado basado en un HMAC (Hash Message Authentication Code) con clave para la autenticación. Para autenticar una solicitud, primero ha de concatenar los elementos seleccionados en la solicitud para formar una cadena. A continuación, utilice su clave de acceso secreta de AWS para calcular el HMAC de esa cadena. Este proceso se llama informalmente “firmar la solicitud” y el resultado del algoritmo HMAC es la firma, ya que simula las propiedades de seguridad de una firma real. Por último, tendrá que agregar esta firma como parámetro de la solicitud empleando la sintaxis descrita en esta sección. 

 Cuando el sistema recibe una solicitud autenticada, toma la clave de acceso secreta de AWS que usted afirma tener y la utiliza del mismo modo para computar una firma para el mensaje recibido. A continuación, compara la firma calculada con la firma que presenta el solicitante. Si ambas firmas coinciden, el sistema concluye que el solicitante debe de tener acceso a la clave de acceso secreta de AWS y, por lo tanto, actúa con la autoridad de la solicitud principal para la que se emitió la clave. Si las dos firmas no coinciden, la solicitud se abandona y el sistema responde con un mensaje de error. 

**Example Solicitud REST autenticada de Amazon S3**  

```
1. GET /photos/puppy.jpg HTTP/1.1
2. Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
3. Date: Tue, 27 Mar 2007 19:36:42 +0000
4. 
5. {{Authorization: AWS AKIAIOSFODNN7EXAMPLE:
6. qgk2+6Sv9/oM7G3qLEjTH1a1l1g=}}
```

## Uso de credenciales de seguridad temporales
<a name="UsingTemporarySecurityCredentials"></a>

Si firma su solicitud con credenciales de seguridad temporales (consulte [Realizar solicitudes](MakingRequests.md)), deberá incluid el token de seguridad correspondiente en la solicitud agregando el encabezado `x-amz-security-token`. 

Al obtener credenciales de seguridad temporales con la API de AWS Security Token Service, la respuesta incluye credenciales de seguridad temporales y un token de sesión. El valor del token de la sesión lo facilita en el encabezado `x-amz-security-token` al enviar solicitudes a Amazon S3. Para obtener más información acerca de la API de AWS Security Token Service proporcionada por IAM, consulte la sección [Acción](https://docs.aws.amazon.com/STS/latest/APIReference/API_Operations.html) en la *Guía de referencia de la API de AWS Security Token Service*.

## El encabezado de autenticación
<a name="ConstructingTheAuthenticationHeader"></a>

La API de REST de Amazon S3 usa el encabezado estándar HTTP `Authorization` para transmitir la información de autenticación. (El nombre "encabezado estándar" no es demasiado preciso, ya que lo que transmite es información de autenticación, no autorización). Según el esquema de autenticación de Amazon S3, el encabezado de autorización tiene la siguiente forma:

```
1. Authorization: AWS {{AWSAccessKeyId}}:{{Signature}}
```

Los desarrolladores reciben una ID de clave de acceso de AWS y una clave de acceso secreta de AWS cuando se registran. Para la autenticación de solicitudes, el elemento `AWSAccessKeyId` identifica la ID de clave de acceso utilizada para computar la firma e, indirectamente, también al desarrollador que realiza la solicitud.

El elemento `Signature` es el RFC 2104 HMAC-SHA1 de los elementos seleccionados de la solicitud, y por tanto, la parte `Signature` del encabezado de la autorización variará entre solicitudes. Si la firma de la solicitud calculada por el sistema coincide con la `Signature` incluida en la solicitud, el solicitante habrá demostrado la posesión de la clave de acceso secreta de AWS. La solicitud será procesada bajo la identidad y con la autoridad del desarrollador al que se le emitió la clave.

A continuación presentamos pseudogramática que ilustra la construcción del encabezado de solicitudes `Authorization`. (en el ejemplo, `\n` representa el punto de código en Unicode `U+000A`, normalmente denominado nueva línea). 

```
 1. Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;
 2. 
 3. Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) );
 4. 
 5. StringToSign = HTTP-Verb + "\n" +
 6. 	Content-MD5 + "\n" +
 7. 	Content-Type + "\n" +
 8. 	Date + "\n" +
 9. 	CanonicalizedAmzHeaders +
10. 	CanonicalizedResource;
11. 
12. CanonicalizedResource = [ "/" + Bucket ] +
13. 	<HTTP-Request-URI, from the protocol name up to the query string> +
14. 	[ subresource, if present. For example "?acl", "?location", or "?logging"];
15. 
16. CanonicalizedAmzHeaders = <described below>
```

 HMAC-SHA1 es un algoritmo definido por [ RFC 2104, código de autenticación de mensajes en clave-hash](http://www.ietf.org/rfc/rfc2104.txt). El algoritmo toma como entrada dos cadenas de bytes, una clave y un mensaje. Para la autenticación de solicitudes en Amazon S3, utilice su clave de acceso secreta de AWS (`YourSecretAccessKey`) como clave y la codificación UTF-8 de `StringToSign` como mensaje. El resultado del HMAC SHA1 también es una cadena de bytes, denominada resumen. El parámetro `Signature` de la solicitud se construye en Base64 mediante la codificación de este resumen. 

## Solicitar canonicalización para firmas
<a name="RESTAuthenticationRequestCanonicalization"></a>

 Recuerde que cuando el sistema recibe una solicitud autenticada, compara la firma de la solicitud computada con la firma proporcionada en la solicitud en `StringToSign`. Por este motivo, se debe computar la firma utilizando el mismo método que use Amazon S3. El proceso de poner una solicitud en una forma acordada para la firma es *canonicalización*. 

## Crear elemento CanonicalizedResource
<a name="ConstructingTheCanonicalizedResourceElement"></a>

 `CanonicalizedResource` representa el recurso de Amazon S3 que es el destino de la solicitud. Debe construirlo para adaptarlo a una solicitud REST de la siguiente forma: 

1.  Comience por una cadena vacía (`""`). 

1. Si la solicitud especifica un bucket con el encabezado del host HTTP (estilo de alojamiento virtual), adjunte el nombre del bucket precedido por un `"/"` (por ejemplo, "/nombredelbucket"). Para las solicitudes con estilo de ruta y las solicitudes que no se dirigen a un bucket, no haga nada. Para obtener más información acerca de las solicitudes de tipo alojamiento virtual, consulte [Alojamiento virtual de buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html). 

   Para una solicitud de tipo alojamiento virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg", el `CanonicalizedResource` es "/awsexamplebucket1". 

   Para la solicitud de tipo ruta, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg", el `CanonicalizedResource` es "".

1. Adjunte la parte de la ruta del URI de la solicitud HTTP sin descodificar, hasta la cadena de la consulta, sin incluirla.

   Para una solicitud de tipo alojamiento virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg", el `CanonicalizedResource` es "/awsexamplebucket1/photos/puppy.jpg".

   Para una solicitud de tipo ruta, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg", el `CanonicalizedResource` es "/awsexamplebucket1/photos/puppy.jpg". En este punto, el `CanonicalizedResource` es el mismo tanto para la solicitud de estilo de alojamiento virtual como para la de estilo de ruta.

   Para una solicitud que no se dirija a un bucket, como [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html), adjunte "/".

1. Si la solicitud se dirige a un subrecurso, como `?versioning`, `?location`, `?acl`, `?lifecycle` o `?versionid`, adjunte el subrecurso, su valor (si lo tiene) y el signo de interrogación. Tenga en cuenta que, en caso de que haya varios subrecursos, estos deben estar ordenados lexicográficamente por el nombre del subrecurso y separados por "&". Por ejemplo: ?acl&versionId={{valor}}. 

   Los subrecursos que se deben incluir cuando se crea el elemento CanonicalizedResource son los siguientes: acl, lifecycle, location, logging, notification, partNumber, policy, requestPayment, uploadId, uploads, versionId, versioning, versions y website. 

   Si la solicitud especifica parámetros de la cadena de consulta que sobrescriban a los valores del encabezado de respuesta (véase [Get Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html)), adjunte los parámetros de la cadena de consulta y sus valores. Al firmar no estará codificando estos valores. Sin embargo, al realizar la solicitud, debe codificar estos valores de parámetros. Los parámetros de la cadena de consulta en una solicitud GET incluyen `response-content-type`, `response-content-language`, `response-expires`, `response-cache-control`, `response-content-disposition` y `response-content-encoding`.

   El parámetro de la cadena de consulta `delete` debe incluirse al crear el CanonicalizedResource para una solicitud de eliminación de varios objetos.

Los elementos del CanonicalizedResource que provienen del URI de la solicitud HTTP deben firmarse literalmente según aparecen en la solicitud HTTP, incluidos los caracteres meta de codificación de la URL. 

El `CanonicalizedResource` podría ser diferente del URI de la solicitud HTTP. En particular, si su solicitud usa el encabezado HTTP `Host` para especificar un bucket, el bucket no aparecerá en el URI de la solicitud HTTP. Sin embargo, el `CanonicalizedResource` seguirá incluyendo el bucket. Los parámetros de la cadena de consulta podrían aparecer también en el URI de la solicitud, pero no están incluidos en el `CanonicalizedResource`. Para obtener más información, consulte [Alojamiento virtual de buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html). 

## Crear el elemento CanonicalizedAmzHeaders
<a name="RESTAuthenticationConstructingCanonicalizedAmzHeaders"></a>

Para construir la parte de CanonicalizedAmzHeaders de `StringToSign`, seleccione todos los encabezados de las solicitudes HTTP que comiencen por "x-amz" (con una comparación que no distinga mayúsculas y minúsculas) y emplee el siguiente proceso. 

1.  Convierta cada nombre de encabezado HTTP a minúsculas. Por ejemplo, "`X-Amz-Date`" se ha de convertir en "`x-amz-date`". 

1.  Ordene la colección de encabezados lexicográficamente por nombre de encabezado. 

1.  Combine los campos de encabezado que tengan el mismo nombre en un par de encabezados "nombre-de-encabezado:lista-de-valores-separados-por-comas" según se indica en la RFC 2616, sección 4.2, sin espacios entre los valores. Por ejemplo, dos encabezados de metadatos "`x-amz-meta-username: fred`" y "`x-amz-meta-username: barney`" se combinarían en el encabezado único "`x-amz-meta-username: fred,barney`". 

1.  "Desdoble" los encabezados largos que ocupen varias líneas (según lo permite la RFC 2616, sección 4.2) sustituyendo el espacio de desdoble (incluida la línea nueva) por un espacio único. 

1.  Elimine los espacios que haya en torno a los dos puntos del encabezado. Por ejemplo, el encabezado “`x-amz-meta-username: fred,barney`“ se convertiría en “`x-amz-meta-username:fred,barney`”. 

1.  Por último, adjunte un nuevo carácter (`U+000A`) a cada encabezado canonicalizado de la lista resultante. Construye el elemento CanonicalizedResource concatenando todos los encabezados de esta lista en una cadena única. 

## Elementos StringToString de los encabezados HTTP: posicionales frente a denominados
<a name="RESTAuthenticationStringToSign"></a>

 Los primeros elementos del encabezado de `StringToSign` (Content-Type, Date y Content-MD5) tienen naturaleza posicional. `StringToSign` no incluye los nombres de estos encabezados, solo sus valores procedentes de la solicitud. Por contraste, los elementos "`x-amz-`" son denominados. Tanto los nombres como los valores de los encabezados aparecen en `StringToSign`. 

 Si un encabezado posicional al que se llama en la definición de `StringToSign` no está presente en su solicitud (por ejemplo, `Content-Type` o `Content-MD5` son opcionales para las solicitudes PUT y no significativos para la solicitudes GET), sustituya la cadena vacía ("") para dicha posición. 

## Requisitos de marca temporal
<a name="RESTAuthenticationTimeStamp"></a>

Una marca temporal válida (en la que se use el encabezado HTTP `Date` o una alternativa `x-amz-date`) es obligatoria para las solicitudes autenticadas. Además, la marca temporal del cliente incluida en una solicitud autenticada debe estar en el intervalo de 15 minutos del momento, según la hora del sistema de Amazon S3 en el que se recibe la solicitud. En caso contrario, ocurrirá un error en la solicitud y recibirá el código de error `RequestTimeTooSkewed`. El objetivo de estas restricciones es limitar la posibilidad de que las solicitudes interceptadas pudieran ser reproducidas por un adversario. Para implementar una protección más sólida ante el acceso no autorizado, use el transporte HTTPS para solicitudes autenticadas. 

**nota**  
La limitación de validación con la fecha de solicitud solo se aplica a las solicitudes autenticadas en las que no se use la autenticación por cadena de consulta. Para obtener más información, consulte [Alternativa de autenticación por cadena de consulta de solicitudes](#RESTAuthenticationQueryStringAuth).

Algunas bibliotecas de cliente HTTP no permiten configurar el encabezado `Date` para una solicitud. Si encuentra problemas al incluir el valor del encabezado "Date" en los encabezados canonicalizados, puede establecer la marca temporal de la solicitud mediante un encabezado "`x-amz-date`". El valor del encabezado `x-amz-date` debe encontrarse en uno de los formatos que se indican en RFC 2616 ([http://www.ietf.org/rfc/rfc2616.txt](http://www.ietf.org/rfc/rfc2616.txt)). Cuando hay un encabezado `x-amz-date` presente en una solicitud, el sistema ignorará cualquier encabezado `Date` al computarla firma de la misma. Por tanto, si incluye el encabezado `x-amz-date`, use la cadena vacía para `Date` al construir el `StringToSign`. Consulte la siguiente sección para ver un ejemplo. 

## Ejemplos de autenticación
<a name="RESTAuthenticationExamples"></a>

 Los ejemplos de esta sección emplean las credenciales (no funcionales) de la siguiente tabla. 


| Parámetro | Valor | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

En el ejemplo, el formato de `StringToSign` no es significativo, y el `\n` es el punto de código Unicode `U+000A`, normalmente denominado línea nueva. Además, en los ejemplos se usa "\+0000" para designar la zona horaria. También puede usar "GMT" para designar la zona horaria, pero las firmas que se mostrarán en los ejemplos serán diferentes.

### Object GET
<a name="RESTAuthenticationExamples-1"></a>

En este ejemplo se obtiene un objeto del bucket awsexamplebucket1.


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>GET /photos/puppy.jpg HTTP/1.1<br />Host: awsexamplebucket1.us-west-1.s3.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:36:42 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />qgk2+6Sv9/oM7G3qLEjTH1a1l1g=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:36:42 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Tenga en cuenta que el CanonicalizedResource incluye el nombre del bucket, pero la URI de la solicitud HTTP no. (El encabezado del host especifica el bucket). 

**nota**  
La siguiente secuencia de comandos de Python calcula la firma anterior, utilizando los parámetros proporcionados. Puede utilizar este script para construir sus propias firmas, reemplazando las claves y StringToSign según corresponda.  

```
 1. import base64
 2. import hmac
 3. from hashlib import sha1
 4. 
 5. access_key = '{{AKIAIOSFODNN7EXAMPLE}}'.encode("UTF-8")
 6. secret_key = '{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}'.encode("UTF-8")
 7. 
 8. string_to_sign = '{{GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg}}'.encode("UTF-8")
 9. signature = base64.b64encode(
10.                                 hmac.new(
11.                                          secret_key, string_to_sign, sha1
12.                                          ).digest()
13.                                 ).strip()
14. 
15. 
16. print(f"AWS {access_key.decode()}:{signature.decode()}")
```

### Object PUT
<a name="RESTAuthenticationExamples-2"></a>

En este ejemplo se coloca un objeto en el bucket awsexamplebucket1.


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>PUT /photos/puppy.jpg HTTP/1.1<br />Content-Type: image/jpeg<br />Content-Length: 94328<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 21:15:45 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />iqRzw+ileNPu1fhspnRs8nOjjIA=<br />}}</pre>  |  <pre>PUT\n<br />\n<br />image/jpeg\n<br />Tue, 27 Mar 2007 21:15:45 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Tenga en cuenta el encabezado Content-Type en la solicitud y en el StringToSign. Tenga en cuenta también que el Content-MD5 se deja vacío en el StringToSign, porque no aparece en la solicitud. 

### Enumeración
<a name="RESTAuthenticationExamples-3"></a>



En este ejemplo se muestra el contenido del bucket awsexamplebucket1.


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>GET /?prefix=photos&max-keys=50&marker=puppy HTTP/1.1<br />User-Agent: Mozilla/5.0<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:42:41 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />m0WP8eCtspQl5Ahe6L1SozdX9YA=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:42:41 +0000\n<br />/awsexamplebucket1/</pre>  | 

 Tenga en cuenta la barra al final del CanonicalizedResource y la ausencia de parámetros en la cadena de consulta. 

### Fetch
<a name="RESTAuthenticationExamples-4"></a>

En este ejemplo se obtiene el subrecurso de la política de control de acceso para el bucket "awsexamplebucket1".


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>GET /?acl HTTP/1.1<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:44:46 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />82ZHiFIjc+WbcwFKGUVEQspPn+0=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:44:46 +0000\n<br />/awsexamplebucket1/?acl</pre>  | 

 Ahora, tenga en cuenta cómo el parámetro de la cadena de consulta del subrecurso está incluido en el CanonicalizedResource. 

### Eliminar
<a name="RESTAuthenticationExamples-5"></a>

En este ejemplo se elimina un objeto del bucket "awsexamplebucket1" de tipo ruta y la alternativa Date.


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>DELETE /awsexamplebucket1/photos/puppy.jpg HTTP/1.1<br />User-Agent: dotnet<br />Host: s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 21:20:27 +0000<br /><br />x-amz-date: Tue, 27 Mar 2007 21:20:26 +0000<br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:XbyTlbQdu9Xw5o8P4iMwPktxQd8=}}</pre>  |  <pre>DELETE\n<br />\n<br />\n<br />Tue, 27 Mar 2007 21:20:26 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Tenga en cuenta el método alternativo “x-amz-date” para especificar la fecha (porque nuestra biblioteca de clientes, por ejemplo, nos impide establecer la fecha). En este caso, el `x-amz-date` tiene prioridad sobre el encabezado `Date`. Por tanto, la fecha introducida en la firma ha de contener el valor del encabezado `x-amz-date`. 

### Cargar
<a name="RESTAuthenticationExamples-6"></a>

En este ejemplo se carga un objeto en un bucket con alojamiento virtual de estilo CNAME y con metadatos.


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>PUT /db-backup.dat.gz HTTP/1.1<br />User-Agent: curl/7.15.5<br />Host: static.example.com:8080<br />Date: Tue, 27 Mar 2007 21:06:08 +0000<br /><br />x-amz-acl: public-read<br />content-type: application/x-download<br />Content-MD5: 4gJE4saaMU4BqNR0kLY+lw==<br />X-Amz-Meta-ReviewedBy: joe@example.com<br />X-Amz-Meta-ReviewedBy: jane@example.com<br />X-Amz-Meta-FileChecksum: 0x02661779<br />X-Amz-Meta-ChecksumAlgorithm: crc32<br />Content-Disposition: attachment; filename=database.dat<br />Content-Encoding: gzip<br />Content-Length: 5913339<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />jtBQa0Aq+DkULFI8qrpwIjGEx0E=}}</pre>  |  <pre>PUT\n<br />4gJE4saaMU4BqNR0kLY+lw==\n<br />application/x-download\n<br />Tue, 27 Mar 2007 21:06:08 +0000\n<br /><br />x-amz-acl:public-read\n<br />x-amz-meta-checksumalgorithm:crc32\n<br />x-amz-meta-filechecksum:0x02661779\n<br />x-amz-meta-reviewedby:<br />joe@example.com,jane@example.com\n<br />/static.example.com/db-backup.dat.gz</pre>  | 

 Tenga en cuenta cómo los encabezados "x-amz-" se ordenan, se les recortan los espacios extra o se convierten en minúscula. Tenga en cuenta también que se han agrupado varios encabezados con el mismo nombre utilizando comas para separar valores. 

 Tenga en cuenta que solo los encabezados de entidades HTTP `Content-Type` y `Content-MD5` aparecen en el `StringToSign`. El resto de encabezados de entidades `Content-*` no aparecen. 

 Además, tenga en cuenta que el `CanonicalizedResource` incluye el nombre del bucket, pero el URI de la solicitud HTTP no lo incluye. (El encabezado del host especifica el bucket). 

### Mostrar todos mis buckets
<a name="RESTAuthenticationExamples-7"></a>


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>GET / HTTP/1.1<br />Host: s3.us-west-1.amazonaws.com<br />Date: Wed, 28 Mar 2007 01:29:59 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:qGdzdERIC03wnaRNKh6OqZehG9s=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Wed, 28 Mar 2007 01:29:59 +0000\n<br />/</pre>  | 

### Claves de Unicode
<a name="RESTAuthenticationExamples-8"></a>


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>GET /dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re HTTP/1.1<br />Host: s3.us-west-1.amazonaws.com<br />Date: Wed, 28 Mar 2007 01:49:49 +0000<br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:DNEZGsoieTZ92F3bUfSPQcbGmlM=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Wed, 28 Mar 2007 01:49:49 +0000\n<br />/dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re</pre>  | 

**nota**  
Los elementos en el `StringToSign` que se derivaron del URI de la solicitud se toman literalmente, incluida la codificación y capitalización de la URL. 

## Problemas de firma con solicitudes REST
<a name="RESTAuthenticationDebugging"></a>

 Cuando falla la autenticación de REST, el sistema responde a la solicitud con un documento de errores XML. La información que contiene este documento de errores tiene como objetivo ayudar a los desarrolladores a diagnosticar el problema. En particular, el elemento `StringToSign` del documento de errores `SignatureDoesNotMatch` le dice exactamente qué canonicalización de solicitudes está empleando el sistema. 

Algunas herramientas insertan encabezados en modo silencioso cuya existencia usted no conocía, como la agregación del encabezado `Content-Type` durante un PUT. En la mayoría de estos casos, el valor del encabezado insertado permanece constante, con lo que podrá descubrir los encabezados faltantes con herramientas como Ethereal o tcpmon. 

## Alternativa de autenticación por cadena de consulta de solicitudes
<a name="RESTAuthenticationQueryStringAuth"></a>

Puede autenticar determinado tipo de solicitudes pasando la información requerida como parámetros de una cadena de consulta, en lugar de usar el encabezado HTTP `Authorization`. Esto resulta útil para habilitar el acceso directo por navegador de terceros a sus datos de Amazon S3 privados sin hacer pasar la solicitud por un proxy. La idea es construir una solicitud "prefirmada" y codificarla como una URL que pueda recuperar el navegador de un usuario final. Además, puede limitar una solicitud prefirmada especificando una fecha de vencimiento. 

Para obtener más información acerca del uso de parámetros de consulta para autenticar solicitudes, consulte [Autenticación de solicitudes: Uso de los parámetros de consulta (AWS Signature Version 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) en la *Referencia de la API de Amazon Simple Storage Service*. Con el fin de ver ejemplos sobre cómo usar los AWS SDK para generar URL prefirmadas, consulte [Compartir objetos con URL prefirmadas](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html). 

### Crear una firma
<a name="CreatingASignature"></a>

A continuación figura un ejemplo de una solicitud REST de Amazon S3 autenticada por cadena de consulta.

```
1. GET /photos/puppy.jpg
2. ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1
3. Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
4. Date: Mon, 26 Mar 2007 19:37:58 +0000
```

El método de autenticación de solicitudes con cadena de consulta no requiere ningún encabezado HTTP especial. Los elementos de autenticación necesarios se especifican como parámetros de la cadena de consulta: 


| Nombre del parámetro de la cadena de consulta | Ejemplo de valor | Descripción | 
| --- | --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | El ID de la clave de acceso de AWS. Especifica la clave de acceso secreta de AWS utilizada para firmar la solicitud e, indirectamente, la identidad del desarrollador que realiza la solicitud. | 
| Expires | 1141889120 | El momento de vencimiento de la firma, especificado como el número de segundos a partir de la fecha de inicio (00:00:00 UTC del 1 de enero de 1970). Cualquier solicitud recibida con posterioridad a este momento (según el servidor) será rechazada.  | 
| Signature | vjbyPxybdZaNmGa%2ByT272YEAiv4%3D | La codificación URL de la codificación Base64 del HMAC SHA1 de StringToSign. | 

El método de autenticación de solicitudes con cadena de consulta difiere levemente del método ordinario, pero solo en el formato del parámetro de la solicitud `Signature` y el elemento `StringToSign`. A continuación presentamos pseudogramática que ilustra el método de autenticación de solicitudes por cadena de consulta. 

```
1. Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) );
2. 
3. StringToSign = HTTP-VERB + "\n" +
4.     Content-MD5 + "\n" +
5.     Content-Type + "\n" +
6.     Expires + "\n" +
7.     CanonicalizedAmzHeaders +
8.     CanonicalizedResource;
```

`YourSecretAccessKey` es el ID de clave de acceso secreta de AWS que le asigna Amazon cuando se registra para ser un desarrollador de Amazon Web Services. Tenga en cuenta que la `Signature` está codificada en formato de URL para que se pueda colocar en la cadena de consulta. Tenga en cuenta también que, en `StringToSign`, el elemento posicional HTTP `Date` ha sido sustituido por `Expires`. El `CanonicalizedAmzHeaders` y el `CanonicalizedResource` son iguales. 

**nota**  
En el método de autenticación por cadena de consulta, no utilice el encabezado `Date` ni `x-amz-date request` al calcular la cadena para firmar.

#### Autenticación por cadena de consulta de solicitudes
<a name="query-str-auth-ex"></a>


| Solicitud | StringToSign | 
| --- | --- | 
|  <pre>GET /photos/puppy.jpg?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&<br />    Signature=NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D&<br />    Expires=1175139620 HTTP/1.1<br /><br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com</pre>  |  <pre>GET\n<br />\n<br />\n<br />1175139620\n<br /><br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

Este ejemplo supone que, cuando un navegador realiza la solicitud GET, no facilitará un encabezado Content-MD5 ni Content-Type, ni tampoco creará encabezados x-amz-, por lo que esas partes de `StringToSign` se dejan vacías. 

#### Usar codificación Base64
<a name="S3_Authentication_Base64"></a>

Las firmas de solicitudes HMAC deben tener codificación Base64. La codificación Base64 convierte la firma en una cadena ASCII sencilla que se puede adjuntar a la solicitud. Los caracteres que podrían aparecer en la cadena de firma, como más (\+), barra inclinada (/) e igual (=) deben estar codificados si se usan en un URI. Por ejemplo, si el código de autenticación incluye un signo más (\+), codifíquelo como %2B en la solicitud. Las barras inclinadas se codifican como %2F, y los signos de igual, como %3D.

Para ver más ejemplos de codificación en Base64, consulte los de Amazon 3 [Ejemplos de autenticación](#RESTAuthenticationExamples).