SignatureDoesNotMatch - Amazon S3 API

Posted

技术标签:

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

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

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

如何解决?

谢谢。

【问题讨论】:

【参考方案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不正确

【讨论】:

以上是关于SignatureDoesNotMatch - Amazon S3 API的主要内容,如果未能解决你的问题,请参考以下文章

SignatureDoesNotMatch - Amazon S3 API

Java中PresignedURL的SignatureDoesNotMatch

Spark 写入 S3 V4 SignatureDoesNotMatch 错误

SignatureDoesNotMatch 错误使用 restTemplate 获取 S3 的 url 请求

致命错误:发生错误(SignatureDoesNotMatch)

当请求 url 包含“!”时,亚马逊产品广告 API 返回“SignatureDoesNotMatch”