【问题标题】:Why AWS4 Signature Does Not Match?为什么 AWS4 签名不匹配?
【发布时间】:2019-12-04 12:08:41
【问题描述】:

我正在使用 AWS4 生成签名并传入请求标头。生成的签名未得到验证。

const opts = {
        service: 's3',
        region: 'region-name',
        method: 'GET',
        host: 's3-{region-name}.amazonaws.com',
        path: '/',
    };

我正在使用以下代码来生成签名

   var signature =  aws4.sign(opts, {
      accessKeyId: 'XXXXXX',
      secretAccessKey: 'XXXXXXXXXXXXXXXXXXXX',
    });

并更新 AutoUpdater(某些模块)的请求标头,最终到达 aws。

autoUpdater.requestHeaders = signature.headers;

以错误消息结束

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

有什么建议可以解决这个问题吗?

【问题讨论】:

  • 最可能的解释是您使用的参数与您请求中的实际参数不匹配。没有对不一致的容忍。请求真的是路径/吗?如果是这样,那就是 List Objects 请求,而您没有提及您实际提出的请求类型。
  • 刚刚遇到同样的问题@SteadyReader - 你解决了吗?
  • @JTInfinite - 还没有。无法解决它。所以,仍然在我的技术停车区。

标签: amazon-web-services amazon-s3 electron-updater


【解决方案1】:

试试这个:

request(aws4.sign({
hostname: 'test.amazonAPI.com',
service: 'execute-api',
region: 'us-east-1',
method: 'POST',
url: 'https://test.amazonAPI.com/test/doThing', // this field is not 
recommended in the document.
  body: load
 },
{
accessKeyId: tempCreds.Credentials.AccessKeyId,
secretAccessKey: tempCreds.Credentials.SecretAccessKey,
sessionToken: tempCreds.Credentials.SessionToken
}))

【讨论】:

    【解决方案2】:

    计算签名

    1.使用 UTF-8 编码创建策略。

    2.将 UTF-8 编码的策略转换为 Base64。结果是要签名的字符串。

    3.将签名创建为要签名的字符串的 HMAC-SHA256 哈希。您将提供签名密钥作为散列函数的密钥。

    4.使用十六进制编码对签名进行编码。

    希望这会有所帮助。

    谢谢 穆克什

    【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多