Почему я получаю ошибку подписи с помощью этого скрипта развертывания AWS bash? - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь создать bash-скрипт для загрузки файлов в мою корзину s3.У меня возникают проблемы при создании правильной подписи.

Я получаю следующее сообщение об ошибке:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

Вот мой сценарий:

Спасибо за вашу помощь!

#!/usr/bin/env bash

#upload to S3 bucket
sourceFilePath="$1"
#file path at S3
folderPathAtS3="packages";
#S3 bucket region
region="eu-central-1"
#S3 bucket name
bucket="my-bucket-name";
#S3 HTTP Resource URL for your file
resource="/${bucket}/${folderPathAtS3}";
#set content type
contentType="gzip";
#get date as RFC 7231 format
dateValue="$(date +'%a, %d %b %Y %H:%M:%S %z')"
acl="x-amz-acl:private"
#String to generate signature
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${acl}\n${resource}";
#S3 key
s3Key="my-key";
#S3 secret
s3Secret="my-secret-code";
#Generate signature, Amazon re-calculates the signature and compares if it matches the one that was contained in your request. That way the secret access key never needs to be transmitted over the network.
signature=$(echo -en "${stringToSign}" | openssl sha1 -hmac ${s3Secret} -binary | base64);

#Curl to make PUT request.
curl -L -X PUT -T "${sourceFilePath}" \
 -H "Host: ${bucket}.${region}.amazonaws.com" \
 -H "Date: ${dateValue}" \
 -H "Content-Type: ${contentType}" \
 -H "$acl" \
 -H "Authorization: AWS ${s3Key}:${signature}" \
 https://s3.amazonaws.com/${bucket}/${folderPathAtS3}

1 Ответ

0 голосов
/ 08 мая 2019

Ваша подпись выглядит нормально, но ваш запрос неверен и, следовательно, не совпадает.

-H "Host: ${bucket}.${region}.amazonaws.com" \ неверно.

Правильное значение ${bucket}.s3 ${region}.amazonaws.com. Вы пропускаете s3. в имени хоста ... но даже если это правильно, это все равно неверноj, потому что ваш URL https://s3.amazonaws.com/${bucket}/... также включает в себя корзину, что означает, что ваше имя корзины неявно добавляется в начало ключа объекта потому что это появляется дважды.

Кроме того, https://s3.amazonaws.com - это us-east-1. Чтобы подключиться к правильному региону, ваш URL должен быть одним из следующих вариантов:

https://${region}.s3.amazonaws.com/${bucket}/${folderPathAtS3}

https://${bucket}.${region}.s3.amazonaws.com/${folderPathAtS3}

https://${bucket}.s3.amazonaws.com/${folderPathAtS3}

Используйте один из этих форматов и исключите -H "Host: ...", потому что тогда он будет избыточным.

Последний из трех форматов URL начнет работать только после того, как корзине будет больше нескольких минут или часов. S3 создает их автоматически, но это занимает некоторое время.

...