【问题标题】:How to generate an S3 pre-signed URL for a custom domain without exposing bucket name如何在不暴露存储桶名称的情况下为自定义域生成 S3 预签名 URL
【发布时间】:2020-05-27 08:39:25
【问题描述】:

我有一个存储桶my-bucket-name,我想授予对folder-name 中的一些file.pdf 的临时访问权限。至于默认我使用 boto3 获得下一个链接:

https://my-bucket-name.s3.amazonaws.com/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>

但我还有一个 DNS 别名,my.address.com 映射到 my-bucket-name.s3.amazonaws.com。当然,如果我直接使用它,我会从亚马逊获得SignatureDoesNotMatch。所以我使用下一个代码来生成预签名链接:

from botocore.client import Config

kwargs = {}
kwargs['endpoint_url'] = f'https://my.address.com'
kwargs['config'] = Config(s3={'addressing_style': 'path'})

s3_client = boto3.client('s3', **kwargs)
url = s3_client.generate_presigned_url(ClientMethod='get_object',
                                       Params={
                                          'Bucket': 'my-bucket-name',
                                          'Key': 'folder-name/file.pdf'
                                       },
                                       ExpiresIn=URL_EXPIRATION_TIME)

结果它返回了下一个链接:

https://my.address.com/my-bucket-name/folder-name/file.pdf?AWSAccessKeyId=<key>&Signature=<signature>&x-amz-security-token=<toke>&Expires=<time>

这样做有两个问题:

  • 我不想暴露我的存储桶名称,所以应该省略my-bucket-name/
  • 这个链接失效了,我收到了
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>

这些是问题:

  1. 是否可以在不暴露存储桶名称的情况下实现可行的链接?
  2. 我已经读过一些关于自定义域只能用于 HTTP 而不能用于 HTTPS 访问的内容,对吗?在这种情况下我该怎么办?
  3. DNS 别名不是我创建的,所以我不确定它是否有效或设置正确,我应该检查/询问什么来验证它是否适用于 s3?

目前我有点迷失在亚马逊文档中。此外,我对所有这些 AWS 东西都不熟悉。

【问题讨论】:

标签: amazon-web-services amazon-s3 boto3 pre-signed-url


【解决方案1】:

据我所知,您不能在不公开存储桶名称的情况下拥有预签名 URL。是的,您无法通过 https 访问映射到 S3 存储桶 URL 的自定义域名。因为当您访问https://example.com 并且example.com 映射到my-bucket-name.s3.amazonaws.com 时,S3 无法解密 SSL 流量。请参阅 this AWS 文档页面,限制部分。

【讨论】:

  • 感谢您指出这两件事。在 aws 文档上找到有关 SSL 限制的页面,请求进行编辑。
【解决方案2】:

无法在 Amazon S3 预签名 URL 中隐藏存储桶名称。这是因为正在向存储桶发出请求。签名只是授权请求。

您可以做到这一点的一种方法是使用 Amazon CloudFront,将存储桶作为源。您可以将域名与 CloudFront 分配相关联,该分配与 CloudFront 获取其内容的 Origin 无关。

Amazon CloudFront 支持预签名 URL。您可以通过Origin Access Identity (OAI) 授予 CloudFront 对 S3 存储桶的访问权限,然后将分配配置为私有。然后,通过 CloudFront 预签名 URL 访问内容。请注意,分配的全部内容将是私有的,因此您需要两个 CloudFront 分配(一个公共,一个私有),或者仅将 CloudFront 用于私有部分(并继续将直接到 S3 用于公共部分)。

如果整个网站是私有的,那么您可以在 CloudFront 中使用 cookie,而不必为每个 URL 生成预签名 URL。

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 2019-01-27
    • 2021-02-25
    • 2017-11-28
    • 2021-11-11
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多