繁体   English   中英

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

[英]Amazon S3: using DNS alias to bucket + HTTPS at the same time

我想在法兰克福区创建一个S3存储桶,并使用URL访问这些文件: https://files.stample.co/filenamehttps://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一起工作。

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

根据您的意思,您可以同时执行这两项操作,但这需要更改您的方法并了解某些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

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

因此,可以通过HTTPS访问名称中带点的存储桶中的资源,但您必须知道存储桶的区域...尽管您无法使用https://your-cname.example.com访问它,因为SSL的工作方式一般。

目前似乎不可能只使用S3,但CloudFront可以支持自定义证书。

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

HOWTO与CloudFront

我将以您希望使用https://files.mydomain.com指向名为mydomain-files的S3存储桶为例(存储桶名称不包含并且可以包含点)。

需要自定义证书

根据“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分配源
  • 验证并等待部署完成:您应该使用https://xyzxyzxyz.cloudfront.net/filehttps://xyzxyzxyz.cloudfront.net/file访问您的存储桶文件

配置DNS

  • 打开mydomain.com DNS配置
  • files IN CNAME xyzxyzxyz.cloudfront.net添加CNAME: files IN CNAME xyzxyzxyz.cloudfront.net
  • 等待DNS传播(参见DNS TTL)(如果新的DNS条目可以快速)

结束

您现在应该可以使用https://files.mydomain.com/file访问您的文件。 证书将是为files.mydomain.com生成的自定义证书,因此一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM