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
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!
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.
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.
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é.
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.
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
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".
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"
]
}
}
}
]
}
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!
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 "
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é.
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. :)
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.
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.
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.
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.
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
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.
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
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.
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