Amazon MWS - demande de signature calculée ne correspond pas à la signature

recevoir le message d'erreur suivant de https://mws.amazonservices.com / :

<Type>Sender</Type>
<Code>SignatureDoesNotMatch</Code>
−
<Message>
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.
</Message>

voici le VB.net code que j'utilise pour calculer la requête. J'ai retiré le SecretKey et AWSAccessKeyId pour des raisons de sécurité.

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 = "GETn" & "mws.amazonservices.comn" & "/n" & sRequest
        sRequest &= "&Signature=" & Server.UrlEncode(HashString(StringToSign))

        Response.Write("<a href=""" & sURL & "?" & sRequest & """>Click here</a>")

    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
60
demandé sur Kyle Ballard 2010-05-06 01:55:56

22 réponses

si vous atterrissez ici depuis Google après avoir commencé à travailler sur une partie de la documentation D'Amazon, il est fort probable que vous voyez l'erreur "request signature" ci-dessus en raison d'une entrée ou d'une sortie accidentelle sur votre clé d'accès secrète. Vérification que le premier!

136
répondu Andrew 2015-01-23 21:49:10

d'après mon expérience, cette erreur signifie simplement "un de vos paramètres est erroné, bonne chance pour le trouver!"J'ai rencontré cette erreur en utilisant le SDK S3. J'ai essayé de télécharger un fichier, mais j'ai malencontreusement fourni le chemin complet du fichier ("C:\Users\addaone\image.png") comme la clé au lieu du nom du fichier.

23
répondu Nick Rogers 2014-05-21 00:01:13

j'ai rencontré ce problème aussi. Pour moi, c'est parce que j'ai accidentellement mis un / devant mon seau nom.

au lieu de test/foo/bar, j'ai eu /test/foo/bar pour mon seau nom.

19
répondu Jason H 2013-10-02 21:28:59

la solution était de générer une nouvelle clé D'accès. Mon premier AWSSecretKey avait slash avant arrière sur elle qui ont probablement été à l'origine du problème, tandis que le nouveau n'a pas eu de slash avant et a travaillé.

17
répondu Joao Leme 2013-12-21 15:15:24

j'ai trouvé ceci parce que je ne faisais pas le codage D'URL - il semble que cette erreur est retournée si l'un des paramètres passés sont invalides - il peut n'avoir rien du tout à faire avec la clé d'accès.

16
répondu Fiona - myaccessible.website 2012-04-19 16:19:50

réponse similaire à Andrew (réponse acceptée), mais mes espaces de fuite n'étaient pas sur les clés, mais sur les métadonnées pour un téléchargement 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!
}           

pile d'Appel ici:

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
3
répondu Thierry_S 2015-09-25 12:49:05

une autre chose à vérifier est que chacun de vos paramètres doit probablement être trié par valeur ASCII. Le paramètre " AWSAccessKeyId "doit précéder" Marketplace", cependant" AssociatedTag "doit précéder"Awsaccesssid".

2
répondu dechimp 2015-03-10 00:48:10

ceci est également rencontré lorsque nous essayons de télécharger un fichier à octet zéro. J'ai ouvert un bug ici aujourd'hui.

1
répondu vikas027 2015-04-28 14:51:37

je recevais le même message "calculé ne correspond pas" quand mon erreur était liée à la façon dont mes rôles étaient configurés

Vérifiez la configuration de vos rôles, politiques et CORS pour votre seau pour être sûr que vous avez la permission d'utiliser les en-têtes que vous utilisez.

dans mon cas, j'avais inclus le

ACL: 'public-read' 

paramètre dans la signature du seau ainsi que

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

alors que téléchargement de l'image.

il me manquait le "s3:PutObjectAcl", l'autorisation dans mon associé utilisateur Iam. Voici une politique qui a fonctionné.

{
  "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"
                ]
            }
        }
    }
  ]
}
1
répondu Tom22 2016-12-28 04:22:28

le mien était parce que j'ai copié les variables d'environnement de quelqu'un mais ils ont juste eu le texte de substitution. Ah!

0
répondu Elijah Murray 2013-11-04 17:32:57

j'ai rencontré ce problème quand j'ai eu une mauvaise URL (il m'a donné cette erreur, et parfois, il dit qu'ils pourrait pas être trouvé, ce qui implique une erreur 404). Ces URLS sont sensibles à la casse, donc assurez-vous d'être exact. J'ai eu ".jpg" dans mon URL, et nécessaire ".JPG "

0
répondu Pstrazzulla 2014-03-11 00:11:33

je viens de tomber dans cette erreur. J'utilise PHP, et j'ai lancé un scandir() sur mon répertoire avec mes fichiers.

la fonction scandir() renvoie . et .. comme les deux premiers index du tableau. Après avoir ajouté un énoncé conditionnel pour être sûr qu'il ne crée pas de fichier pour ceux-ci, cela a fonctionné.

0
répondu 2014-12-16 19:47:39

ce problème peut se produire pour les utilisateurs qui ont placé le" mot de passe "de l'utilisateur IAM dans le CLI au lieu de la"clé D'accès privée". Où est la "clé D'accès privée" que vous pouvez demander? Vous ne pouvez pas le récupérer, mais vous pouvez en créer un nouveau via:

  • IAM, les Utilisateurs, de Gérer les Clés d'Accès, de Créer la Clé d'Accès
  • OK, copiez la clé vite! C'est votre seule chance. :)
0
répondu tresf 2015-05-30 02:03:10

j'ai eu la même erreur avec un appel de SubmitFeed, et après plusieurs heures de débogage il s'est avéré que CURL a transformé ma requête POST en une requête PUT , ce qui a rendu ma signature invalide.

cela a beaucoup aidé de mettre CURLINFO_HEADER_OUT à 1 via curl_setopt(), donc un appel plus tard à curl_getinfo() a dit que ma requête était une requête PUT.

donc j'ai comparé les options CURL dans la bibliothèque PHP Amazon à quoi J'ai fait via curl_setopt (), et tataa: la bibliothèque PHP D'Amazon fait ceci:

curl_setopt(CURLINFO_HEADER_OUT, 'POST');

(ou GET , en fonction de self::REQUEST_TYPE). Faire la même chose dans ma propre requête CURL a fait tourner la requête de PUT à POST, donc ma signature hachée était à nouveau intacte.

0
répondu Anse 2015-07-29 12:47:57

j'ai rencontré le même problème en utilisant la commande curl pour télécharger un fichier de zéro octet vers l'url pré-assignée de S3.

j'ai trouvé quand supprimer l'en-tête -H 'Content-Type: application/octet-stream' alors peut fonctionner.

0
répondu guile chao 2016-01-12 01:15:10

j'utilisais le de Ruby" aws-sdk v1 et j'ai eu cette erreur parce que je spécifiais le content type en appelant url_for , suivant cet exemple sur le docs . La suppression du paramètre content_type sur le url_for a résolu le problème pour moi.

0
répondu Tomas Romero 2016-02-04 15:08:27

nous recevions cela sur un serveur web, mais pas sur une console utilisant une ancienne version de L'AWS C# SDK (1.5.10.0). Une fois que nous sommes passés à la plus récente il est parti.

0
répondu Zach Wymer 2016-06-29 13:31:20

Vérifiez vos en-têtes de demande, dans mon cas j'envoyais quelque chose d'un en-tête supplémentaire le code que je copiais collé (comme un noob) contenant:

HOST: localhost:8080
0
répondu Ordiel 2016-07-29 16:09:20

après beaucoup de lutte, j'ai utilisé le constructeur putObject pour télécharger des fichiers au lieu de inputstream et ça a fonctionné. Pas sûr de ce qui est mal.

0
répondu karthik 2017-01-23 14:13:15

PHP: j'ai eu un problème que lors de l'ajout d'un "/" pour dénoter un dossier dans s3, Je l'ajoutais au nom de seau, il semble que la commande PUTOBJECT de aws-package remplacé "/" par "%2F", il a échoué sha256 calcul de la demande comme il pourrait regarder:

awsbucket%2Ffolder/nom de fichier

mais il a probablement fait un pré-calcul de la sha avec:

awsbucket/dossier/nom de fichier

était de pré-ajouter le nom du dossier nom de fichier à la place.

de:

awsbucket/dossier

nom du fichier

à:

awsbucket

dossier / nom de fichier

0
répondu Kkloe 2017-07-12 12:59:09

j'ai rencontré ce problème en utilisant .net core 2.1.300-preview1 aussi. La mise à jour au 2.1.300-rc1 était la solution.

0
répondu Jonathan DeMarks 2018-05-23 17:16:50

j'ai rencontré le même message d'erreur en utilisant WebClient pour télécharger un fichier sur une url Amazon 3s. J'ai blogué à ce sujet ici: http://blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html

la solution finale que j'ai utilisée a été trouvée ici: obtenir une URL avec une barre oblique encodée par une url

-1
répondu cdeutsch 2017-05-23 11:47:14