Как создать URL-адрес запроса для Amazon SQS - PullRequest
3 голосов
/ 02 апреля 2012

Я собираюсь написать программу, которая может публиковать и читать сообщения из SQS с аутентификацией, и я прочитал документ отсюда Ссылка: Аутентификация запроса запроса

Я успешно написал процесс отправки сообщения в указанную очередь, за которым следует документ. Но я всегда получаю сообщение об ошибке 403 при попытке получить сообщение из очереди. И я обнаружил, что правила для сигнатурных строк различаются для методов POST и GET.

строка подписи:

GET\n
sqs.us-east-1.amazonaws.com\n
/<My Account Id>/<Queue Name>\n
AWSAccessKeyId=<My Access Key>
&Action=ReceiveMessage
&MaxNumberOfMessages=10
&VisibilityTimeout=600
&AttributeName=All
&Expires=2012-04-01T11%3A29%3A24Z
&SignatureMethod=HmacSHA1
&SignatureVersion=2
&Version=2011-10-01

и URL-адрес

https://sqs.us-east-1.amazonaws.com/<My Account Id>/<Queue Name>?
Action=ReceiveMessage
&MaxNumberOfMessages=10
&VisibilityTimeout=600&AttributeName=All
&Version=2011-10-01
&Expires=2012-04-01T11%3A29%3A24Z
&Signature=<BASE64 encoded HmacSHA1 digist with signature string and my security key>
&SignatureVersion=2
&SignatureMethod=HmacSHA1
&AWSAccessKeyId=<My Access Key>

И я всегда получаю ошибку 403:

<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2011-10-01/">
  <Error>
    <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>
    <Detail/>
  </Error>
  <RequestId>16f6e910-62e6-4259-8c09-0358b84cbe60</RequestId>
</ErrorResponse>

Кто-нибудь может сказать мне, как я могу справиться с этим? Большое спасибо

Ответы [ 2 ]

2 голосов
/ 20 декабря 2012

Сообщение об ошибке говорит о том, что подпись вычисляется неправильно.Это действительно сложно отладить.Я потратил на это часы в первый раз, когда попробовал.Есть пример подписанного запроса SQS на http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/MakingRequests_MakingQueryRequestsArticle.html. Вы должны поместить эти параметры в свою программу, рассчитать сигнатуру и попытаться найти ошибки в вашей программе, создающие ту же сигнатуру.

Конкретные проблемы, которые у меня были, иисправления для них включены:

  • Правильная сортировка параметров запроса.Они должны быть в порядке возрастания при создании строки для подписи.Ваш пример URL не показывает их по порядку.Вы сортировали их по-разному при создании строки для подписи?
  • Кодировка URI правильно.Каждый параметр должен быть в кодировке URI в строке для подписи.Ваш пример URL имеет кодировку URI, так что это, вероятно, не ваша проблема.Но убедитесь, что вы не используете двойное кодирование.
  • Заполнение подписи base64.По крайней мере, некоторые сервисы AWS требуют, чтобы длина подписи была кратна четырем символам.Две трети времени кодировка base64 будет слишком короткой, и к ней потребуется добавить один или два знака равенства.Большинство библиотек кодирования base64 делают это за вас, но не все.

Конечно, проще всего использовать чужую библиотеку для выполнения запросов, но что в этом интересного?Удачи в отладке.

1 голос
/ 08 октября 2013

Скорее всего, это порядок параметров: при сборке строки подписи версии 2 на последнем шаге в документации Amazon указывается:

Добавить компоненты строки запроса (пары имя-значение, не включая начальный вопросительный знак (?) в виде символов UTF-8, которые являются URL кодируется в соответствии с RFC 3986 (шестнадцатеричные символы должны быть в верхнем регистре) и отсортировано по лексикографическому порядку байтов. Лексикографический порядок байтов чувствителен к регистру.

Я потратил два дня на отладку этой же проблемы «SignatureDoesNotMatch», проверив мои процедуры кодирования HMAC, BASE64 и URL, и это была просто проблема порядка параметров.

Документация должна подчеркивать эту проблему больше; если вы используете неупорядоченные строки параметров (например, те же, что и в URL-адресе запроса, как в примерах документации), вы получите эту неинтуитивную ошибку с сервера.

...