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 = "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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

Еще одна вещь, которую нужно проверить, - это то, что каждый из ваших параметров, вероятно, нужно отсортировать по значению ASCII. Параметр "AWSAccessKeyId" должен появиться перед "Marketplace", однако "AssociatedTag" должен появиться после "AWSAccessId".

Ответ 8

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

Ответ 9

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

Проверьте свои роли, политики и конфигурацию 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"
                ]
            }
        }
    }
  ]
}

Ответ 10

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

Ответ 11

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

Ответ 12

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

Функция scandir() возвратила . и .. в качестве первых двух индексов массива. После добавления условного оператора, чтобы он не создавал файл для них, он работал.

Ответ 13

Эта проблема может возникнуть для пользователей, которые поместили пользователя IAM "Пароль" в CLI вместо "Private Access Key". Где "Частный ключ доступа" вы можете спросить? Вы не можете его восстановить, но вы можете создать новый с помощью:

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

Ответ 14

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

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

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

curl_setopt(CURLINFO_HEADER_OUT, 'POST');

(или GET, в зависимости от self:: REQUEST_TYPE). Выполнение этого же запроса в моем собственном запросе CURL передало запрос с PUT на POST, поэтому моя хешированная подпись снова была повреждена.

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

HOST: localhost:8080

Ответ 19

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

Ответ 20

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

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

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

Ответ 21

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

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