【问题标题】:SignatureDoesNotMatch - Amazon S3 APISignatureDoesNotMatch - Amazon S3 API
【发布时间】:2012-05-04 02:59:09
【问题描述】:

我正在为 Amazon S3 和 CloudFront 使用 PHP 类 - Link。但是当我尝试将文件上传到存储桶时,我收到了这个错误:

[SignatureDoesNotMatch] 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

如何解决?

谢谢。

【问题讨论】:

    标签: php file-upload upload amazon-s3 amazon


    【解决方案1】:

    当您注册 Amazon 时,您可以为自己创建一个密钥对(Amazon 将这些密钥称为访问密钥 ID 和秘密访问密钥)。

    这两个用于签署对亚马逊网络服务的请求。亚马逊会重新计算签名并比较它是否与您请求中包含的签名匹配。这样,秘密访问密钥就不需要通过网络传输。

    如果您收到“签名不匹配”,很可能您使用了错误的秘密访问密钥。您能否再次检查访问密钥和秘密访问密钥以确保它们正确无误?

    【讨论】:

    • 在我的情况下,配置文件/设置中有一些额外的空格,其中包含密钥,因此它在“密码”中传输了一个额外的 tab 字符,从而使签名无效。
    • 我遇到了同样的问题。结果发现我使用的调试工具在签名指定 POST 时错误地发送了 GET 请求。这让我开始思考我的签名编码有问题。愚蠢的错误几乎花了一天的时间反复试验。
    【解决方案2】:

    我个人收到此错误是因为我的元数据中的字符。

    有问题的字符是“-”字符,它在 unicode 中是“\u2013”​​,与“-”不同。

    $result = $s3->putObject(array(
        'Bucket'       => $bucket,
        'Key'          => $keyname,
        'Metadata' => [
            'name' => 'Terminology – Blah'
        ]
    ));
    

    来自文档的注释 http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#UserMetadata...

    Amazon S3 以小写形式存储用户定义的元数据。每个名称,值 pair 在使用 REST 时必须符合 US-ASCII,在使用时必须符合 UTF-8 通过 POST 进行 SOAP 或基于浏览器的上传。

    【讨论】:

    • 同上 - 将带有键 'Cache-Control' 的元数据添加到已经具有元数据键 'cache-control' 的对象上时,出现此错误。
    【解决方案3】:

    在指定以斜杠字符 (/) 开头的 Key 时,putObject() 出现此错误 - 删除斜杠后它工作正常。

    【讨论】:

      【解决方案4】:

      AWS返回这个错误的原因通常是secret key不正确

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 2021-12-04
        • 1970-01-01
        • 2019-05-15
        • 2015-04-29
        • 2014-07-14
        • 1970-01-01
        相关资源
        最近更新 更多