I am developing code for salesforce. We are using 'Force.com for Amazon Web Services' App from Appexchange. The app is provided by Amazon.
I am downloading files from Amazon S3 on a machine.
Sometimes I am getting the below mentioned error. Interesting thing is, only sometimes I get this error, rest of the times it works, even for the same file.
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
I tried using both URL patterns provided by Amazon. Expires is set for 1hr after link generation, hence may not be an issue.
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
The signature is generated by class provided by Amazon, I guess it must work well all of the times.
Can someone elaborate why would S3 give this error only sometimes?
var signature = crypto.createHmac('sha1',AWS_SECRET_KEY).update(put_request).digest( 'base64');
signature = encodeURIComponent(signature.trim());
signature = signature.replace('%2B','+');
should the last line besignature = signature.replace('+', '%2B');
or should it be removed? – Clisthenes