ข้อผิดพลาด Amazon S3 REST API 403 c #

ฉันกำลังพยายามให้โค้ดทำงานเพื่อดึงไฟล์จาก S3 โดยใช้ REST API ผ่าน C# ฉันเคยเห็นคนอื่นทำสิ่งที่คล้ายกัน แต่ด้วยเหตุผลบางอย่าง ฉันยังคงได้รับข้อผิดพลาด 403 อยู่ ฉันได้พยายามทำสิ่งเดียวกันกับ AWS SDK สำหรับ .Net และใช้งานได้ ดังนั้นฉันคิดว่านี่เป็นวิธีที่ฉันสร้างส่วนหัวการอนุญาต

มีใครสามารถให้ความกระจ่างเกี่ยวกับเรื่องนี้ได้บ้าง?

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 แหล่งที่มา
comment
ทำไมไม่ใช้ sdk ถ้ามันใช้งานได้?   -  person Oskar Kjellin    schedule 30.10.2013
comment
ฉันหวังว่าจะนำไปไว้ในงานสคริปต์ SSIS   -  person MarkJ    schedule 31.10.2013


คำตอบ (2)


ฉันทดสอบรหัสของคุณแล้ว มันใช้งานได้! คุณเพียงแค่ต้องมี \n พิเศษบวกเปลี่ยน http เป็น https เท่านี้ก็เสร็จเรียบร้อย

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

Amazon Rest API ไม่มีเอกสารประกอบที่ดี การไม่มีตัวอย่างทำให้ทุกคนหันไปใช้ SDK แทน

person Celso Dias Catarino Neto    schedule 02.10.2014

ฉันไม่รู้ว่านี่เป็นปัญหาเท่านั้นหรือไม่ แต่ดูเหมือนว่าจะเป็นปัญหาที่แน่นอน:

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

x-amz-date เป็นส่วนหัวที่อยู่เหนือส่วนหัว Date: ในคำขอ HTTP เอง แต่ในสตริงที่จะลงนาม คุณเพียงแค่ใส่วันที่ โดยไม่มี "x-amz-date:" หรืออะไรก็ตามข้างหน้า ตามตัวอย่าง:

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 กำลังจะสร้างลายเซ็นนั้น และเปรียบเทียบกับลายเซ็นที่คุณส่ง ดังนั้นจึงไม่มีที่ว่างแม้แต่ไบต์เดียวสำหรับข้อผิดพลาดในสตริงที่จะเซ็นชื่อ

person Michael - sqlbot    schedule 31.10.2013
comment
ขอบคุณสำหรับข้อเสนอแนะของคุณ ฉันทำการแก้ไขแล้ว แต่น่าเสียดายที่ยังคงใช้งานไม่ได้ - person MarkJ; 31.10.2013
comment
ข้อความ 403 ส่งกลับข้อผิดพลาดที่ทำให้คุณต้องเซ็นชื่อและแจ้งให้คุณทราบว่าลายเซ็นไม่ตรงกันหรือไม่? ข้อผิดพลาดพูดว่าอย่างไร? (ในเนื้อความการตอบสนอง) - person Michael - sqlbot; 31.10.2013
comment
ข้อความแสดงข้อผิดพลาดระบุว่าลายเซ็นไม่ตรงกัน: ‹Error›‹Code›SignatureDoesNotMatch‹/Code›‹Message›ลายเซ็นคำขอที่เราคำนวณไม่ตรงกับลายเซ็นที่คุณระบุ ตรวจสอบกุญแจและวิธีการเซ็นชื่อของคุณ‹/ข้อความ› - person MarkJ; 31.10.2013