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

Why are REST calls to S3 using the AWS Signature v4 not really using the signature process?

我正在使用 AWS Federated Web Identitiy Playground,我想知道如何使用签名 V4 来访问 AWS 或特别是 S3。

如果我查看正在加载的 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 调用的方法(提供的方法 callS3WithREST)。尽管该方法包含在 sig4 中,但它不使用任何逻辑。

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

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

您肯定需要将您的 REST 请求签署到 S3,否则它们不会成功,除非请求涉及匿名用户可用的内容。而且,是的,您 "should" 使用 Signature Version 4 与 S3 交互,因为(除其他原因外)较新的 S3 区域不支持较旧的 Signature Version 2。

奇怪的是,callS3WithREST 似乎实际上是 Signature Version 2 的一个实现。

为什么我一点也不清楚,但我有一个令人信服的理论:它是旧代码 copy/pasted and/or 遗留下来的 V2 脚本,它是这个脚本的前身。

S3 对签名版本 2 的实施与其他 AWS 服务支持的 V2 几乎完全相同...但差异大到不兼容。

(S3 的 V2 "string to sign," 与标准实现不同,不包括 Host: header 值作为第 2 行,大概是因为 "canonical resource" 部分使它变得多余,同一个存储桶通常有多个不同的主机名)。

因此,由于算法的不同,V2 签名库必须为 S3 设置例外。

V4 不是这样,它足够全面,如果不做出任何不当假设,相同的代码可以为 S3 和其他服务签署请求。

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