2016-10-07 1 views
0

Я пытаюсь загрузить файл из своего хранилища s3 с помощью простого сценария bash, который я нашел в Интернете.Не удается получить файл из хранилища amazon s3 с помощью curl с строкой запроса requestauthentication

#!/bash/sh 

bucket='my_bucket_name' 
file_path='path_to_my_file' 
resource="/${bucket}/${file_path}" 
# set url time to expire 

expires=$(date +%s -d '4000 seconds') 
stringtoSign="GET\n\n\n${expires}\n${resource}" 
s3Key='s3Key_here' 
s3Secret='s3SecretKey_here' 

signature=`echo -en ${stringtoSign} | openssl sha1 -hmac ${s3Key} -binary | base64` 


curl -G https://${bucket}.s3.amazonaws.com/${file_path} \ 
    --data AWSAccessKeyId=${s3Key} \ 
    --data Expires=${expires}\ 
    --data-urlencode Signature=${signature} 

Как вы можете видеть здесь ничего особенного. Я хочу использовать вариант с запросом строки запроса.

Но он всегда отправляет мне сообщение об ошибке «403 Forbidden» с дополнительным сообщением - «Подписанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи». Ошибка в том, что сообщение об ошибке не помогло мне.

Я проверил полномочия с помощью библиотеки бото питона,

import boto 

from boto.s3.key import Key 


KEY_ID = 'key_id' 
SECRET_KEY_ID = 'secret_key' 
SOURCE_FILE_NAME = 'path_to_file' 
DEST_FILE_NAME = 'file' 
BUCKET_NAME = 'my_bucket_name' 

boto.set_stream_logger('boto') 
conn = boto.connect_s3(KEY_ID, SECRET_KEY_ID) 
bucket = conn.get_bucket(BUCKET_NAME) 

# Get the Key object of the given key, in the bucket 
k = Key(bucket, SOURCE_FILE_NAME) 

# Get the contents of the key into a file 
k.get_contents_to_filename(DEST_FILE_NAME) 

только что вошли две секретные ключи, которые я получил, имя ведра и путь к файлу и он работал на меня. Но это не то, что я ищу.

Конечно, я прочитал это docs и попытался следовать за ним. Моя переменная «stringtoSing» формируется правильным образом. Я просто не могу представить, где ошибка.

+1

Возможно, было бы намного проще использовать [aws cli] (http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html) 'aws s3 cp s3: // bucket/key local/file' –

ответ

0

Я установил все имена переменных в нужные места и обновил openssl до OpenSSL 1.0.2g 1 марта 2016. Теперь он работает.

+0

Также убедитесь, что ваш .sh-файл является исполняемым. –

0

Проблема заключается в следующем:

openssl sha1 -hmac ${s3Key} 

Вы не подпишете с ключом - вы подписываете с секретом.

openssl sha1 -hmac ${s3Secret} 
+0

Привет, Майкл, спасибо за ответ. Я копировал с помощью имени переменной во время написания этого сообщения. Во всяком случае, это ничего не меняет. Но что помогло мне **, это обновление openssl ** на моем ноутбуке. Теперь это работает. –

+0

Это странно, так как функция, которую вы используете в openssl, довольно примитивна. Вы помните старую версию, которую вы запускали? –

+0

К сожалению, я не помню. Но я могу проверить это завтра. Если это необходимо. –

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