我正在尝试创建一个简单的 C# 或 VB 程序来连接到 AWS API 并返回一个提供 EC2 实例数据的 JSON 字符串。相反,我收到错误“AWS 无法验证提供的访问凭证”
我尝试在Postman
VB 程序中连接,如下所示:
Imports System.Net
Imports System.IO
Module Main
Sub Main()
Dim result As String = RunQuery("", "https://ec2.amazonaws.com/?Action=DescribeInstances")
Console.WriteLine(result)
Console.ReadLine()
End Sub
Public Function RunQuery(creds As String, url As String, Optional data As String = Nothing) As String
Dim request As HttpWebRequest = TryCast(WebRequest.Create(url), HttpWebRequest)
request.ContentType = "application/json"
request.Method = "GET"
If data IsNot Nothing Then
Using writer As StreamWriter = New StreamWriter(request.GetRequestStream())
writer.Write(data)
End Using
End If
Dim d As Date = Date.UtcNow
Dim t As String = Format(d, "yyyyMMdd") & "T" & Format(d, "HHmmss") & "Z"
request.Headers.Add("X-Amz-Date", t)
request.Headers.Add("Authorization", "AWS4-HMAC-SHA256 Credential=***MYAPIKEY***/20201216/us-east-2/ec2/aws4_request, SignedHeaders=host;x-amz-date, Signature=***MYAPISECRET***")
Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse)
Dim result As String = String.Empty
Using reader As StreamReader = New StreamReader(response.GetResponseStream())
result = reader.ReadToEnd()
End Using
Return result
End Function
End Module
邮递员的输出是
<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to validate the provided access credentials</Message></Error></Errors><RequestID>37153d9f-c042-4ae3-8a13-06dc3b052afc</RequestID></Response>
我根据邮递员代码编写了vb:
var client = new RestClient("https://ec2.amazonaws.com/?Action=DescribeInstances");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("X-Amz-Date", "20201216T092737Z");
request.AddHeader("Authorization", "AWS4-HMAC-SHA256 Credential=MYAPIKEY/20201216/us-east-2/ec2/aws4_request, SignedHeaders=host;x-amz-date, Signature=MYAPISIGNATURE");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
类似的问题之前已经被问过很多次,但我能看到的唯一答案是 PC 时钟是错误的,所以我已经更正了我的问题,使其在真实互联网时间的 0.2 秒内。
我也找不到另一个同样简单的 VB 或 C# 程序成功连接到 EC2,所以这个线程将来可能会帮助其他人。
我想知道签名是否必须用 base64 或其他算法编码?否则我怎样才能让这个在邮递员或 vb/c# 中工作?TIA