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-Credentialde 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 |
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:
Por ejemplo:
Para Amazon S3, la cadena del |
X-Amz-Date |
El formato de fecha y hora debe seguir la norma ISO 8601 y debe tener el formato “ |
X-Amz-Expires |
Proporciona el periodo, en segundos, durante el que es válida la URL prefirmada generada. Por ejemplo, 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:
notaPara 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: ., 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.
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:
importanteEs 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.
|
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-Tokenen 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 encabezadosx-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 errorInvalidRequestporque 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
Scopey los cálculos deSigning Keyutilizanus-east-1como 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 |
-
StringToSign
-
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 -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
Signature
aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404Ahora 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>