View a markdown version of this page

Autenticación de solicitudes: uso de parámetros de consulta (AWS Signature Version 4) - Amazon Simple Storage Service

Autenticación de solicitudes: uso de parámetros de consulta (AWS Signature Version 4)

Como se describe en la información general de la autenticación (consulte Métodos de autenticación), 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 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.

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:

<your-access-key-id>/<date>/<Región de AWS>/<AWS-service>/aws4_request

Por ejemplo:

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

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 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 “yyyyMMddTHHmmssZ”. 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).

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:

  • El encabezado HTTP host.

  • Cualquier encabezado x-amz-* que planee agregar a la solicitud.

nota

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

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

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.

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(); }

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). 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

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 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

    2. StringToSign

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

  2. SigningKey

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

  3. 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

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>