7

我正在爲salesforce開發代碼。我們正在使用來自Appexchange的'Force.com for Amazon Web Services'應用程序。該應用程序由亞馬遜提供。Amazon S3:奇怪的錯誤 - '有時'SignatureDoesNotMatch,有時它確實

我正在從機器上的Amazon S3下載文件。

有時我得到下面提到的錯誤。有趣的是,只有有時候我會得到這個錯誤,其餘的時間,甚至是同一個文件。

<Error> 
<Code>SignatureDoesNotMatch</Code> 
<Message> 
The request signature we calculated does not match the signature you provided. Check your key and signing method. 
</Message> 

我嘗試使用由亞馬遜提供的兩種URL模式。鏈接生成後,過期時間設置爲1小時,因此可能不成問題。

URL1:- http://adminportal.s3.amazonaws.com/sample.pdf?AWSAccessKeyId=AKIAIRUZSRRCVSLXZCIA&Expires=1372653478&Signature=RvMJ1gJL+qNKmnRkqzuytmlUTGQ= 
URL2:- http://s3.amazonaws.com/adminportal/sample.pdf?AWSAccessKeyId=AKIAIRUZSRRCVSLXZCIA&Expires=1372658253&Signature=%2FmI0m0PTlHJpJ%2FP5d%2FX3OApqzcI%3D 

該簽名是由亞馬遜提供的類生成的,我猜它必須在所有時間都運行良好。

有人可以詳細說明爲什麼S3有時只會給出這個錯誤嗎?

回答

10

最後我能解決這個問題,這裏是怎麼回事?

用於在Amazon S3文件樣品URL是 -

http://adminportal.s3.amazonaws.com/sample.pdf?AWSAccessKeyId=AKIAIRUZSRRCVSLXZCIA&Expires=1372653478&Signature=RvMJ1gJL+qNKmnRkqzuytmlUTGQ= 

在這裏是由亞馬遜提供的類生成的簽名。

由於未知原因,'Force.com for Amazon Web Services'應用程序正在生成包含SPACES的簽名。

E.g.在給定的URL中,空格被替換爲'+'。

要擺脫這個問題,只需對URL進行URL編碼即可。編碼將取代具有特殊字符的空格,問題將得到解決。

+1

你救了我的一天! – Raeesaa

+1

你的意思是'+'會被一些特殊的字符所取代。我有這樣的代碼: 'var signature = crypto.createHmac('sha1',AWS_SECRET_KEY).update(put_request).digest('base64');' 'signature = encodeURIComponent(signature.trim());' ' 'signature'= signature.replace('%2B','+');' 最後一行應該是'signature = signature.replace('+','%2B');'還是應該刪除? – vinit

+0

我在問你,因爲它很難重新創建測試用例,所以想從你那裏確認。 – vinit

0

您使用的是Java SDK嗎?哪個版本?

我認爲版本1.4.4中引入了一個錯誤,並且已在最新版本中修復。一旦我升級到buggy版本,我在使用SQS時遇到間歇性簽名問題,並且在AWS論壇上看到一些人報告與DynamoDB完全相同的問題。現在我升級到版本1.4.7,該錯誤消失了。

也許你看到相同的錯誤!

+0

我正在Salesforce平臺上進行開發。所以這與Java事情沒有關係。 –

+0

我有同樣的問題懷特呃java驅動程序。我可以設置兩個幾乎相同的測試,一個工作,而另一個不在同一臺服務器上。 –