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 请求