【发布时间】:2020-12-17 20:04:27
【问题描述】:
我正在尝试创建一个简单的 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>
我是根据postmans代码写的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
【问题讨论】:
-
我意识到签名不是你的密钥,它必须被生成。所以我还基于这个程序敲开了一个 c# 控制台应用程序...gist.github.com/yvanin/0bdf68c1139ad698519e 并且它仍然返回 401...失败的状态代码:401,ReasonPhrase:'未授权',版本:1.1,内容:System.Net .Http.HttpConnectionResponseContent,标头:{ x-amzn-requestid: 0980c777-22d8-41b2-a805-a41ef96b5673 传输编码:分块日期:2020 年 12 月 16 日星期三 11:17:45 GMT 服务器:AmazonEC2 }
-
在邮递员中,你能用
https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08而不是EC2服务检查吗? -
问题可能是服务器而不是客户端。您需要在服务器中设置环境变量。请参阅:docs.aws.amazon.com/sdk-for-java/v1/developer-guide/…
-
感谢您的帮助。我现在让它在邮递员中工作,它只需要一个不同的 URL 和一个版本.. 这个工作。
https://ec2.us-east-2.amazonaws.com/?Action=DescribeInstances&Version=2016-11-15。我现在也让 c# 程序工作了,现在它将在接下来的几个小时内迁移到 vb 程序 -
完成后我会在这里发布最终的 vb 程序,以便其他人可以使用它:)
标签: c# vb.net amazon-web-services amazon-ec2 amazon-api-gateway