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
- Access-control-allow-origin с несколькими доменами
- Режим CustomErrors = "Off"
- Почему веб-формы ASP.NET нуждаются в атрибуте Runat = «Server»?
- Вызов ASP.NET PageMethod / WebMethod с помощью jQuery - возвращает всю страницу
- Зачем использовать сторонний контейнер DI через встроенный контейнер ASP.NET Core DI?
- Как разбить String на несколько значений?
- Как разрешить загрузку .json-файла с помощью ASP.NET
- Как создать thead и tbody в таблице ASP.NET?
- Использование скриптов на главной странице с помощью ASP.NET MVC
- Какова цель вопросительного знака после типа (например: int? MyVariable)?
- Тайм-аут сеанса в ASP.NET
- ИмяValueCollection для URL-запроса?
- Веб-приложение заблокировано при обработке другого веб-приложения при совместном использовании одного сеанса
Если вы прилетаете сюда из 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-адресом