关于计算AWS签名的困惑 - 不确定要求的信息

时间:2016-05-11 12:41:50

标签: c# amazon-web-services

我正在尝试为HTTP标头创建一个AWS签名,这是我第一次使用这种系统 - 我很难抓住他们要求的东西。

在线搜索几个小时,我发现了一些不同的代码片段以及亚马逊自己的关于签名计算的教程的代码;

例如,这个看起来像是要从给定的密钥计算完整的签名;

github gist

亚马逊提供自己的代码来生成密钥

amazon code

但我仍然很困惑。我从我的控制面板上找到了亚马逊AWS SECRET KEY,但我无法弄清楚插在哪里。

我链接的第一个代码有一个CalculateSignature方法,要求HttpRequestMessagestring[]'signedHeaders'和日期。

我无法弄清楚这些想要什么。我应该传达什么信息?签名标题是什么意思?签名的标题是host;range;x-amz-date吗?

有人可以协助吗?我不知道HttpRequestMessage应该是什么。

1 个答案:

答案 0 :(得分:1)

基本思路是从当前日期和整个请求中签名:URL,查询参数,标题和内容。

问题是这些事情中的一些可以用多种方式表示,因此您必须创建它们的规范版本。这只是一个非常具体的表示,AWS可以完全重现,以验证签名。

例如,标题需要采用特定格式:按键排序,键和值之间没有空格,用分号分隔。如果请求是由API发出或通过代理进行的,则可能会在此过程中添加额外的标头(例如User-AgentX-Forwarded-For等)。 signedHeaders告诉AWS您在签名中包含哪些标题,因此可以忽略其他标题。您至少可以使用hostx-amz-datex-amz-content-sha256

AWS_SECRET_KEY用作getSignatureKey的输入。在第一个示例中,它是_awsSecretKey

HttpRequestMessage只是您要发送给AWS的HTTP请求。最简单的示例是对S3检索文件的GET请求,但它可以是对AWS服务的任何API调用。您需要使用正确的方法(GET / POST / etc),路径(API端点),查询参数和/或正文初始化HttpRequestMessage。获得GetSignature签名后,您需要将其包含在Authorization标题中。