2017-01-19 1 views
1

Я пытаюсь сделать запрос Http для amazon s3 (получить файл), но я получаю запрещенную ошибку.amazon s3 rest api error

Вот мой код:

string today = DateTime.UtcNow.ToString("ddd,' 'dd' 'MMM' 'yyyy' 'HH':'mm':'ss' 'zz00", new System.Globalization.CultureInfo("en-US")); 
string bucket = "rethymno"; 
string path = "/aasdf.txt"; 
string stringToSign = "GET" + 
         "\n" + 
         "\n" + 
         "\n" + 
         today + "\n"+ 
         "/" + bucket + path; 

string AWSSecret = "xxx"; 
string AWSKey = "xxx"; 
Encoding ae = new UTF8Encoding(); 
HMACSHA1 signature = new HMACSHA1(ae.GetBytes(AWSSecret)); 
string encodedCanonical = Convert.ToBase64String(signature.ComputeHash(ae.GetBytes(stringToSign))); 
string authHeader = "AWS " + AWSKey + ":" + encodedCanonical; 
string url = "http://"+bucket+".s3.amazonaws.com"+path; 

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 

request.Headers.Add("Authorization", authHeader); 
request.Headers.Add("x-amz-date", today); 

HttpWebResponse res = request.GetResponse() as HttpWebResponse; 

любые предложения устранить эту проблему?

+0

Вы уверены, что ваше создание подписи правильно и что ваш секрет и ключ предоставляют доступ к ресурсу? Вы пробовали делать то, что делаете с [AWS CLI] (https://aws.amazon.com/cli/) или через [AWS SDK для .net] (https://aws.amazon.com/ СДК-для-нетто /)? – birryree

+0

Настоятельно рекомендуется использовать SDK, когда это возможно. SDK будут обрабатывать подписку на запрос. Это будет гораздо меньше подверженности ошибкам. – spg

+0

Я использовал SDK для тестирования, и все работало нормально. Я должен использовать rest api для моего решения. Есть ли примеры генерации подписи? Я искал документацию amazon, но я подошел к этому коду выше. – kostas

ответ

0

Вот как работает подпись: http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

Прочитайте шаги здесь: http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

Вещи, чтобы обратить внимание на: - подписание алгоритма (SHA1 или SHA256). Я не вижу в переданных вами заголовках - время на вашем компьютере. убедитесь, что время и tz верны или сбой подписи - запрос находится в канонической форме (происходит удаление/замена правой строки). Параметры сортируются - вы указываете версию подписи + вы используете правильную дату. см.: http://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html (не похоже, что вы делаете правильные вещи).

Как говорится в других комментариях: при выборе варианта используйте SDK или язык, который вы используете, найдите пример, в котором кто-то уже работает.

+0

Код выше - [Подпись Version 2] (http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html). На первый взгляд это выглядит довольно близко. Не все регионы поддерживают Sig V2, но для этого условия существует [конкретная ошибка] (http://stackoverflow.com/a/26538266/1695906). –

+0

все еще не может заставить его работать. я изменил код. Я бы оценил это, если бы вы могли взглянуть на самую новую запись. – kostas