AWS文档here似乎有些令人困惑,不完整或相互矛盾的信息。它说明了
CanonicalHeaders是一个包含其值的请求标头列表。
这表明我们将所有请求标头放在规范请求中。但是,后来他们说了
CanonicalHeaders列表必须包含以下内容:
HTTP主机标头
如果请求中存在Content-Type标头,则必须将其添加到CanonicalHeaders列表中。
还必须添加您计划包含在请求中的任何x-amz- *标头。例如,如果您使用临时安全凭证,则会在请求中包含x-amz-security-token。您必须在CanonicalHeaders列表中添加此标题。
好的,有关Content-Type和x-amz标题的内容表明我们实际上并未实际使用所有标题,因为否则他们不需要声明他们& #39;必须包括在内。那么也许,我们仅需要采用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
,Host
和x-amz-*
标题,那么{{1标题列表中的标题?如果我们应该采用所有标头,那么为什么不是列表中的range
标头?
要放入规范请求的标头列表是否是任意的,只要它包含至少最小标头?确切地说,构建规范请求标头的确定规则是什么?
答案 0 :(得分:1)
如果我们应该只有Content-Type,Host和x-amz- *标题, 那么列表标题在列表中的作用是什么?
您只需要具有Content-Type,Host和x-amz- *,但您可以添加要添加到要验证的签名的其他标头。
请参阅docs中的说明:“为了计算签名,只需要主机和任何x-amz- *标头;但是,为了防止数据被篡改,您应该考虑在签名计算中包括所有标题。“
如果我们只是想采取所有的标题,那么为什么不是 列表中的日期标题?
Date标头是特殊的,因为它是由浏览器根据可能不正确的客户端系统时间添加的。因此,您可以使用x-amz-date。
要放入规范请求的标头列表是否是任意的, 只要它至少包含最小标题?
是!
确切地说,构建这个规则的最终规则是什么 规范请求标题?
那将是AWS signature version 4文档中定义的那些......但您明白了:您必须签署最小的请求数据集,并且可以签署您想要的所有标题。
那就是说,如果可以的话,尽量避免这一切。 [Javascript,Java,.NET,Python,Ruby,PHP,...]的SDK已经为您签署请求,管理临时凭证,凭证链,线程,重试等等。如果你可以使用它,它可能会省去很多头痛。