web-dev-qa-db-fra.com

Amazon MWS - La signature de la requête calculée ne correspond pas à la signature fournie.

Obtention du 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 code VB.net que j'utilise pour calculer la demande. J'ai supprimé 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 = "GET\n" & "mws.amazonservices.com\n" & "/\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
64
Kyle Ballard

Si Google atterrit ici après avoir commencé à utiliser une partie de la documentation Amazon, il est fort probable que l'erreur "demander une signature" soit générée ci-dessus en raison d'un espace laissé par inadvertance sur votre clé d'accès secrète. Vérifiez cela en premier!

141
Andrew

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

24
Nick Rogers

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

au lieu de test/foo/bar j'avais/test/foo/bar pour le nom de mon seau.

19
Jason H

La solution consistait à générer une nouvelle clé d'accès. Mon premier AWSSecretKey avait des barres obliques finales qui étaient probablement à l'origine du problème, alors que la nouvelle ne comportait aucune barre oblique et fonctionnait.

18
Joao Leme

J'ai trouvé cela parce que je ne faisais pas l'encodage d'URL - il semble que cette erreur soit renvoyée si l'un des paramètres transmis est invalide - cela n'a peut-être rien à voir avec la clé d'accès.

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

Appeler la pile 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
Thierry_S

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", mais "AssociatedTag" après "AWSAccessId". 

2
dechimp

Je recevais le même message 'calculé ne correspond pas' quand mon erreur était liée à la configuration de mes rôles

Vérifiez vos rôles, stratégies et configuration CORS pour votre compartiment afin de vous assurer que vous êtes autorisé à 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');

lors du téléchargement de l'image.

Il me manquait la permission "s3: PutObjectAcl" dans mon utilisateur Iam associé. 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
Tom22

Cela se produit également lorsque nous essayons de télécharger un fichier de zéro octet. J'ai ouvert un bug ici aujourd'hui.

1
vikas027

J'ai rencontré le même message d'erreur lors de l'utilisation de 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 codée en URL

1
cdeutsch

Le mien était parce que j'avais copié les variables d'environnement de quelqu'un mais que celui-ci avait juste un texte fictif. Hah!

1
Elijah Murray

Vérifiez les en-têtes de votre demande. Dans mon cas, j'envoyais un en-tête supplémentaire à partir du code que j'ai copié (comme un noob) et contenant

Host: localhost:8080
0
Ordiel

PHP: J'ai eu un problème avec l'ajout d'un "/" pour désigner un dossier dans s3, mais je l'ai ajouté au nom du seau. Il semble que la commande PUTOBJECT de aws-package ait remplacé "/" par "% 2F" sha256 calcul de la demande telle qu'elle pourrait paraître:
awsbucket% 2Folder/filename
mais il a probablement fait un pré-calcul du sha avec:
awsbucket/folder/filename

La solution consistait à pré-ajouter le nom du dossier au nom du fichier.

de:
awsbucket/dossier
nom de fichier
à:
awsbucket
dossier/nom de fichier

0
Kkloe

J'ai rencontré ce problème en utilisant .net core 2.1.300-preview1 aussi. Mettre à jour à 2.1.300-rc1 était la solution.

0
Jonathan DeMarks

J'ai eu la même erreur avec un appel SubmitFeed et après plusieurs heures de débogage, il s'est avéré que CURL a transformé ma demandePOSTen une requêtePUTqui a invalidé ma signature.

Cela a beaucoup aidé de définir CURLINFO_HEADER_OUT à 1 via curl_setopt (), alors un appel ultérieur à curl_getinfo () a déclaré que ma demande était une demande PUT.

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

curl_setopt(CURLINFO_HEADER_OUT, 'POST');

(ouGET, selon self :: REQUEST_TYPE). Faire la même chose dans ma propre requête CURL a transformé la requête de PUT en POST, ma signature hachée est donc à nouveau intacte.

0
Anse

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

La fonction scandir() a renvoyé . et .. en tant que deux premiers index du tableau. Après avoir ajouté une instruction conditionnelle afin de s’assurer qu’il ne crée pas de fichier pour cela, cela a fonctionné.

0
user4097807

Nous le recevions sur un serveur Web, mais pas dans une application de console utilisant une ancienne version du kit de développement logiciel AWS C # (1.5.10.0). Une fois que nous avons mis à jour le plus récent, il est parti.

0
Zach Wymer

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

  • IAM, utilisateurs, gérer les clés d'accès, créer une clé d'accès
  • Ok, copiez la clé rapidement! C'est ta seule chance. :)
0
tresf

J'ai rencontré ce problème quand j'ai eu une mauvaise URL (cela m'a parfois donné cette erreur, et parfois il a été dit que la clé était introuvable, ce qui implique une erreur 404). Ces URL sont sensibles à la casse, alors assurez-vous d'être exact. J'avais ".jpg" dans mon URL et j'avais besoin de ".JPG"

0
Pstrazzulla

J'utilisais Ruby's aws-sdk v1 et j'avais cette erreur parce que je spécifiais le content type lors de l'appel de url_for, à la suite de cet exemple sur la documentation . Supprimer le paramètre content_type sur le url_for appelé a résolu le problème pour moi.

0
Tomas Romero

Après beaucoup de difficultés, j'ai utilisé le constructeur putObject pour télécharger le fichier au lieu de inputstream et cela a fonctionné. Je ne sais pas ce qui n'allait pas.

0
karthik

J'ai rencontré le même problème en utilisant la commande curl pour télécharger un fichier de zéro octet dans une URL présignée S3.

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

0
guile chao