【问题标题】:Signed URLs for accessing S3 private content not accessible from custom domain用于访问无法从自定义域访问的 S3 私有内容的签名 URL
【发布时间】:2014-11-06 14:42:28
【问题描述】:

我正在签署 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 的内容。

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

【问题讨论】:

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


    【解决方案1】:

    存储桶名称必须与CNAME相同

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

    因此,您通过 CNAME 指向 bucketname.s3.amazonaws.com 的主机名必须与存储桶名称相同。如果存储桶的名称不是有效的 DNS 名称,则它不起作用。

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

    这是在不使用代理将请求重写到 S3 的过程中的唯一方法,如果上述不适用,您可以考虑另一种选择。

    【讨论】:

    • http://xsome.bucket.com.s3.amazonaws.com/stuff/123/my.doc?AWS... 将成功返回与http://s3.amazonaws.com/some.bucket.com/stuff/123/my.doc?AWS... 相同的结果。我想说亚马逊只是在签名验证(包括完整路径)之前重写 URL。就我而言,我会将文档中的那句话替换为“CNAME 必须与存储桶名称相同”。我同意在代理上重写 URL 是唯一合理的做法。
    猜你喜欢
    • 2022-01-23
    • 2020-01-26
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2023-03-21
    • 2020-05-05
    相关资源
    最近更新 更多