用于访问无法从自定义域访问的S3私有内容的签名URL

时间:2014-09-12 12:05:14

标签: amazon-web-services amazon-s3 dns

我正在签署S3上的私人资源,以暂时公开发布。这是我使用协议的v3版本签署URL后得到的结果:

http://s3.amazonaws.com/some.bucket.com/stuff/123/my.doc?AWSAccessKeyId=ABCDEFGHIJK1LMNOP1WE&Expires=1410526534&Signature=r6helf9WA0%2FOSvwbuwTqGJJ6u3c%3D

假设我想将s3.amazonaws.com替换为其他域名,为此我在DNS设置中输入新的CNAME条目(我将my.stuff.net映射为s3.amazonaws.com的别名。) 。如果我现在尝试查询以下URL,我将从亚马逊获得签名验证失败的详细描述。

http://my.stuff.net/some.bucket.com/stuff/123/my.doc?AWSAccessKeyId=ABCDEFGHIJK1LMNOP1WE&Expires=1410526534&Signature=r6helf9WA0%2FOSvwbuwTqGJJ6u3c%3D

v3签名不包括主机名,所以我的猜测是签名实际上是正确的,但亚马逊验证请求来自哪个域并拒绝来自s3.amazonaws.com的所有内容。

有人知道我的猜测是否正确以及是否有一些解决方法?

1 个答案:

答案 0 :(得分:1)

  

存储桶名称必须与CNAME

相同

http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html

因此,您通过CNAME指向bucketname.s3.amazonaws.com的主机名必须与存储桶名称相同。如果广告素材的名称不是有效的DNS名称,则无法使用。

如果你走这条路线,那么你还需要从路径的开头删除存储桶名称(不是从字符串到符号,而是从URL),因为S3会对Host:作出反应浏览器发送的标头,用于确定请求URI路径是否以存储桶名称开头。

这是唯一可以在不使用代理的情况下在S3的路上重写请求的方法,如果上述情况不适用,您可以考虑另一种方法。