Amazon MWS - вычисленная подпись запроса не соответствует предоставленной подписи


получение следующего сообщения об ошибке от 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>

вот VB.net код, который я использую для расчета запроса. Я удалил SecretKey и AWSAccessKeyId по соображениям безопасности.

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 60

22 ответа:

Если вы приземляетесь здесь из Google после начала работы с некоторой документацией Amazon, вполне вероятно, что вы видите ошибку "подпись запроса" выше из-за непреднамеренного ведущего или конечного пространства на вашем секретном ключе доступа. Сначала проверь это!

по моему опыту, эта ошибка просто означает "один из ваших параметров-это не так, удачи в поисках!"Я столкнулся с этой ошибкой, используя S3 SDK. Я пытался загрузить файл, но я ошибочно указал полный путь к файлу ("C:\Users\addaone\image.png") в качестве ключа, а не только имя файла.

Я столкнулся с этой проблемой. Для меня это потому, что я случайно поставил / перед своим именем ведра.

вместо test/foo /bar у меня был/test/foo / bar для моего имени ведра.

решение состояло в том, чтобы создать новый ключ доступа. У моего первого AWSSecretKey были длинные косые черты на нем, которые, вероятно, вызывали проблему, в то время как новый не имел никаких прямых косых черт и работал.

Я нашел это, потому что я не делал кодировку URL - кажется, эта ошибка возвращается, если какой - либо из переданных параметров недействителен-это может не иметь ничего общего с ключом доступа.

аналогичный ответ Андрею (принятый ответ), но мои конечные пробелы были не на ключах, а на метаданных для загрузки 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!
}           

стек здесь:

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

другая вещь, чтобы проверить, что все параметры должны быть отсортированы по значению ASCII. "AWSAccessKeyId" параметр должен предшествовать "рынке", однако "AssociatedTag" должно идти после "AWSAccessId".

Это также встречается, когда мы пытаемся загрузить файл с нулевым байтом. Я открыл ошибку здесь сегодня.

я получал то же самое сообщение "вычислено не соответствует", когда моя ошибка была связана с тем, как мои роли были настроены

Проверьте свои роли, политики и конфигурацию CORS для вашего ведра, чтобы убедиться, что у вас есть разрешение на использование заголовков, которые вы используете.

В моем случае, я был в том числе

ACL: 'public-read' 

параметр в подписании ведра, а также

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

при загрузке изображения.

я пропустил "s3:PutObjectAcl", разрешение в моем связанном пользователе Iam. Вот политика, которая сработала.

{
  "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"
                ]
            }
        }
    }
  ]
}

мой был потому, что я скопировал переменные среды от кого-то, но у них просто был текст заполнителя. Ха!

Я столкнулся с этой проблемой, когда у меня был неправильный URL (иногда он давал мне эту ошибку, а иногда он говорил, что ключ не может быть найден, подразумевая ошибку 404). Эти URL-адреса чувствительны к регистру, поэтому убедитесь, что вы точно. У меня было ".jpg" в моем URL, и нужно".JPG"

Я просто столкнулся с этой ошибкой. Я использую PHP и побежал scandir() в моем каталоге с моими файлами.

The вернулся . и .. как первые два индекса массива. После добавления условного оператора, чтобы убедиться, что он не создает файл для них, он работал.

эта проблема может возникнуть для пользователей, которые разместили "пароль" пользователя IAM в CLI вместо "закрытого ключа доступа". Где находится "закрытый ключ доступа" вы можете спросить? Вы не можете получить его, но вы можете создать новый через:

  • IAM, пользователи, управление ключами доступа, создать ключ доступа
  • ОК, скопируйте ключ быстро! Это ваш единственный шанс. :)

Я получил ту же ошибку с вызовом SubmitFeed, и после нескольких часов отладки оказалось, что CURL превратил мой POST запрос в поставить запрос, который сделал мою подпись недействительной.

это очень помогло установить CURLINFO_HEADER_OUT в 1 через curl_setopt (), поэтому более поздний вызов curl_getinfo () сказал, что мой запрос был запросом PUT.

поэтому я сравнил параметры CURL в библиотеке PHP Amazon с тем, что я сделал через curl_setopt () и tataa: the Библиотека Amazon PHP делает это:

curl_setopt(CURLINFO_HEADER_OUT, 'POST');

(или GET, в зависимости от self:: REQUEST_TYPE). Так же по моей личной просьбе завиток получился просьбу поставить на пост, так что мой хэш-подпись была снова цела.

я столкнулся с той же проблемой, используя curl команда для загрузки файла с нулевым байтом в S3 presigned url.

Я нашел, когда удалить заголовок -H 'Content-Type: application/octet-stream' затем может работать.

Я использовал Руби aws-sdk v1 и я получал эту ошибку, потому что я указывал content type при вызове url_for после этот пример на docs. Удаление на url_for called решил проблему для меня.

мы получали это на веб-сервере, но не в консольном приложении, используя старую версию AWS C# SDK (1.5.10.0). Как только мы обновились до самого последнего, он ушел.

Проверьте заголовки запросов, в моем случае я отправлял что-то дополнительный заголовок формы код, который я копирую вставил (как noob) содержащий:

HOST: localhost:8080

после долгой борьбы я использовал конструктор putObject для загрузки файла вместо inputstream, и это сработало. Не уверен, что был неправ.

PHP: у меня была проблема, что при добавлении " / "для обозначения папки в s3 я добавлял ее к имени корзины, похоже, команда PUTOBJECT aws-package заменила" / "на" %2F", поэтому она не смогла вычислить sha256 запроса, как это могло выглядеть:
awsbucket%2Ffolder / filename
но он, вероятно, сделал предварительный расчет sha с:
awsbucket / folder / filename

решение состояло в том, чтобы предварительно добавить имя папки в имя файла вместо.

от:
awsbucket / папка
имя файла
к:
awsbucket
папка / имя файла

я столкнулся с этой проблемой с помощью .net core 2.1.300-preview1 Как хорошо. Обновление до 2.1.300-rc1 было решением.

Я столкнулся с тем же сообщением об ошибке при использовании WebClient для загрузки файла на url-адрес Amazon 3S. Я написал об этом здесь: http://blog.cdeutsch.com/2010/11/net-webclient-403-forbidden-error.html

окончательное решение я нашел здесь: получение URL с URL-кодированной косой чертой