【问题标题】:AWS4 Signing request signature does not match…even though it seems toAWS4 签名请求签名不匹配......即使它似乎
【发布时间】:2016-01-14 19:54:28
【问题描述】:

我似乎正确地遵循了生成规范字符串和字符串以签署 AWS4 开发工具包的过程。但是我收到错误 我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

我唯一的线索是,当我不使用 Moment.js utc() 调用时,它接受签名作为匹配项,但(如预期的那样)将签名视为已过期,所以我怀疑 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

【问题讨论】:

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


    【解决方案1】:

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

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

    添加这些并再试一次!

    编辑:如 cmets 所述,这似乎是规范字符串和要签名的字符串之间的日期格式错误。

    【讨论】:

    • 好的,我认为您在规范字符串中的行是错误的:x-amz-date:2016-01-14T19:56:12。将此更改为 x-amz-date:20160114T195612Z
    • 很好,对签名生成器进行了更改并在上面进行了更新。然而仍然是同样的错误。
    • 上面的格式好像还是不对。您需要使用与字符串中相同的日期格式进行签名。
    • 啊有趣!......只是注意到UTC过程确实以不同的方式格式化这些日期之一。好吧,让我进一步调查一下。假设不再出现奇怪的情况,会回来接受您的回答。
    • 不幸的是,即使进行了这些修复,我仍然遇到同样的错误。
    猜你喜欢
    • 2022-01-20
    • 2019-12-04
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多