如何为Amazon SQS生成查询URL

时间:2012-04-02 01:15:41

标签: amazon-web-services amazon-sqs

我打算写一个程序可以通过身份验证发布和读取来自SQS的消息,我从这里读取了文档 链接:Query Request Authentication

我已成功编写了一个将文件发送到指定队列的进程。但是当我尝试从队列接收消息时,我总是得到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

,网址是

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 个答案:

答案 0 :(得分:2)

错误消息告诉您错误地计算了签名。这很难调试。我第一次尝试时花了几个小时。在http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/MakingRequests_MakingQueryRequestsArticle.html签署了一个SQS请求示例。您应该将这些参数放在程序中,计算签名,并尝试在程序中查找错误,创建相同的签名。

我遇到的具体问题及其修复包括:

  • 正确排序查询参数。创建要签名的字符串时,它们必须按升序排列。您的示例网址不会按顺序显示它们。在创建要签名的字符串时,您是否对它们进行了不同的排序?
  • URI编码正确。每个参数都必须在要编号的字符串中进行URI编码。您的示例网址确实具有URI编码,因此这可能不是您的问题。但请确保您不是双重编码。
  • 填充base64签名。至少有一些AWS服务坚持认证签名是四个字符长的倍数。 base64编码的三分之二时间太短,需要附加一个或两个相等的符号。大多数base64编码库都是为您完成的,但不是全部。

当然,最简单的方法是使用其他人的库来提出请求,但有什么好处呢?祝你好好调试一下。

答案 1 :(得分:1)

最有可能是参数顺序:在汇编签名版本2字符串时,在亚马逊文档的最后一步指定:

  

添加查询字符串组件(名称 - 值对,不包括   最初的问号(?)为UTF-8字符,即URL   根据RFC 3986编码(十六进制字符必须是大写的)和   使用字典字节顺序排序。字典字节排序   区分大小写。

我花了两天时间通过检查我的HMAC,BASE64和URL编码程序来调试同样的“SignatureDoesNotMatch”问题,这只是一个参数顺序问题。

文档应该更多地强调这个问题;如果您使用无序参数字符串(例如请求URL中的相同字符串,如文档示例中所示),您将从服务器获得此非直观错误。