为什么REST使用AWS Signature v4调用S3并不真正使用签名过程?

时间:2015-04-05 13:48:08

标签: javascript rest amazon-web-services amazon-s3 hmac

我正在使用AWS Federated Web Identitiy Playground,并且想知道访问AWS或特别是S3的签名V4用法。

如果我查看正在加载的Sig4.js文件,那么

/**
  * Contains functions to construct a canonical request, create the string to sign,
  * calcuate the signature, and finally to make a signed sigv4 request. Also contains
  * a function to make REST calls to S3. 
  */

我不确定允许对S3进行REST调用的methot(提供方法callS3WithREST)。虽然该方法包含在sig4中,但它不使用任何逻辑。

在阅读AWS文档时,他们强调始终将签名V4用于对AWS服务的所有请求。所以我想知道:

问题
我不应该使用签名来对S3进行REST调用吗?那么签名过程的目的是什么?谢谢你的澄清。

1 个答案:

答案 0 :(得分:1)

您肯定需要将您的REST请求签名到S3,否则它们将不会成功,除非该请求涉及匿名用户可用的内容。并且,是的,您“应该”使用签名版本4与S3进行交互,因为(除其他原因外)较新的S3区域不支持较旧的签名版本2.

这里有点奇怪的是,callS3WithREST实际上似乎是签名版本2的实现。

为什么这对我来说根本不清楚,但我有一个令人信服的理论:它是旧代码的复制/粘贴和/或从V2脚本遗留下来的,这是该脚本的前身。

S3的签名版本2的实现与其他AWS服务支持的V2几乎完全相同......但又不同以至于不兼容。

(S3的V2“要签名的字符串”,与标准实现不同,不包括Host:标头值作为第二行,可能是因为“规范资源”部分中所需的存储桶名称使其成为resundant,同一个存储桶通常有多个变体主机名。)

因此,由于算法不同,V2签名库必须对S3进行例外处理。

对于V4来说,情况并非如此,如果没有做出任何不正确的假设,V4足够全面,相同的代码可以签署对S3以及其他服务的请求。

所以我怀疑这是最好的解释,因为在前一生中,这是一个被转换为V4脚本的Signature V2脚本时,一些不恰当的遗留代码。