Amazon MWS – запрошенная подпись запроса не соответствует предоставленной подписке

Получение следующего сообщения об ошибке из https://mws.amazonservices.com/ :

Sender SignatureDoesNotMatch −  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.  

Вот код 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("Click here") 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 

Если вы прилетаете сюда из 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» должен появиться перед «Marketplace», однако «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() в своем каталоге с моими файлами.

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

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

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

Я получил ту же ошибку с вызовом 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, поэтому моя хешированная подпись снова была неповрежденной.

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

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

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

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

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

 HOST: localhost:8080 

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

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

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

из:
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

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

  • Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource
  • Дружественные URL-адреса для ASP.NET
  • В ответ на вопрос, как добавить сообщение об ошибке в сводку проверки?
  • Использование маршрутизации ASP.NET для обслуживания статических файлов
  • Как установить заголовок Content-Type для запроса HttpClient?
  • При обработке отчета произошла ошибка. Отчеты -RLDC в ASP.NET MVC
  • HttpContext.Current.Session имеет значение null при запросах маршрутизации
  • Как реализовать сжатие GZip в ASP.NET?
  • Отправка SMS с веб-сайта ASP.NET
  • Прикрепить отладчик к экземпляру IIS
  • Как удалить returnurl из url?
  • Давайте будем гением компьютера.