2016-11-10 7 views
0

У меня есть сценарий для загрузки файла с AWS S3, и он работает с отдельного сервера вне AWS. Но когда я поместил этот скрипт в экземпляр EC2 и попробовал его, он возвращает ошибку «SignatureDoesNotMatch». Подписанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи ».Загрузить файл AWS S3 из экземпляра EC2

Но он работает на другом сервере. Эк2 находится в том же регионе, что и хост s3. Я предполагаю, что это имеет какое-то отношение к хосту. Я пробовал этот хост/url, но он возвращает ту же ошибку.

Любой, кто может загружать файлы s3 из ec2 с помощью curl? Мне нужно использовать только завиток. Пожалуйста, ответьте, если вы знаете, как это сделать через завиток. Благодарю.

https://s3-ap-southeast-1.amazonaws.com/ $ ведро/$ файл

https://s3.amazonaws.com/ $ ведро/$ файл

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 
+0

[Мы уже видели такой вопрос раньше] (http://stackoverflow.com/q/39921825/1695906), предположительно связанный с ошибкой в ​​OpenSSL, потому что он был разрешен путем обновления OpenSSL. К сожалению, старая версия не была идентифицирована, поэтому основная причина не была идентифицирована. Возможно, сравнение версий OpenSSL на этих двух машинах станет отправной точкой для вас. –

+0

Привет, Майкл, я просто попробовал более высокий opensl ver. Тот, который на серверах, которые вне aws и работал, имеет OpenSSL 1.0.1e-fips 11 февраля 2013 года, а затем теперь сервер aws имеет OpenSSL 1.0.2j 26 Sep 2016, но он все равно возвращает SignatureDoesNotMatch. Мне интересно, может ли это быть, я не использую правильный хост или URL? – sparkmix

+0

Кажется, мой выше код работает для centos. Я попробовал другой сервер ubuntu, и он не работает. Может быть, так или иначе строка для генерации подписи не обрабатывается должным образом для ubuntu. Я пробовал последнюю версию openssl, но, похоже, все еще не работает. – sparkmix

ответ

1

Вместо того, чтобы писать CURL команду, рассмотрите возможность использования AWS Command-Line Interface (CLI).

Он имеет команду aws s3 cp, которая может копировать содержимое в/из ковша Amazon S3 (и даже между ведрами).

+0

Привет. Я знаю, что есть другие варианты, но, как я уже говорил, мне нужно использовать завиток, поэтому я надеюсь получить ответ на то, что я спросил. Я использую автомасштабирование, поэтому у меня уже есть изображение, и для всех регионов будет создано много возможностей для настройки CLI. У меня есть шеф-повар, так что мне легче загружать некоторый код bash через кулинарию, чтобы запустить загрузку без обновления изображения. – sparkmix

+0

Пожалуйста, ответьте, если вы знаете, как это сделать через завиток, а не предлагать другие варианты. Благодарю. – sparkmix

0

Попробуйте это ...

#!/bin/sh 
S3_KEY='/file.txt' 
S3_SECRET_KEY='xxx' 
S3_ACCESS_KEY='AKIAxxx' 
S3_HOST=yourbucket.s3.amazonaws.com 

AMZ_DATE=$(date -u "+%Y%m%dT%H%M%SZ") 
DATE=$(/bin/echo ${AMZ_DATE} | cut -b 1-8) 
REGION=ap-southeast-1 
CANONICAL_REQUEST="GET\n${S3_KEY}\n\nhost:${S3_HOST}\nx-amz-content-sha256:UNSIGNED-PAYLOAD\nx-amz-date:${AMZ_DATE}\n\nhost;x-amz-content-sha256;x-amz-date\nUNSIGNED-PAYLOAD" 
STRING_TO_SIGN="AWS4-HMAC-SHA256\n${AMZ_DATE}\n${DATE}/${REGION}/s3/aws4_request\n$(/bin/echo -en ${CANONICAL_REQUEST} | sha256sum | cut -f 1 -d' ')" 

AWS_SIG_V4_AND_S3_SECRET_KEY=AWS4${S3_SECRET_KEY} 

DATE_HMAC_HEX=$(/bin/echo -n "${DATE}" | openssl sha256 -hmac "${AWS_SIG_V4_AND_S3_SECRET_KEY}" | cut -f 2 -d' ') 
DATE_HMAC_BIN=$(/bin/echo -n "${DATE_HMAC_HEX}" | xxd -r -p) 

REGION_HMAC_HEX=$(/bin/echo -n "${REGION}" | openssl sha256 -hmac "${DATE_HMAC_BIN}" | cut -f 2 -d' ') 
REGION_HMAC_BIN=$(/bin/echo -n "${REGION_HMAC_HEX}" | xxd -r -p) 

SERVICE_HMAC_HEX=$(/bin/echo -n "s3" | openssl sha256 -hmac "${REGION_HMAC_BIN}" | cut -f 2 -d' ') 
SERVICE_HMAC_BIN=$(/bin/echo -n "${SERVICE_HMAC_HEX}" | xxd -r -p) 

SIGNING_KEY_HEX=$(/bin/echo -n "aws4_request" | openssl sha256 -hmac "${SERVICE_HMAC_BIN}" | cut -f 2 -d' ') 
SIGNING_KEY_BIN=$(/bin/echo -n "${SIGNING_KEY_HEX}" | xxd -r -p) 


SIGNATURE_HEX=$(/bin/echo -ne "${STRING_TO_SIGN}" | openssl sha256 -hmac "${SIGNING_KEY_BIN}" | cut -f 2 -d' ') 

curl -vv https://${S3_HOST}/file.txt \ 
    -H "Host: ${S3_HOST}" \ 
    -H "x-amz-content-sha256: UNSIGNED-PAYLOAD" \ 
    -H "x-amz-date: ${AMZ_DATE}" \ 
    -H "Authorization: AWS4-HMAC-SHA256 Credential=${S3_ACCESS_KEY}/${DATE}/${REGION}/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=${SIGNATURE_HEX}" 

Это использование AWS Подпись V4. Я протестировал это, и он работает как на CentOS 7.3, так и на Ubuntu LTS 16.04 для моего ведра в регионе ap-south-1. Я бы очень предложил использовать предложение Джона Ротенштейна.

Смежные вопросы