Amazon S3:同时使用DNS别名来存储桶+ HTTPS

Seb*_*ber 5 dns https cname amazon-s3 amazon-web-services

我想在法兰克福区创建一个S3存储桶,并使用URL访问这些文件: https://files.stample.co/filename

所以我同时想要HTTPS和自定义DNS别名(CNAME).

根据我的理解,亚马逊有一个URL的通配符证书https://*.s3.amazonaws.com.

HTTPS/SSL

所以这个通配符将:

  • 为...工作 https://stample-files.s3.amazonaws.com
  • 不适合 https://files.stample.co.s3.amazonaws.com

所以我理解并通过其他StackOverflow 帖子确认的是,如果我希望SSL工作,我必须使用没有点的存储桶名称,否则带有通配符的Amazon证书将与存储区域不匹配.

使用DNS别名/ CNAME

在此S3文档,下Customizing Amazon S3 URLs with CNAMEs段:

根据您的需要,您可能不希望"s3.amazonaws.com"出现在您的网站或服务上.例如,如果您在Amazon S3上托管您的网站图像,您可能更喜欢http://images.johnsmith.net/而不是http://johnsmith-images.s3.amazonaws.com/.

存储桶名称必须与CNAME相同.因此,如果创建了一个CNAME来将images.johnsmith.net映射到images.johnsmith,那么http://images.johnsmith.net/filename将与http://images.johnsmith.net.s3.amazonaws.com/filename相同..net.s3.amazonaws.com.

这似乎是出于技术原因,否则亚马逊无法知道我们尝试定位的存储桶:

由于Amazon S3仅看到原始主机名www.example.com,并且不知道用于解析请求的CNAME映射,因此CNAME和存储桶名称必须相同.

所以我在这里理解的是,为了使CNAME起作用,我们必须在bucketname中使用点.

两者一起 ?

如果我在桶名中使用点:

  • SSL不起作用
  • CNAME会起作用

如果我不在桶名中使用点:

  • SSL会起作用
  • CNAME不起作用

我已经测试了两种情况,无法使SSL和CNAME一起工作.

我能做些什么来使两者都有效?在我看来,我想要实现的并不是很花哨......

Mic*_*bot 12

根据您的意思,您可以同时执行这两项操作,但这需要更改您的方法并了解某些S3内部,或者理解为什么您尝试的内容不可能发挥作用.

首先,澄清一下,当我说你可以做到这两点时,我假设你不要指望你可以创建一个名为"example.com"的存储桶然后能够访问存储桶https://example.com.

如果这是您想要或期望的,那么您就错过了一些基本的SSL.

对于提供SSL的Web服务器,它必须具有由受信任的证书颁发机构签名的SSL证书.此证书不仅包含用于加密的公钥,还包含有效的主机名,并且不适用于其他主机名.SSL不仅提供加密,还可以保证您访问的网站确实是您认为的网站.对于s3,证书中的主机名是*.s3.amazonaws.com和一些区域变体,我将在下面解释.主机名匹配的规则要求* 不匹配任何带有点的内容,因此*.s3.amazonaws.com匹配example-bucket.s3.amazonaws.com(主机名组件中没有与之对齐的点*),但它不匹配,example.com.s3.amazonaws.com因为*不匹配example.com因为它包含一个点.这些规则由浏览器强加,这不是S3的限制.

现在,如果你要使用https://example.com访问你的水桶,S3不会单独实现这一目标,因为example.com本身并不是甚至远程类似S3上的SSL证书,这是主机名*.s3.amazonaws.com.您不仅需要从已签署用于"example.com"的证书颁发机构购买SSL证书,还需要将其安装在Web服务器上......在本例中为S3. .和S3不支持这个.

但是,Amazon CloudFront可以.您可以将CloudFront分配配置为存储桶的前端,并在CloudFront上安装您自己的SSL证书,通过HTTPS以这种方式访问​​存储桶.在此配置中,您的存储桶名称无关紧要 - 它甚至不必与您的域名匹配,因为您可以将CloudFront配置为使用您想要的任何存储桶.浏览器通过CloudFront获取内容,而CloudFront又从存储桶中提取内容.

现在......假设这不是您要求的...假设您不希望自己的域在使用亚马逊证书的SSL中工作...您可以配置带有虚线名称的存储桶,允许您创建用于托管"example.com"内容的CNAME ...仍然可以使用HTTPS访问存储桶.但是,由于上面解释的原因,您无法使用 CNAME 通过SSL访问它...因为您的主机名与S3的SSL证书上的主机名不匹配.

但是,如果要通过SSL访问名称中包含点的存储桶,则可以使用配置存储桶的区域端点执行此操作.

us-west-2区域中的"example.com"存储桶将通过将存储桶名称放在第一部分来解决,如果路径改为主机名的开头...就像这样:

https://s3-us-west-2.amazonaws.com/example.com/path/to/file.jpg
Run Code Online (Sandbox Code Playgroud)

每个S3区域至少有一个以这种方式工作的区域端点.对于"美国标准"地区,端点是"s3.amazonaws.com",它在地理上路由到弗吉尼亚州的主要站点或俄勒冈州的镜像站点,"s3-external-1.amazonaws.com"仅路由到弗吉尼亚州,或"s3-external-2.amazonaws.com",这在很大程度上没有记载,但在俄勒冈州的镜子路线.

因此,可以通过HTTPS访问名称中包含点的存储桶中的资源,但是您必须知道存储区的区域...尽管您通常不能简单地访问它https://your-cname.example.com,因为SSL的工作方式.


Seb*_*ber 2

目前看来仅使用 S3 无法做到这一点,但使用 CloudFront 是可能的,因为它支持自定义证书。

CloudFront 并不是很贵,在某些情况下甚至可以比 S3 便宜。使用SNI时,它免费支持自定义证书(但是 < IE7、< Chrome6、< Firefox 2.0 等旧版浏览器不支持它)

如何使用 CloudFront

https://files.mydomain.com我将以您想要用来指向名为的 S3 存储桶mydomain-files(存储桶名称无关紧要并且可以包含点)为例。

需要定制证书

根据“Michael - sqlbot” anwser,需要使用自定义证书。我最初的假设是,使用 CNAME 将允许在使用我的自定义域时使用 Amazon S3 通配符证书,但这是错误的:自定义证书是绝对必需的,并且只能使用 CloudFront 设置,而不是 S3。

获得免费证书

您可以使用任何您想要的证书提供商,但在这里我采用StartSSL (StartCom),它提供免费的 SSL 证书(但仅限于一个子域和 1 年)。

  • 验证您对域的所有权mydomain.com
  • 使用域创建证书files.mydomain.com
  • 下载证书(files.crt)和私钥(files.key,使用您的自定义密码加密):它们是PEM格式
  • 解密私钥:openssl rsa -in files.key -out files.key
  • 从此处使用 StartSSL 文件生成证书链:cat sub.class1.server.ca.pem ca.pem >> chain.crt

将证书上传到AWS

  • 安装 AWS CLI 以上传证书(请注意,密钥必须未加密,证书为 PEM 格式,并且 CloudFront 需要证书链)。您必须选择名称和路径(选择您想要的名称,但路径应以/cloudfront/
  • 将您的证书上传到 AWS 以供 Cloudfront 使用,如下所示aws iam upload-server-certificate --server-certificate-name CUSTOM_CERTIFICATE_NAME --certificate-body file://files.crt --private-key file://files.key --certificate-chain file://chain.crt --path /cloudfront/CUSTOM_PATH/

配置CloudFront

  • 创建新的 Web 分发
  • 使用 CNAME:files.mydomain.com
  • 选择“自定义 SSL 证书”单选按钮并选择您的证书(CUSTOM_CERTIFICATE_NAME您在上传时选择)
  • 选择您的 S3 存储桶作为 CloudFront 分配源
  • 验证并等待部署完成:您应该使用以下 url 访问您的存储桶文件https://xyzxyzxyz.cloudfront.net/file

配置DNS

  • 打开您的mydomain.comDNS 配置
  • 添加 CNAME:files IN CNAME xyzxyzxyz.cloudfront.net
  • 等待 DNS 传播(请参阅 DNS TTL)(如果有新的 DNS 条目,速度会很快)

结尾

您现在应该能够使用https://files.mydomain.com/file. 该证书将是您生成的自定义证书,files.mydomain.com因此一切都会正常工作。

  • *我怀疑这是出于政治原因,并且可能允许亚马逊向需要此功能的用户收取更多费用。*我相信您在这一点上持悲观态度。启用对自定义 SSL 证书的支持会增加大量的技术复杂性,并且可以说超出了 S3 的核心能力。在某些配置中,您将通过 CloudFront 支付“更少”的费用。在 us-east-1 和 us-west-2 中,直接从 S3 下载的费用为 0.09 美元/GB,但从 CloudFront 的下载费用为 0.085 美元/GB(并且从 S3 到 CloudFront 的传输是免费的)。 (3认同)
  • 感谢迈克尔提供这些详细信息,我已经编辑了我的答案,我相信这会对许多人有所帮助 (2认同)