Amazon MWS: la firma de la solicitud calculada no coincide con la firma provista

Obteniendo el siguiente mensaje de error desde https://mws.amazonservices.com/ :

Sender SignatureDoesNotMatch −  The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.  

Aquí está el código de VB.net que estoy usando para calcular la solicitud. He eliminado SecretKey y AWSAccessKeyId por razones de seguridad.

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim sURL As String = "https://mws.amazonservices.com/" Dim sRequest As String = "" sRequest &= "Acknowledged=" & Server.UrlEncode("false") sRequest &= "&Action=" & Server.UrlEncode("GetReportList") sRequest &= "&AWSAccessKeyId=" & Server.UrlEncode("REMOVED-FOR-SECURITY") sRequest &= "&Marketplace=" & Server.UrlEncode("REMOVED-FOR-SECURITY") sRequest &= "&Merchant=" & Server.UrlEncode("REMOVED-FOR-SECURITY") sRequest &= "&SignatureMethod=" & Server.UrlEncode("HmacSHA256") sRequest &= "&SignatureVersion=" & Server.UrlEncode("2") sRequest &= "&Timestamp=" & Server.UrlEncode(DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssCST")) sRequest &= "&Version=" & Server.UrlEncode("2009-01-01") Dim StringToSign As String = "GET\n" & "mws.amazonservices.com\n" & "/\n" & sRequest sRequest &= "&Signature=" & Server.UrlEncode(HashString(StringToSign)) Response.Write("Click here") End Sub Public Shared Function HashString(ByVal StringToHash As String) As String Dim myEncoder As New System.Text.UTF8Encoding Dim Key() As Byte = myEncoder.GetBytes("REMOVED-FOR-SECURITY") Dim XML() As Byte = myEncoder.GetBytes(StringToHash) Dim myHMACSHA256 As New System.Security.Cryptography.HMACSHA256(Key) Dim HashCode As Byte() = myHMACSHA256.ComputeHash(XML) Return Convert.ToBase64String(HashCode) End Function 

Si aterriza aquí desde Google después de comenzar a trabajar con parte de la documentación de Amazon, es muy probable que vea el error de “firma de solicitud” anterior debido a un espacio inicial o final inadvertido en su clave de acceso secreta. ¡Controla eso primero!

En mi experiencia, este error solo significa “Uno de tus parámetros está mal, ¡buena suerte encontrándolo!” Me encontré con este error utilizando el S3 SDK. Estaba intentando cargar un archivo, pero proporcioné la ruta de archivo completa (“C: \ Users \ addaone \ image.png”) como la clave en lugar de solo el nombre del archivo.

Me encontré con este problema también. Para mí es porque accidentalmente puse un / delante de mi nombre de cubo.

en lugar de test / foo / bar tuve / test / foo / bar para mi nombre de cubo.

La solución fue generar una nueva clave de acceso. Mi primera AWSSecretKey tenía barras inclinadas hacia adelante que probablemente estaban causando el problema, mientras que la nueva no tenía ninguna barra diagonal y funcionó.

Encontré esto porque no estaba haciendo la encoding URL, parece que este error se devuelve si alguno de los parámetros pasados ​​no son válidos, puede que no tenga nada que ver con la clave de acceso.

Respuesta similar a Andrew (respuesta aceptada), pero mis espacios finales no estaban en las teclas, sino en los metadatos para una carga S3:

 using (AmazonS3Client client = new AmazonS3Client(region)) { PutObjectRequest putObjectRequest = new PutObjectRequest { ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256, InputStream = stream, BucketName = s3Bucket, Key = key, ContentType = "application/octet-stream", Timeout = TimeSpan.FromMinutes(60), //http timeout talking to S3, including upload time. ReadWriteTimeout = TimeSpan.FromMinutes(5) //timeout reading the input stream }; if (!string.IsNullOrEmpty(fileName)) putObjectRequest.Metadata.Add("Name", fileName); PutObjectResponse putObjectResponse = client.PutObject(putObjectRequest); // Exception in client.PutObject if fileName has leading spaces in Metadata! } 

Pila de llamadas aquí:

 The request signature we calculated does not match the signature you provided. Check your key and signing method. at Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\ErrorHandler\HttpErrorResponseExceptionHandler.cs:line 116 at Amazon.Runtime.Internal.ExceptionHandler`1.Handle(IExecutionContext executionContext, Exception exception) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Pipeline\ErrorHandler\ExceptionHandler.cs:line 38 [...] at Amazon.Runtime.AmazonServiceClient.Invoke[TRequest,TResponse](TRequest request, IMarshaller`2 marshaller, ResponseUnmarshaller unmarshaller) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AmazonServiceClient.cs:line 117 at Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest request) in d:\Jenkins\jobs\v3-stage-release\workspace\AWSDotNetPublic\sdk\src\Services\S3\Generated\_bcl45\AmazonS3Client.cs:line 3646 at MoveDocumentDataToDisk.AwsRepository.PutObject(RegionEndpoint region, String s3Bucket, String key, String fileName, Stream stream) in C:\code\clarinetsupportfiles\MoveDocumentDataToDisk\MoveDocumentDataToDisk\Program.cs:line 314 

Otra cosa que debe verificar es que cada uno de sus parámetros probablemente deba clasificarse por valor ASCII. El parámetro “AWSAccessKeyId” debe aparecer antes que “Marketplace”, sin embargo, “AssociatedTag” debe aparecer después de “AWSAccessId”.

Esto también se encuentra cuando intentamos cargar un archivo de cero bytes. He abierto un error aquí hoy.

Obtuve el mismo mensaje de “cálculo no coincide” cuando mi error estaba relacionado con la configuración de mis roles

Verifique sus roles, políticas y configuración de CORS para su categoría para asegurarse de tener permiso para usar los encabezados que está utilizando.

En mi caso, he incluido el

 ACL: 'public-read' 

parámetro en la firma del cubo, así como

 xhr.setRequestHeader('x-amz-acl', 'public-read'); 

mientras carga la imagen.

Me faltaba el permiso “s3: PutObjectAcl” en mi usuario de Iam asociado. Aquí hay una política que funcionó.

 { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt12345", "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::mybucketname/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": [ "public-read" ] } } } ] } 

El mío fue porque copié variables de entorno de alguien, pero solo tenían texto de marcador de posición. Hah!

Me encontré con este problema cuando tenía una URL incorrecta (a veces me daba este error, y algunas veces decía que no se podía encontrar la clave, lo que implicaba un error 404). Estas URL son sensibles a mayúsculas y minúsculas, así que asegúrese de ser exactos. Tenía “.jpg” en mi URL y necesitaba “.JPG”

Acabo de encontrarme con este error. Estoy usando PHP y ejecuté un scandir() en mi directorio con mis archivos.

La función scandir() regresó . y .. como los dos primeros índices de la matriz. Después de agregar una statement condicional para asegurarse de que no crea un archivo para estos, funcionó.

Este problema puede ocurrir para los usuarios que han colocado la “Contraseña” del usuario de IAM en la CLI en lugar de la “Clave de acceso privado”. ¿Dónde está la “clave de acceso privado” que puede solicitar? No puede recuperarlo, pero puede crear uno nuevo a través de:

  • IAM, usuarios, administrar claves de acceso, crear clave de acceso
  • Ok, copia la clave rápido! Es tu única oportunidad. 🙂

Obtuve el mismo error con una llamada a SubmitFeed, y después de varias horas de depuración resultó que CURL convirtió mi solicitud POST en una solicitud PUT , lo que hizo que mi firma fuera inválida.

Me ayudó mucho establecer CURLINFO_HEADER_OUT a 1 a través de curl_setopt (), por lo que una llamada posterior a curl_getinfo () dijo que mi solicitud era una solicitud PUT.

Así que comparé las opciones de CURL en la biblioteca de Amazon PHP con lo que hice a través de curl_setopt () y tataa: la biblioteca de Amazon PHP hace esto:

 curl_setopt(CURLINFO_HEADER_OUT, 'POST'); 

(o GET , dependiendo de uno mismo :: REQUEST_TYPE). Hacer lo mismo en mi propia solicitud CURL convirtió la solicitud de PUT a POST, por lo que mi firma hash estaba intacta de nuevo.

Me encontré con el mismo problema usando el comando curl para subir un archivo de cero bytes a la url S3 prescrita.

Encontré que cuando remove header -H 'Content-Type: application/octet-stream' puede funcionar.

Estaba usando aws-sdk v1 de Ruby y estaba obteniendo este error porque estaba especificando el content type al llamar a url_for , siguiendo este ejemplo en los documentos . Eliminar el parámetro content_type en url_for called resolvió el problema por mí.

Estábamos recibiendo esto en un servidor web pero no en una aplicación de consola que usaba una versión anterior del AWS C # SDK (1.5.10.0). Una vez que nos actualizamos a la más reciente se fue.

Compruebe los encabezados de su solicitud, en mi caso, estaba enviando algo con un encabezado extra del código que copié pegado (como un novato) que contenía:

 HOST: localhost:8080 

Después de mucha lucha, utilicé el constructor de putObject para cargar archivos en lugar de inputstream y funcionó. Sin embargo, no estoy seguro de lo que estaba mal.

PHP: Tuve el problema de que al agregar un “/” para denotar una carpeta en s3, lo estaba agregando al nombre del cubo, parece que el comando PUTOBJECT de aws-package reemplazó “/” con “% 2F”, por lo que falló sha256 cálculo de la solicitud como podría verse:
awsbucket% 2Ffolder / filename
pero probablemente hizo un cálculo previo del sha con:
awsbucket / carpeta / nombre de archivo

La solución era agregar previamente el nombre de la carpeta al nombre del archivo.

de:
awsbucket / carpeta
nombre del archivo
a:
awsbucket
carpeta / nombre de archivo

Me encontré con este problema usando .net core 2.1.300-preview1 también. La actualización a 2.1.300-rc1 fue la solución.

Me encontré con el mismo mensaje de error cuando uso WebClient para descargar un archivo en una url de Amazon 3S. Publiqué sobre esto aquí: http://blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html

La solución final que utilicé se encontró aquí: OBTENCIÓN de una URL con una barra con encoding URL