Kesalahan Amazon S3 REST API 403 c#

Saya mencoba membuat beberapa kode berfungsi untuk mengambil file dari S3 menggunakan REST API melalui C#. Saya pernah melihat orang lain melakukan hal serupa tetapi karena alasan tertentu saya terus mendapatkan kesalahan 403. Saya sudah mencoba melakukan hal yang sama dengan AWS SDK for .Net dan berhasil, jadi saya berasumsi itulah cara saya membuat header otorisasi.

Adakah yang bisa menjelaskan hal ini?

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();

person MarkJ    schedule 30.10.2013    source sumber
comment
Mengapa tidak menggunakan SDK jika berhasil?   -  person Oskar Kjellin    schedule 30.10.2013
comment
Saya berharap untuk memasukkannya ke dalam tugas skrip SSIS   -  person MarkJ    schedule 31.10.2013


Jawaban (2)


Saya menguji kode Anda, berhasil! Anda hanya perlu \n tambahan plus mengubah http menjadi https dan selesai.

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

Amazon Rest API tidak memiliki dokumentasi yang baik, kurangnya contoh membuat semua orang beralih ke SDK.

person Celso Dias Catarino Neto    schedule 02.10.2014

Saya tidak tahu apakah ini satu-satunya masalah, namun tampaknya ini merupakan masalah yang pasti:

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

x-amz-date adalah header yang menggantikan header Date: dalam permintaan HTTP itu sendiri, tetapi dalam string yang akan ditandatangani, Anda cukup memasukkan tanggal, tanpa "x-amz-date:" atau apa pun di depannya, sesuai dengan contoh:

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

Hanya ada satu tanda tangan yang benar yang dapat dihasilkan untuk suatu permintaan. S3 akan menghasilkan tanda tangan itu, dan membandingkannya dengan yang Anda kirim, jadi tidak ada satu byte pun ruang untuk kesalahan dalam string-to-sign.

person Michael - sqlbot    schedule 31.10.2013
comment
Terima kasih atas saran Anda. Saya sudah melakukan modifikasi tetapi sayangnya masih tidak berhasil. - person MarkJ; 31.10.2013
comment
Apakah pesan 403 mengembalikan kesalahan yang memberi Anda string untuk ditandatangani dan memberi tahu Anda bahwa tanda tangan tidak cocok, atau tidak? Apa isi kesalahannya? (di badan respons) - person Michael - sqlbot; 31.10.2013
comment
Pesan kesalahan menyatakan bahwa tanda tangan tidak cocok: ‹Error›‹Code›SignatureDoesNotMatch‹/Code›‹Message›Tanda tangan permintaan yang kami hitung tidak cocok dengan tanda tangan yang Anda berikan. Periksa kunci dan metode penandatanganan Anda.‹/Pesan› - person MarkJ; 31.10.2013