AWS签名v4验证成功执行EU存储桶,但美国存储桶失败?
我最近使用REST API实现了AWS Signature版本4。 这是通过广泛的回归测试完美地验证的。
我遇到的问题是,当对居住在水桶运行回归测试成功eu-central-1
区域,但始终未能与Accessed Denied
的错误消息桶居住在us-east-1
或us-west-2
。
以下是成功和失败尝试的片段。
欧盟中心-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
服务器响应:
<?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>
我们东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
签名字符串:
AWS4-HMAC-SHA256
Credential=AKIAJZN7UY6XHIZPWIKQ/20160525/us-east-1/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=01e97...4d00
服务器响应:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>92EEF2A86ECA88EF</RequestId>
<HostId>i3wTU6OzBrlX89xR4KnnezBx1Tb2IGN2wtgPJMRtKLjHxF/B6VdCQqPz1279J7e5</HostId>
</Error>
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
签名字符串:
AWS4-HMAC-SHA256
Credential=AKIAJZN7UY6XHIZPWIKQ/20160525/us-west-2/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=cf70...36b9
服务器响应:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>DB143DBF0F316EB8</RequestId>
<HostId>5hWJ0AHM466QcT+BK4UaEFpqXFNaJFEuAPlN/ZZPBhL+NDYBoGaySRkXQ3BRdyfy9PBDuSb0oHA=</HostId>
</Error>
迄今为止所做的尝试包括:
我发现在使用美国标准(例如us-east-1)时,REST端点不应包含“us-east-1”的引用(如此处)。 我还没有发现这个正式写的。 因此,我创建了一个us-west-2存储桶,希望REST端点需要包含“us-west-2”,但这也失败了。
我在Google和StackOverflow上搜索了“拒绝访问”的可能原因,这导致我添加了一个授予所有权限的存储桶策略 - 无济于事。
AWS控制台中的EU和US帐户的权限看起来是一样的,所以没有提示。
我将日志记录添加到存储桶中,希望看到失败条目,但在认证完成之前不会记录任何内容。
有没有人知道为什么AWS v4身份验证为一个eu-central-1桶持续获得成功,但对于我们east-1和us-east-2桶也同样失败?
这是你的问题。
由于不明原因,¹欧盟中心-1在S3中是一个古怪的球。 REST端点可以在主机名中使用两种变体: bucket.s3.eu-central-1.amazonaws.com
或bucket.s3-eu-central-1.amazonaws.com
。
区别在于s3
之后的点或短划线。
除us-east-1和ap-northeast-2之外的所有其他地区(如现在)除了bucket.s3-us-west-2.amazonaws.com
之外,其他地区(如现在)只能在s3
之后使用破折号 bucket.s3-us-west-2.amazonaws.com
... 不是一个点 。
而我们东1预计bucket.s3.amazonaws.com
或bucket.s3-external-1.amazonaws.com
。
最后,任何区域都可以在最初创建存储桶几分钟内与bucket.s3.amazonaws.com
一起工作,因为DNS与存储桶位置数据库集成在一起,并自动将请求路由到正确的位置,对于每个存储桶。
但请注意,当您签署请求时,您总是在签名算法本身中使用实际的区域名称 - 而不是端点 - 正如您似乎已经在做的那样。
http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
¹我推测这个惯例实际上是新区域的“新常态” - 它与其他AWS服务更加一致。 S3是最古老的设计之一,因此,传统的设计决策更有可能存在,就像在这里似乎是这样。
链接地址: http://www.djcxy.com/p/39037.html上一篇: AWS signature v4 authentication succeeds for EU bucket but fails for US bucket?
下一篇: Direct Upload to S3 from the browser with Authorization Signature Ver 4