0

此处的 AWS 文档似乎有些令人困惑、不完整或相互矛盾的信息。它指出

CanonicalHeaders 是请求标头及其值的列表。

这表明我们将所有请求标头放在规范请求中。然而,后来他们表示

CanonicalHeaders 列表必须包括以下内容:

HTTP 主机标头

如果请求中存在 Content-Type 标头,则必须将其添加到 CanonicalHeaders 列表中。

还必须添加您计划包含在请求中的任何 x-amz-* 标头。例如,如果您使用临时安全凭证,您将在请求中包含 x-amz-security-token。您必须将此标头添加到 CanonicalHeaders 列表中。

好的,关于 Content-Type 和 x-amz 标头的内容表明我们实际上并未采用所有标头,因为否则它们不需要声明必须包含它们。那么也许,我们需要获取Host标题、Content-Type标题和任何x-amz-*标题。但是在下面,它变得更加混乱,因为这是一个示例请求:

GET /test.txt HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Date: Fri, 24 May 2013 00:00:00 GMT
Authorization: SignatureToBeCalculated
Range: bytes=0-9 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date: 20130524T000000Z 

这是从它创建的示例规范请求:

GET
/test.txt

host:examplebucket.s3.amazonaws.com
range:bytes=0-9
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20130524T000000Z

host;range;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 

但这与之前的两种解释都不一致:如果我们应该只有Content-Type,Hostx-amz-*headers,那么rangeheader 在列表中做什么?如果我们只是应该获取所有标题,那么为什么列表中没有Date标题?

放入规范请求的标头列表是否是任意的,只要它至少包含最少的标头?确切地说,构建规范请求标头的最终规则集是什么?

4

1 回答 1

1

如果我们应该只有 Content-Type、Host 和 x-amz-* 标头,那么范围标头在列表中的作用是什么?

您只需要具有 Content-Type、Host 和 x-amz-*,但您可以添加您想要添加到要验证的签名的其他标头。

请参阅文档中的注释:“为了计算签名,只需要主机和任何 x-amz-* 标头;但是,为了防止数据篡改,您应该考虑在签名计算。”

如果我们只是应该获取所有标题,那么为什么列表中没有 Date 标题?

Date 头是特殊的,因为它是浏览器根据客户端系统时间添加的,可能不正确。因此,您可以改用 x-amz-date。

放入规范请求的标头列表是否是任意的,只要它至少包含最少的标头?

是的!

确切地说,构建规范请求标头的最终规则集是什么?

那将是AWS 签名版本 4的文档中定义的那些......但您明白了:您必须签署最小的请求数据集,并且可以签署您想要的所有标头。

也就是说,如果可以的话,请避免所有这些。[Javascript, Java, .NET, Python, Ruby, PHP,...] 的 SDK 已经为您签署请求,管理临时凭证、凭证链、线程、重试等等。如果你可以使用它,它可能会省去很多麻烦。

于 2014-07-11T18:14:41.297 回答