【发布时间】:2016-11-10 21:01:41
【问题描述】:
我有一个从 AWS S3 下载文件的脚本,它可以在 AWS 之外的单独服务器上运行。但是,当我将此脚本放在 EC2 实例上并尝试时,它会返回错误“SignatureDoesNotMatch - 我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。”
但它可以在其他服务器上运行。 ec2 与 s3 主机位于同一区域。估计跟楼主有关系。我尝试了这些主机/网址,但它返回相同的错误。
谁能用 curl 从 ec2 下载 s3 文件?我只需要使用 curl。如果您知道如何通过 curl 进行操作,请回答。谢谢。
https://s3-ap-southeast-1.amazonaws.com/$bucket/$file
https://s3.amazonaws.com/$bucket/$file
https://$bucket.s3-ap-southeast-1.amazonaws.com/$file
https://$bucket.s3.amazonaws.com/$file
#!/bin/sh
file="file-name"
bucket="bucket-name"
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`"
stringToSign="GET\n\n${contentType}\n${dateValue}\n${resource}"
s3Key="xxxxxxxxxxxxxxxxxx"
s3Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
signature=$(echo -en "${stringToSign}" | openssl sha1 -hmac "${s3Secret}" -binary | base64)
curl -H "Host: s3-ap-southeast-1.amazonaws.com" \
-H "Date: $dateValue" \
-H "Content-Type: $contentType" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://s3-ap-southeast-1.amazonaws.com/$bucket/$file -o $file
【问题讨论】:
-
We've seen a question here like this before,可能与 OpenSSL 中的一个错误有关,因为它已通过 OpenSSL 的升级解决。不幸的是,旧版本无法识别,因此从未确定根本原因。也许比较两台机器上的 OpenSSL 版本对您来说是一个起点。
-
嗨迈克尔,我刚刚尝试了更高版本的 openssl 版本。在 aws 之外工作的服务器中有 OpenSSL 1.0.1e-fips 2013 年 2 月 11 日,然后现在 aws 服务器有 OpenSSL 1.0.2j 2016 年 9 月 26 日,但它仍然返回 SignatureDoesNotMatch。我想知道是否可能是我没有使用正确的主机或网址?
-
看来我上面的代码可能适用于centos。我尝试了另一个 ubuntu 服务器,但它不起作用。也许不知何故,生成签名的行没有为 ubuntu 正确处理。我尝试了最新的 openssl 版本,但似乎仍然无法正常工作。
-
好奇心:把
#!/bin/sh改成#!/bin/bash。 -
ubuntu 使用与 centos 不同的回显 echo -en ${stringToSign } 从字面上打印出 dash space en space G E T slash n ...
标签: curl amazon-s3 amazon-ec2