

# Autenticación de solicitudes: uso de parámetros de consulta (AWS Signature Version 4)
<a name="sigv4-query-string-auth"></a>

Como se describe en la información general de la autenticación (consulte [Métodos de autenticación](sig-v4-authenticating-requests.md#auth-methods-intro)), puede proporcionar información de autenticación mediante los parámetros de la cadena de consulta. El uso de los parámetros de consulta para autenticar solicitudes es útil cuando desea expresar una solicitud por completo en una URL. Este método también se denomina prefirmar una URL. 

Un caso de uso de las URL prefirmadas es que puede conceder acceso temporal a los recursos de Amazon S3. Por ejemplo, puede incrustar una URL prefirmada en el sitio web o utilizarla en un cliente de línea de comandos (como Curl) para descargar objetos.

**nota**  
También puede utilizar la AWS CLI para crear URL prefirmadas. Para obtener más información, consulte [`presign`](https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html) en la *Referencia de comandos de la AWS CLI*.

A continuación, se muestra un ejemplo de una URL prefirmada. 

 

```
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential={{<your-access-key-id>}}/20130721/us-east-1/s3/aws4_request
&X-Amz-Date=20130721T201207Z
&X-Amz-Expires=86400
&X-Amz-SignedHeaders=host
&X-Amz-Signature={{<signature-value>}}
```



En la URL de ejemplo, tenga en cuenta lo siguiente:

 
+ Se han agregado saltos de línea para facilitar la lectura.
+ El valor `X-Amz-Credential` de la URL muestra el carácter “/” solo para facilitar la lectura. En la práctica, se debe codificar como `%2F`. Por ejemplo:

   

  ```
  &X-Amz-Credential={{<your-access-key-id>}}%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
  ```

  

En la siguiente tabla, se describen los parámetros de consulta de la URL que proporcionan información de autenticación. 


| Nombre del parámetro de la cadena de consulta | Ejemplo de valor | 
| --- | --- | 
| X-Amz-Algorithm | Identifica la versión de la firma de AWS y el algoritmo que utilizó para calcular la firma. <br />Para AWS Signature Version 4, defina el valor de este parámetro en `AWS4-HMAC-SHA256`. Esta cadena identifica AWS Signature Version 4 (AWS 4) y el algoritmo HMAC-SHA256 (HMAC-SHA256).  | 
| X-Amz-Credential | Además del ID de clave de acceso, este parámetro también proporciona el alcance (Región de AWS y servicio) para el que es válida la firma. Este valor debe coincidir con el alcance que se utiliza en los cálculos de firmas, como se explica en la siguiente sección. El formato general de este valor de parámetro es el siguiente:<br /> <pre>{{<your-access-key-id>}}/{{<date>}}/{{<Región de AWS>}}/{{<AWS-service>}}/aws4_request</pre><br />Por ejemplo: <br /> <pre>AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request</pre><br />Para Amazon S3, la cadena del {{servicio de AWS}} es `s3`. Para obtener una lista de las cadenas de `AWS-region` de S3, consulte [Regiones y puntos de conexión](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) en *Referencia general de AWS*. | 
| X-Amz-Date | El formato de fecha y hora debe seguir la norma ISO 8601 y debe tener el formato “{{yyyyMMdd}}T{{HHmmss}}Z”. Por ejemplo, si la fecha y la hora son “08/01/2016 15:32:41.982-700”, primero se deben convertir a UTC (hora universal coordinada) y, a continuación, se deben enviar como “20160801T223241Z”.  | 
| X-Amz-Expires | Proporciona el periodo, en segundos, durante el que es válida la URL prefirmada generada. Por ejemplo, `86400` (24 horas). Este valor es un entero. El valor mínimo que puede establecer es 1 y el máximo es 604 800 (siete días).<br />Una URL prefirmada puede ser válida durante un máximo de siete días porque la clave de firma que utiliza para calcular la firma es válida durante un máximo de siete días.  | 
| X-Amz-SignedHeaders | Muestra los encabezados que utilizó para calcular la firma. Los siguientes encabezados son obligatorios para los cálculos de firmas:<br /> +  El encabezado HTTP `host`. <br />+  Cualquier encabezado `x-amz-*` que planee agregar a la solicitud. <br />   Para mayor seguridad, debe firmar todos los encabezados de solicitud que planea incluir en su solicitud.  | 
| X-Amz-Signature | Proporciona la firma para autenticar la solicitud. Esta firma debe coincidir con la firma que calcula Amazon S3; de lo contrario, Amazon S3 deniega la solicitud. Por ejemplo: ., ` 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7`<br />Los cálculos de firmas se describen en la siguiente sección. | 
| X-Amz-Security-Token | Parámetro de credenciales opcional si se utilizan credenciales procedentes del servicio STS. | 



## Cálculo de una firma
<a name="query-string-auth-v4-signing"></a>

En el diagrama siguiente se ilustra el proceso de cálculo de firma. 

 

![Proceso de firma de AWS Signature Version 4 con solicitud canónica, cadena para firmar y pasos de generación de firmas.](https://docs.aws.amazon.com/es_es/AmazonS3/latest/developerguide/images/sigV4-using-query-params.png)




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 “\~”.  <br />+ El carácter de espacio es un carácter reservado y debe codificarse como “%20” (y no como “\+”). <br />+ Cada byte codificado en URI se encuentra formado por un “%” y el valor hexadecimal de dos dígitos del byte. <br />+ Las letras del valor hexadecimal deben estar en mayúsculas, por ejemplo, “%1A”. <br />+ 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.  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. <br />A continuación, se muestra una función UriEncode() de ejemplo en Java.<pre>public static String UriEncode(CharSequence input, boolean encodeSlash) {<br />          StringBuilder result = new StringBuilder();<br />          for (int i = 0; i < input.length(); i++) {<br />              char ch = input.charAt(i);<br />              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {<br />                  result.append(ch);<br />              } else if (ch == '/') {<br />                  result.append(encodeSlash ? "%2F" : ch);<br />              } else {<br />                  result.append(toHexUTF8(ch));<br />              }<br />          }<br />          return result.toString();<br />      }</pre> | 

Para obtener más información sobre el proceso de firma (detalles sobre la creación de una solicitud canónica, cadena para firmar y cálculos de firma), consulte [Cálculos de firma para el encabezado de Authorization: transferencia de la carga útil en un solo fragmento (AWS Signature Version 4)](sig-v4-header-based-auth.md). Por lo general, el proceso es el mismo, excepto en que la creación de **CanonicalRequest** en una URL prefirmada difiere de la siguiente manera:

 
+ No incluya un hash de carga útil en la **Solicitud canónica**, ya que cuando crea una URL prefirmada, no conoce el contenido de la carga útil porque la URL se usa para cargar una carga útil arbitraria. En su lugar, utilice una cadena constante `UNSIGNED-PAYLOAD`. 
+ La **Cadena de consulta canónica** debe incluir todos los parámetros de consulta de la tabla anterior excepto `X-Amz-Signature`. 
+ Para S3, debe incluir el parámetro de consulta `X-Amz-Security-Token` en la URL si utiliza credenciales procedentes del servicio STS.
+ Los **encabezados canónicos** deben incluir el encabezado HTTP `host`. Si planea incluir alguno de los encabezados `x-amz-* `, también debe agregarlos para calcular la firma. Si lo desea, puede agregar todos los demás encabezados que planee incluir en la solicitud. Para mayor seguridad, debe firmar tantos encabezados como sea posible. Si agrega un encabezado firmado que también es un parámetro de consulta firmado y su valor es diferente, recibirá un error `InvalidRequest` porque la entrada es contradictoria.

## Un ejemplo
<a name="query-string-auth-v4-signing-example"></a>

Supongamos que tiene un objeto `test.txt` en el bucket de `examplebucket`. Desea compartir este objeto con otras personas durante un periodo de 24 horas (86 400 segundos) mediante la creación de una URL prefirmada. 

 

```
https://examplebucket.s3.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Signature={{<signature-value>}}
```

Los pasos siguientes ilustran primero los cálculos de firma y, a continuación, la creación de la URL prefirmada. El ejemplo realiza las siguientes suposiciones adicionales:

 
+ La marca temporal de la solicitud es `Fri, 24 May 2013 00:00:00 GMT`.
+ El bucket está en la región Este de EE. UU. (Norte de Virginia) y la credencial `Scope` y los cálculos de `Signing Key` utilizan `us-east-1` como especificador de región. Para obtener más información, consulte [Regiones y puntos de enlace](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) en la *Referencia general de AWS*. 

Puede utilizar este ejemplo como caso de prueba para comprobar la firma que calcula el código; sin embargo, debe utilizar el mismo nombre de bucket, la misma clave de objeto, la misma marca temporal y las siguientes credenciales de ejemplo:


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

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /test.txt
      X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
      host:examplebucket.s3.amazonaws.com
      
      host
      UNSIGNED-PAYLOAD
      ```

       

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
      ```

       

1. 

**SigningKey**

    

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

    

1. 

**Signature**

    

   ```
   aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
   ```

    

   Ahora tiene toda la información para crear una URL prefirmada. La URL resultante de este ejemplo se muestra de la siguiente manera (puede usarla para comparar la URL prefirmada):

   ```
   https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
   ```

## Ejemplo 2
<a name="query-string-auth-v4-signing-example-2"></a>

El ejemplo siguiente (no relacionado con el ejemplo anterior) muestra una URL prefirmada con el parámetro `X-Amz-Security-Token`.

```
https://examplebucket.s3.us-east-1.amazonaws.com/test.txt
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host
&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D
&X-Amz-Signature={{<signature-value>}}
```