如何在不暴露存储桶名称的情况下为自定义域生成 S3 预签名 URL

5 amazon-s3 amazon-web-services pre-signed-url boto3

我有一个存储桶,我想向中的my-bucket-name某些存储桶授予临时访问权限。至于默认情况下,我使用 boto3 获取下一个链接:file.pdffolder-name

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

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

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

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

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

这样做有两个问题:

  • 我不想暴露我的存储桶名称,因此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>
Run Code Online (Sandbox Code Playgroud)

这些是这些问题:

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

目前我对亚马逊文档有点迷失。而且我对所有这些 AWS 东西都很陌生。

Joh*_*ein 3

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

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

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

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