2013-10-30 136 views
5

我試圖讓一些代碼工作從S3使用REST API通過C#獲取文件。我看到其他人做類似的事情,但由於某種原因,我不斷收到403錯誤。我試圖用.Net的AWS SDK做同樣的事情,因此我認爲這是我創建授權標題的方式。亞馬遜S3 REST API 403錯誤c#

任何人都可以擺脫這個問題嗎?

string awsAccessId = "***"; 
string awsSecretKey = "***"; 
string bucketName = "thebucket"; 

string httpDate = DateTime.Now.ToString("ddd, dd MMM yyyy HH:mm:ss +0000\n"); 
       string canonicalString = "GET\n" 
             + "\n" 
             + "\n" 
             + "x-amz-date:" + httpDate + "\n" 
             + "/" + bucketName + "/readme.txt"; 

       // now encode the canonical string 
       Encoding ae = new UTF8Encoding(); 
       // create a hashing object 
       HMACSHA1 signature = new HMACSHA1(); 
       // secretId is the hash key 
       signature.Key = ae.GetBytes(awsSecretKey); 
       byte[] bytes = ae.GetBytes(canonicalString); 
       byte[] moreBytes = signature.ComputeHash(bytes); 
       // convert the hash byte array into a base64 encoding 
       string encodedCanonical = Convert.ToBase64String(moreBytes); 

       // Send the request 
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://" + bucketName +".s3.amazonaws.com/readme.txt"); 
       request.Headers.Add("x-amz-date", httpDate); 
       request.Headers.Add("Authorization", "AWS " + awsAccessId + ":" + encodedCanonical); 
       request.Method = "GET"; 

       // Get the response 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       Console.WriteLine(response.StatusCode); 
       Console.Read(); 
+0

爲什麼不使用sdk如果它工作? –

+0

我希望將它放入SSIS腳本任務 – MarkJ

回答

1

我不知道這是否是唯一的問題,但它看起來像一個明確的問題:

+ "x-amz-date:" + httpDate + "\n" 

x-amz-date是取代了日期的標題:標題在HTTP請求本身,而是在字符串中籤,你只要把日期,無「X-AMZ-日期:」或任何在它前面,根據例子:

GET\n 
\n 
\n 
Tue, 27 Mar 2007 19:36:42 +0000\n 
/johnsmith/photos/puppy.jpg 

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationRequestCanonicalization

只有一個正確的簽名可以爲請求生成。 S3將生成該簽名,並將其與您發送的簽名進行比較,因此在字符串到符號中沒有單個字節的空間出現錯誤。

+0

感謝您的建議。我做了修改,但不幸的是它仍然不起作用。 – MarkJ

+0

403消息是否返回了一個錯誤,該錯誤給了您要簽名的字符串並告訴您簽名不匹配,或者沒有?錯誤說的是什麼? (在響應正文中) –

+0

錯誤消息指出簽名不匹配:SignatureDoesNotMatch我們計算的請求籤名與您提供的簽名不匹配。檢查你的密鑰和簽名方法。 MarkJ

1

我測試了你的代碼,它的工作原理!你只需要額外的\ n加上改變http到https,你就完成了。

string stringToConvert = "GET\n" 
          + "\n" 
          + "\n" 
          + "\n" 
          + "x-amz-date:" + timeStamp + "\n" 
          + "/" + bucketName + "/" + FileName; 

亞馬遜Rest API沒有很好的文檔,缺乏示例會讓所有人轉而使用SDK。