我最近使用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存储桶同样失败?
答案 0 :(得分:1)
这是你的问题。
由于未知原因,¹uu-central-1在S3中是一个奇怪的球。 REST端点使用主机名中的两个变体:bucket.s3.eu-central-1.amazonaws.com
或bucket.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.com
或bucket.s3.amazonaws.com
。
最后,在最初创建存储桶后的几分钟内,任何区域都只能使用bucket.s3-external-1.amazonaws.com
,因为DNS与存储桶位置数据库集成在一起并自动将请求路由到正确的位置桶。
但请注意,当您签署请求时,您始终使用签名算法本身中的实际区域名称 - 而不是端点 - 就像您似乎已经在做的那样。
http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
¹我会推测这个约定实际上是新区域的“新常态” - 它与其他AWS服务更加一致。 S3是最古老的之一,所以传统的设计决策更有可能存在,这似乎就是这种情况。