如何为Amazon S3存储桶配置SSL

156
我正在使用一个Amazon S3桶来上传和下载数据,使用我的.NET应用程序。现在我的问题是:我想使用SSL访问我的S3存储桶。是否可以为Amazon S3桶实施SSL?

1
可能有帮助:在Amazon S3静态网站上实现SSL - vsync
8个回答

155

您可以通过以下方式通过SSL访问您的文件:

https://s3.amazonaws.com/bucket_name/images/logo.gif
如果您为您的存储桶使用自定义域名,您可以使用S3和CloudFront与您自己的SSL证书一起使用(或通过Amazon证书管理器生成免费证书)。http://aws.amazon.com/cloudfront/custom-ssl-domains/

45
并不完全正确。你可以使用没有点的桶名称:https://this-is-my-awesome-bucket.s3.amazonaws.com 亚马逊有一个通配符证书。由于不能使用点,因此您无法将CNAME域指向您的存储桶。 - Docunext
4
注意不要使用包含句点的存储桶名称!SSL 在 iOS 设备上无法运行,但在 Chrome 上可以正常工作。请参阅 https://dev59.com/KnA75IYBdhLWcg3w49YR - Simon_Weaver
1
Amazon CloudFront会为您完成这项工作。 - Greg
1
@Docunext,问题在于没有点的存储桶名称使得使用自定义DNS域名变得困难。请参见https://dev59.com/KY_ea4cB1Zd3GeqPNFz6。 - Sebastien Lorber
4
要使用Route 53别名并使用REST上传对象时,需要使用点号表示的存储桶名称,并确保主机名与所在地区匹配。例如,我的存储桶位于us-west-2,因此主机名实际上为s3-us-west-2.amazonaws.com,否则会出现错误。 - noetix
1
没有使用CloudFront,我们能实现这个吗? - Arun Kumar

27
今天新增了自定义域名 SSL 证书,价格为每个证书月费 $600。请在下方注册以获得邀请链接: http://aws.amazon.com/cloudfront/custom-ssl-domains/ 更新:现在可以免费提供SNI客户端证书 ,点击此处了解详情。与每月 $600 相比,这要便宜得多,并且由于 XP 系统基本停止使用,它对于大多数用例都有效。
@skalee,AWS 已经有一种实现“为 Amazon s3 存储桶实现 SSL”所需的机制,它被称为 CloudFront。我将“实现”解释为“使用我的 SSL 证书”,而不是“只是在 HTTP URL 上加一个 S”,因为我确定 OP 也能想到这个做法。
由于 CloudFront 的成本与 S3 完全相同($0.12/GB),但拥有关于 SSL 的大量附加功能,并且允许您无需额外费用添加自己的 SNI 证书,所以它是“在您的域上实现 SSL”的明显解决方法。

68
CloudFront和S3不同。 - skalee
6
正确,但如果您想通过带有自定义 SSL 证书的域访问它(正如 OP 所请求的那样),您可以设置自定义 CNAME SSL 证书,并通过 CF 访问它。 - Joseph Lust
2
目前,我已经设置了两个CNAME:static-s3和static-cf,第一个直接指向我的S3,第二个指向CF。第一个不支持SSL,第二个可以,但正如skalee所指出的那样,它是CF而不是S3。我认为这是我们现在能做到的最好的。 - Danger
2
哇,我猜他们必须以某种方式弥补越来越便宜的存储成本。至少按比例计算费用。如果你一个月只使用SSL证书1小时,只需20美元;-) - Simon_Weaver
2
如果您拥有专用的SSL证书(而不是SNI证书),那么该机器需要一个专用IP,这会产生成本。假设在S3托管您的数据的世界各地每个位置都需要为您提供专用IP。所以这些成本会累加起来。但我认为主要原因是大多数人不需要它,他们可以为需要的人涨价。如果您不需要支持IE6,则可以在CloudFront下使用SNI证书。 - Simon_Weaver
显示剩余2条评论

13

1
请尝试我的指南:https://www.engaging.io/easy-way-to-configure-ssl-for-amazon-s3-bucket-via-cloudflare/ - Ralph Vugts

4

直接在S3上不可能实现,但你可以从你的存储桶中创建一个Cloud Front分发。然后前往证书管理器并请求一个证书。亚马逊免费提供它们。一旦您成功确认了认证,将其分配给您的Cloud Front分发。还要记得设置规则以将http重定向到https。

我在Amazon S3上托管了几个静态网站,比如我的个人网站,我已经为它们分配了SSL证书,因为它们有Cloud Front分发。


你是如何分配域名的? - netshark1000
首先进入证书管理器并请求一个新的证书。如果需要,将您的域名以及子域名添加到那里。在那里放置子域名并不会对任何内容造成伤害,因此最好将example.com和*.example.com都放在那里。 - Mika Kujapelto

3
如果你真的需要它,考虑重定向。
例如,在请求assets.my-domain.example.com/path/to/file时,您可以执行301或302重定向到my-bucket-name.s3.amazonaws.com/path/to/file或s3.amazonaws.com/my-bucket-name/path/to/file(请记住,在第一种情况下,my-bucket-name不能包含任何点,否则它将不会匹配S3证书中陈述的*.s3.amazonaws.com,s3.amazonaws.com)。
我认为这会起作用,但没有经过测试。但是,我发现了几个注意事项。
第一个明显的问题是需要进行额外的请求来获取此重定向。而且我怀疑您不能使用域名注册处提供的重定向服务器——您必须以某种方式上传适当的证书——因此您必须使用自己的服务器。
第二个问题是,您可以在页面源代码中使用带有您的域名的URL,但是当用户在单独的选项卡中打开图片时,地址栏将显示目标URL。

2
我不确定,但我认为这可能会导致CORS问题。 - xdhmoore

1
如前所述,您无法为S3存储桶创建免费证书。但是,您可以创建Cloud Front分发,然后将证书分配给Cloud Front。您可以为您的域请求证书,然后在Cloud Front设置中将其分配给Cloud Front分发。我曾使用此方法通过SSL提供静态网站以及提供静态文件。
对于静态网站创建,亚马逊是首选之地。使用SSL获取静态网站非常实惠。

4
对于通过谷歌搜索到此处的所有人:请记得在弗吉尼亚北部地区(N. Virginia)创建您的AWS证书。否则,您将无法在CloudFront分发中选择该证书。 - KLoozen

0
将DNS/SSL添加到Amazon S3存储桶的绝对最简单的方法是使用CloudFlare workers!
我找到了这个非常有用的小技巧。 https://fershad.com/writing/proxy-aws-s3-content-cloudflare-workers/ 请注意,在主机名中使用正确的区域(例如us-west-1,us-west-2)。
完成!
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event))
})

async function handleRequest(event) {
  let requestFolder = '/files'
  let s3Folder = '/'
  
  let url = new URL(event.request.url)
  const cache = caches.default

  let origPathname = url.pathname
  const filename = url.toString().split('/').pop()

  url.hostname = 'bucket-name.s3-us-west-2.amazonaws.com'
  url.pathname = origPathname.replace(new RegExp('^'+escapeRegExp(requestFolder)), s3Folder)

  response = await fetch(url)
  response = new Response(response.body, { ...response})

  return response;
}

function escapeRegExp(string) {  
  return string.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&');
}



0
这可以通过以下方式使用NginxCertBot来完成: 步骤1:在服务器实例(如Ec2或任何第三方)上安装NginxCertBot步骤2:在Nginx配置目录中创建一个文件。

/etc/nginx/conf.d/your_file_name.conf

以下是内容
server {
    listen 80;
    server_name subkeyword.yourdomain.com;

location / {

    proxy_pass http://your_bucket_name.s3-website.your_region.amazonaws.com;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}
}
第三步:执行以下命令为您的子域名创建证书。
sudo certbot --nginx -d subkeyword.yourdomain.com

注意:您的域名托管区域中应该有一个服务器IP的A记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接