AWS4签名请求签名不匹配......即使它似乎

时间:2016-01-14 19:54:28

标签: node.js amazon-web-services momentjs

我似乎已正确遵循生成规范字符串和字符串以签署AWS4 SDK的过程。但是我收到错误我们计算的请求签名与您提供的签名不匹配。检查您的AWS Secret Access Key和签名方法。有关详细信息,请参阅服务文档。

我唯一的线索是,当我没有使用Moment.js utc()调用时,它接受签名作为匹配但是(如预期的那样)将签名视为已过期,因此我怀疑UTC与当地时间与问题有关。

以下是我生成时间戳的代码。

var now = moment().utc();
var date_stamp = now.format('YYYYMMDD');
var amzn_date = now.format('YYYY-MM-DDTHH:mm:ssZ');
var string_to_sign_date = now.format('YYYYMMDDTHHmmssZ');

string_to_sign_date = string_to_sign_date.replace('+00:00', 'Z');
amzn_date = string_to_sign_date.replace('+00:00', 'Z');

这是我创建string_to_sign的地方:

var string_to_sign = connectMeRequest.algorithm + '\n' + string_to_sign_date + '\n' + credential_scope + '\n' + cryptoJS.SHA256(canonical_request);

这是我的(控制台记录)与亚马逊的签名。如果出现问题,我没有替换他们的JSON res中的换行符。

规范字符串的输出

  POST
/prod/makeEchoCallHandler

content-type:application/x-www-form-urlencoded
host:408wm9ltub.execute-api.us-west-2.amazonaws.com
x-amz-date:20160116T191451Z
x-amz-target:aws4_request

content-type;host;x-amz-date;x-amz-target
03a2c439264740e4883441d0049beaf9da4dc865ddd7169dbe9e747f28da6185

他们的输出:

 POST\n/prod/makeEchoCallHandler\n\ncontent-type:application/x-www-form-urlencoded\nhost:408wm9ltub.execute-api.us-west-2.amazonaws.com\nx-amz-date:20160116T191451Z\nx-amz-target:aws4_request\n\ncontent-type;host;x-amz-date;x-amz-target\n03a2c439264740e4883441d0049beaf9da4dc865ddd7169dbe9e747f28da6185

我的输出要签名的字符串

AWS4-HMAC-SHA256
20160116T191451Z
20160116/us-west-2/execute-api/aws4_request
ab63b72a190addcde39771097bbbc2e28c0d00c458fda9136d2d630e227e9074

他们的输出:

AWS4-HMAC-SHA256\n20160116T191451Z\n20160116/us-west-2/execute-api/aws4_request\nab63b72a190addcde39771097bbbc2e28c0d00c458fda9136d2d630e227e9074

1 个答案:

答案 0 :(得分:1)

' \ n'正式签署的字符串的一部分。您需要明确添加它。一个很好的例子是found here。重要的是:

StringToSign  =
Algorithm + '\n' +
RequestDate + '\n' +
CredentialScope + '\n' +
HashedCanonicalRequest

添加它们并再试一次!

编辑:如评论中所述,这看起来是规范字符串与要签名的字符串之间的日期格式错误。