2012-04-02 95 views
3

我打算寫一個程序,可以從SQS與認證發佈和閱讀郵件,我已經在這裏閱讀文檔 鏈接:Query Request Authentication如何生成查詢網址亞馬遜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> 

有沒有人能告訴我如何我可以處理嗎?非常感謝

回答

2

錯誤消息告訴您簽名被計算錯誤。調試非常困難。第一次嘗試時,我花了數小時。有一個例子在http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/MakingRequests_MakingQueryRequestsArticle.html簽署了SQS請求。您應該將這些參數放入您的程序中,計算簽名,並嘗試在您的程序中發現錯誤以創建相同的簽名。

具體的問題我有,併爲他們修復包括:

  • 正確排序的查詢參數。創建要簽名的字符串時,它們必須按升序排列。您的示例網址不會按順序顯示它們。您是否在創建要簽名的字符串時對它們進行了分類?
  • URI編碼正確。每個參數都必須在要簽名的字符串中進行URI編碼。你的示例URL有URI編碼,所以這可能不是你的問題。但要確保你不是雙重編碼。
  • 填充base64簽名。至少有一些AWS服務堅持簽名是四個字符長的倍數。三分之二的時間base64編碼將會太短,並且需要附加一個或兩個等號。大多數base64編碼庫都是爲你做的,但不是全部。

當然,最簡單的事情就是用別人的圖書館來提出請求,但是有什麼好玩的呢?祝你好運調試。

1

這是最有可能的參數順序:組裝簽名版2字符串時,在最後一個步驟亞馬遜文檔指定:

Add the query string components (the name-value pairs, not including the initial question mark (?) as UTF-8 characters which are URL encoded per RFC 3986 (hexadecimal characters must be uppercased) and sorted using lexicographic byte ordering. Lexicographic byte ordering is case sensitive.

我花了兩天時間通過檢查調試此相同的「SignatureDoesNotMatch」問題我的HMAC,BASE64和URL編碼程序,這只是一個參數順序問題。

文檔應該更多地強調這個問題;如果您使用無序的參數字符串(例如請求URL中的同一個字符串,如文檔示例中的那些),您將從服務器獲得這種非直觀的錯誤。