4

AWS ドキュメントSigning AWS requestsに示されている例に従って、C# で ListUsers 呼び出しを実行しようとしています。署名生成の最終段階まで到達しました (つまり、signature-4 request examplesで指定された署名付きリクエストを送信する準備が整いました)。しかし、以下に貼り付けたコードは、送信時に「不正なリクエスト」例外をスローしています。

 static void submitSignedRequest(string my_access_key, string my_secret_key, string signature, string curr_utc_date_string, string curr_utc_datetime_string)
    {
        string url = "https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&" +
                        "X-Amz-Credential=" + my_access_key + "/" + curr_utc_date_string + "/us-east-1/iam/aws4_request&X-Amz-Date=" + curr_utc_datetime_string +
                            "&X-Amz-SignedHeaders=content-type;host;x-amz-date&X-Amz-Signature=" + signature;
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = "POST";
        request.Host = "iam.amazonaws.com";
        request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
        WebHeaderCollection headers = (request as HttpWebRequest).Headers;


        headers.Add("Authorization", "AWS4-HMAC-SHA256 Credential=" + my_access_key +"/" + curr_utc_date_string + "/us-east-1/iam/aws4_request, " +
            "SignedHeaders=content-type;host;x-amz-date, Signature=" + signature);
        headers.Add("x-amz-date", curr_utc_datetime_string);

        HttpWebResponse response;
        try
        {
            response = request.GetResponse() as HttpWebResponse;
        }
        catch (Exception ex)
        {

            Console.WriteLine("Error Message:    " + ex.Message);
        }
    }

私が得る出力は次のとおりです。

Error Message:    The remote server returned an error: (400) Bad Request.

私がここで何をしているのか、誰かが私を助けることができますか?

編集:

私は最終的にこれを自分で解決しました。私はそれを以下に変換しなければなりませんでした。(答えはRDS用ですが、違いが何であるかは目に見えると思います)。

string url = "https://rds.us-west-1.amazonaws.com";
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

        //  ASCIIEncoding encoding = new ASCIIEncoding();
        string postData = "Action=DescribeDBInstances&Version=2013-09-09";
        byte[] data = Encoding.UTF8.GetBytes(postData);

        request.Method = "POST";
        request.Host = "rds.us-west-1.amazonaws.com";
        request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
        //  request.ContentLength = data.Length;

        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }

        WebHeaderCollection headers = (request as HttpWebRequest).Headers;

        request.Headers.Add("Authorization", "AWS4-HMAC-SHA256 Credential=" + my_access_key + "/" + curr_utc_date_string + "/us-west-1/rds/aws4_request, " +
            "SignedHeaders=content-type;host;x-amz-date, Signature=" + signature);
        request.Headers.Add("x-amz-date", curr_utc_datetime_string);
4

1 に答える 1

3

私がここで何をしているのか、誰かが私を助けることができますか?

おそらくですが、この作業をすべてスキップして、代わりにすべての AWS API インタラクションに優れたAWS SDK for .NETを使用することを強くお勧めします。 Amazon S3、Amazon EC2、DynamoDB など

  • 私は何年もの間、さまざまな環境であらゆる種類の言語を使用して AWS を使用してきましたが、AWSが提供している多数の SDKのいずれかの支援なしに API を使用することを気にしたことはありません。そのほとんどは高レベルを提供しますまず第一に、それぞれの言語からの API の操作をはるかに簡単にすることに加えて、ツールを使用します。

しかし、本当に必要な場合、または自分でやりたい場合は、 AWS SDK for .NET用のものを含め、すべてGitHubで入手できるこれらの SDK のソース コードを簡単に確認することをお勧めします。たとえば、 AWS4Signer.csの調査を開始することもできます。

于 2013-11-11T00:06:24.990 に答える