对于EU存储桶,AWS签名v4身份验证成功但对于美国存储桶失败了吗?

时间:2016-05-25 09:42:11

标签: amazon-s3

我最近使用REST API实现了AWS Signature版本4。通过广泛的回归测试验证了这一点。

我遇到的问题是,当针对驻留在eu-central-1区域中的存储桶运行时,回归测试会成功,但对于驻留在{{1}中的存储区的Accessed Denied错误消息始终失败}或us-east-1

以下是成功和失败尝试的片段。

eu-central-1:成功

HTTP请求:

GET./
host:s3.eu-central-1.amazonaws.com.x-amz-content-sha256:e3b0...b855.x-amz-date:Wed, 25 May 2016 03:13:21 +0000
host;x-amz-content-sha256;x-amz-date.e3b0...b855

签名字符串:

AWS4-HMAC-SHA256
Credential=AKIAJZN7UY6XHIZPWIKQ/20160525/eu-central-1/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=cf5f...4dc8

服务器响应:

us-west-2

us-east-1:失败

HTTP请求:

GET./
host:s3.us-east-1.amazonaws.com.x-amz-content-sha256:e3b0...b855.x-amz-date:Wed, 25 May 2016 03:02:27 +0000
host;x-amz-content-sha256;x-amz-date.e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

签名字符串:

<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult
    xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
        <ID>100a...a575</ID>
    </Owner>
    <Buckets>
        <Bucket>
            . . .
        </Bucket>
    </Buckets>
</ListAllMyBucketsResult>

服务器响应:

AWS4-HMAC-SHA256
Credential=AKIAJZN7UY6XHIZPWIKQ/20160525/us-east-1/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=01e97...4d00

us-west-2:失败

HTTP请求:

GET./
host:s3.us-west-2.amazonaws.com.x-amz-content-sha256:e3b0...b855.x-amz-date:Wed, 25 May 2016 07:04:47 +0000
host;x-amz-content-sha256;x-amz-date.e3b0...b855

签名字符串:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>92EEF2A86ECA88EF</RequestId>
    <HostId>i3wTU6OzBrlX89xR4KnnezBx1Tb2IGN2wtgPJMRtKLjHxF/B6VdCQqPz1279J7e5</HostId>
</Error>

服务器响应:

AWS4-HMAC-SHA256
Credential=AKIAJZN7UY6XHIZPWIKQ/20160525/us-west-2/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=cf70...36b9

迄今为止的尝试包括:

  • 我找到了引用(like here),当使用美国标准(即us-east-1)时,REST端点包含“us-east-1” 。我还没有正式发现这个。因此,我创建了一个us-west-2存储桶,希望REST端点需要包含“us-west-2”,但也失败了。

  • 我在Google和StackOverflow上搜索了“拒绝访问”的可能原因,这导致我添加了一个为所有人提供权限的存储桶策略 - 无济于事。

  • AWS控制台中的欧盟和美国帐户的权限看起来相同,所以没有提示。

  • 我为了看到失败条目而添加了日志记录,但在验证完成之前没有记录任何内容。

有没有人知道为什么AWS v4身份验证会在eu-central-1存储桶中始终如一地成功,但对于us-east-1和us-east-2存储桶同样失败?

1 个答案:

答案 0 :(得分:1)

这是你的问题。

由于未知原因,¹uu-central-1在S3中是一个奇怪的球。 REST端点使用主机名中的两个变体:bucket.s3.eu-central-1.amazonaws.combucket.s3-eu-central-1.amazonaws.com

区别在于s3之后的点或短划线。

除了us-east-1和ap-northeast-2(就像eu-central-1一样)之外的所有其他区域(截至目前)仅适用于{{1>之后的破折号例如s3 ... 没有点

而且us-east-1要求bucket.s3-us-west-2.amazonaws.combucket.s3.amazonaws.com

最后,在最初创建存储桶后的几分钟内,任何区域都只能使用bucket.s3-external-1.amazonaws.com,因为DNS与存储桶位置数据库集成在一起并自动将请求路由到正确的位置桶。

但请注意,当您签署请求时,您始终使用签名算法本身中的实际区域名称 - 而不是端点 - 就像您似乎已经在做的那样。

http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

¹我会推测这个约定实际上是新区域的“新常态” - 它与其他AWS服务更加一致。 S3是最古老的之一,所以传统的设计决策更有可能存在,这似乎就是这种情况。