amazon web services - aws - ¿Cómo solucionar el error ''La firma de solicitud que calculamos no coincide con el error de firma''?
aws signature (26)
Acabo de experimentar esto al cargar una imagen a S3 usando AWS SDK con React Native.
Resultó ser causado por el parámetro
ContentEncoding
.
Eliminar ese parámetro "solucionó" el problema.
He buscado en la web durante más de dos días y probablemente haya examinado la mayoría de los escenarios documentados en línea y soluciones alternativas, pero hasta ahora nada me funcionó.
Estoy en AWS SDK para PHP V2.8.7 ejecutándose en PHP 5.3. Estoy tratando de conectarme a mi bucket de S3 con el siguiente código:
// Create a `Aws` object using a configuration file
$aws = Aws::factory(''config.php'');
// Get the client from the service locator by namespace
$s3Client = $aws->get(''s3'');
$bucket = "xxx";
$keyname = "xxx";
try {
$result = $s3Client->putObject(array(
''Bucket'' => $bucket,
''Key'' => $keyname,
''Body'' => ''Hello World!''
));
$file_error = false;
} catch (Exception $e) {
$file_error = true;
echo $e->getMessage();
die();
}
//
Mi archivo config.php es el siguiente:
<?php
return array(
// Bootstrap the configuration file with AWS specific features
''includes'' => array(''_aws''),
''services'' => array(
// All AWS clients extend from ''default_settings''. Here we are
// overriding ''default_settings'' with our default credentials and
// providing a default region setting.
''default_settings'' => array(
''params'' => array(
''credentials'' => array(
''key'' => ''key'',
''secret'' => ''secret''
)
)
)
)
);
Está produciendo el siguiente error:
La firma de solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave y método de firma.
Ya verifiqué mi clave de acceso y mi secreto al menos 20 veces, generé otras nuevas, utilicé diferentes métodos para pasar la información (es decir, perfil e incluir credenciales en el código) pero nada funciona en este momento.
Como otros han dicho, tuve exactamente el mismo problema y resultó estar relacionado con la contraseña / secreto de acceso. Generé una contraseña para mi usuario s3 que no era válida, y no me informó. Al intentar conectarse con el usuario, dio este error. Parece que no le gustan ciertos o todos los símbolos en las contraseñas (al menos para Minio)
Después de dos días de depuración, finalmente descubrí el problema ...
La clave que estaba asignando al objeto comenzó con un punto, es decir,
../images/ABC.jpg
, y esto provocó el error.
Deseo que la API proporcione un mensaje de error más significativo y relevante, ¡ay, espero que esto ayude a alguien más!
El problema en mi caso fue la URL de API Gateway utilizada para configurar Amplify que tenía una barra extra al final ...
La URL consultada se parecía a
https://....amazonaws.com/myapi//myendpoint
.
Eliminé la barra extra en la configuración y funcionó.
No es el mensaje de error más explícito de mi vida.
En mi caso (python) falló porque tenía estas dos líneas de código en el archivo, heredado de un código anterior
http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = ''HTTP/1.0''
En mi caso, analicé una url S3 en sus componentes.
Por ejemplo:
Url: s3://bucket-name/path/to/file
Fue analizado en:
Bucket: bucket-name
Path: /path/to/file
Tener la parte de ruta que contiene un ''/'' inicial falló la solicitud.
En mi caso, el nombre del cubo era incorrecto, incluía la primera parte de la clave (bucketxxx / keyxxx); no había nada de malo en la firma.
En mi caso, estaba llamando a
s3request.promise().then()
incorreclty, lo que provocó dos ejecuciones de la solicitud cuando solo se realizó una llamada.
Lo que quiero decir es que estaba iterando a través de 6 objetos, pero se hicieron 12 solicitudes (puede verificar iniciando sesión en la consola o depurando la red en el navegador)
Dado que la marca de tiempo para la segunda solicitud, no deseada, no coincidía con la firma de la primera, esto produjo este problema.
En realidad, en Java estaba obteniendo el mismo error. Después de pasar 4 horas para depurarlo, descubrí que el problema estaba en los metadatos en los objetos S3, ya que había espacio al colocar los controles de caché en los archivos s3. Este espacio estaba permitido en 1.6. * versión pero en 1.11. * no está permitido y, por lo tanto, arrojó el error de desajuste de firma
En una versión anterior de aws-php-sdk, antes de la depreciación del
S3Client::factory()
, se le permitía colocar parte de la ruta del archivo o
Key
como se llama en el
S3Client->putObject()
parámetros
, en el parámetro del depósito.
Tenía un administrador de archivos en uso de producción, usando el SDK v2.
Como el método de fábrica todavía funcionaba, no volví a visitar este módulo después de actualizar a
~3.70.0
.
Hoy pasé la mayor parte de dos horas depurando por qué había comenzado a recibir este error, y terminó siendo debido a los parámetros que estaba pasando (que solía funcionar):
$s3Client = new S3Client([
''profile'' => ''default'',
''region'' => ''us-east-1'',
''version'' => ''2006-03-01''
]);
$result = $s3Client->putObject([
''Bucket'' => ''awesomecatpictures/catsinhats'',
''Key'' => ''whitecats/white_cat_in_hat1.png'',
''SourceFile'' => ''/tmp/asdf1234''
]);
Tuve que mover la parte de
catsinhats
de mi ruta de cubo / clave al parámetro
Key
, así:
$s3Client = new S3Client([
''profile'' => ''default'',
''region'' => ''us-east-1'',
''version'' => ''2006-03-01''
]);
$result = $s3Client->putObject([
''Bucket'' => ''awesomecatpictures'',
''Key'' => ''catsinhats/whitecats/white_cat_in_hat1.png'',
''SourceFile'' => ''/tmp/asdf1234''
]);
Lo que creo que está sucediendo es que el nombre del
Bucket
ahora se codifica con URL.
Después de una inspección adicional del mensaje exacto que recibía del SDK, encontré esto:
Error al ejecutar
PutObject
en
https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
Error de AWS HTTP: error del cliente:
PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
resultó en un
403 Forbidden
Esto muestra que el
/
I proporcionado a mi parámetro
Bucket
ha sido a través de
urlencode()
y ahora es
%2F
.
La forma en que funciona la Firma es bastante complicada, pero el problema se reduce al cubo y la clave se utiliza para generar la firma encriptada. Si no coinciden exactamente en el cliente que realiza la llamada y dentro de AWS, la solicitud será denegada con un 403. El mensaje de error realmente señala el problema:
La firma de solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave y método de firma.
Entonces, mi
Key
estaba equivocada porque mi
Bucket
estaba equivocado.
Encontré esto en una imagen de Docker, con un punto final que no es AWS S3, cuando
awscli
la última versión de
awscli
disponible para Debian stretch, es decir, la versión 1.11.13.
La actualización a la versión 1.16.84 de CLI resolvió el problema.
Para instalar la última versión de la CLI con un Dockerfile basado en una imagen estirada de Debian, en lugar de:
RUN apt-get update
RUN apt-get install -y awscli
RUN aws --version
Utilizar:
RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install awscli
RUN aws --version
Generar una nueva clave de acceso funcionó para mí.
Me sale este error con las credenciales incorrectas. Creo que había personajes invisibles cuando lo pegué originalmente.
No sé si alguien llegó a este problema al intentar probar la URL de salida en el navegador, pero si está utilizando
Postman
e intenta copiar la url generada de AWS desde la pestaña
RAW
, debido a la escasez de barras invertidas, obtendrá el error anterior
Use la pestaña
Pretty
para copiar y pegar la URL para ver si realmente funciona.
Me encontré con este problema recientemente y esta solución resolvió mi problema. Es con fines de prueba para ver si realmente recupera los datos a través de la URL.
Esta respuesta es una referencia para aquellos que intentan generar una descarga, un enlace temporal de AWS o generalmente generan una URL de AWS para usar.
Otro posible problema podría ser que los metavalores contengan caracteres no US-ASCII. Para mí, ayudó a UrlEncode los valores al agregarlos a putRequest:
request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist));
request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));
Para mí usé axios y por defecto envía un encabezado
content-type: application/x-www-form-urlencoded
entonces cambio para enviar:
content-type: application/octet-stream
y también tuve que agregar este tipo de contenido a la firma de AWS
const params = {
Bucket: bucket,
Key: key,
Expires: expires,
ContentType = ''application/octet-stream''
}
const s3 = new AWS.S3()
s3.getSignedUrl(''putObject'', params)
Podría resolver este problema estableciendo variables de entorno.
export AWS_ACCESS_KEY=
export AWS_SECRET_ACCESS_KEY=
En IntelliJ + py.test, configuro variables de entorno con
[Run] > [Edit Configurations] > [Configuration] > [Environment] > [Environment variables]
Recibí este error al cargar el documento en CloudSearch a través de Java SDK. El problema se debió a un carácter especial en el documento que se cargará. El error "La firma de solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave de acceso secreta de AWS y el método de firma". Es muy engañoso.
Recibo el mismo error debido a la siguiente razón.
He ingresado las credenciales correctas pero con copiar y pegar. De modo que puede ser un problema de inserción de caracteres basura mientras se copia y pega. Ingresé manualmente y ejecuté el código y ahora funciona bien
Gracias
Resolví este problema cambiando los permisos públicos en mi bucket de AWS s3 y agregando la configuración CORS a continuación a la configuración de mi bucket.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Consulte la documentación de AWS s3 para obtener más información.
Si ninguna de las otras soluciones mencionadas funciona para usted, intente usar
aws configure
Este comando abrirá un conjunto de opciones solicitando claves, región y formato de salida.
¡Espero que esto ayude!
Tuve el mismo error en nodejs.
Pero agregar
signatureVersion
en s3 constructor me ayudó:
const s3 = new AWS.S3({
apiVersion: ''2006-03-01'',
signatureVersion: ''v4'',
});
Tuve el mismo problema cuando intenté copiar un objeto con algunos caracteres UTF8. A continuación se muestra un ejemplo de JS:
var s3 = new AWS.S3();
s3.copyObject({
Bucket: ''somebucket'',
CopySource: ''path/to/Weird_file_name_ðÓpíu.jpg'',
Key: ''destination/key.jpg'',
ACL: ''authenticated-read''
}, cb);
Resuelto codificando CopySource con
encodeURIComponent()
Tuve el mismo problema. Tenía el método predeterminado, PUT configurado para definir la URL previamente firmada, pero estaba tratando de realizar un GET. El error se debió a una falta de coincidencia del método.
Tuve que establecer
Aws.config.update({
credentials: Aws::Credentials.new(access_key_id, secret_access_key)
})
antes con el ruby aws sdk v2 (probablemente hay algo similar a esto en los otros idiomas también)
Tuve un error similar, pero para mí parecía ser causado por la reutilización de un usuario de IAM para trabajar con S3 en dos entornos diferentes de Elastic Beanstalk. Traté el síntoma creando un usuario de IAM con permiso idéntico para cada entorno y eso hizo que el error desapareciera.