Я пытаюсь загрузить файл в S3 Bucket, используя следующий сценарий оболочки:
file=somefile.txt
bucket=some-bucket
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key=xxxxxxxxxxxxxxx
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://${bucket}.s3.amazonaws.com/${file}
Сценарий выше успешно загружает файл в корзину.Однако он не делает файл / объект общедоступным, поэтому при попытке загрузить файл с помощью wget https://some-bucket.s3.amazonaws.com/somefile.txt
происходит сбой.
Чтобы сделать объект / файл общедоступным, я попытался передать управление доступом acl="x-amz-acl:public-read"
во время загрузки (скрипт ниже):
file=somefile.txt
bucket=some-bucket
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue=`date -R`
acl="x-amz-acl:public-read"
stringToSign="PUT\n\n${contentType}\n${dateValue}\n$acl\n${resource}"
s3Key=xxxxxxxxxxxxxxxxxxxxxxxx
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "$acl" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://${bucket}.s3.amazonaws.com/${file}
Но, когда я выполняю этот скрипт, он не может загрузить файл на S3 и выдает следующую ошибку:
< ..Code>SignatureDoesNotMatch</ Code>
<..Message >The request signature we calculated does not match the signature you provided. Check your key and signing method.</ Message>
Что можетбыть проблемой?Что-то не так с тем, как я пытаюсь обеспечить контроль доступа в скрипте?