3

我要编写一个程序,可以通过身份验证从 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

网址是

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>

有谁可以告诉我如何处理它?非常感谢

4

2 回答 2

2

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

我遇到的具体问题以及针对它们的修复包括:

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

当然,最简单的事情是使用别人的库来发出请求,但这样做有什么乐趣呢?祝你调试好运。

于 2012-12-20T15:35:39.433 回答
1

这很可能是参数顺序:在组装签名版本 2 字符串时,亚马逊文档在最后一步指定:

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

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

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

于 2013-10-08T11:14:38.653 回答