[英]Amazon S3: using DNS alias to bucket + HTTPS at the same time
我想在法兰克福区创建一个S3存储桶,并使用URL访问这些文件: https://files.stample.co/filename
: https://files.stample.co/filename
所以我同时想要HTTPS和自定义DNS别名(CNAME)。
根据我的理解,亚马逊有URL https://*.s3.amazonaws.com
的通配符证书。
所以这个通配符将:
https://stample-files.s3.amazonaws.com
https://files.stample.co.s3.amazonaws.com
所以我理解并通过其他StackOverflow 帖子确认的是,如果我希望SSL工作,我必须使用没有点的存储桶名称,否则带有通配符的Amazon证书将与存储区域不匹配。
在此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一起工作。
我能做些什么来使两者都有效? 在我看来,我想要实现的并不是很花哨......
根据您的意思,您可以同时执行这两项操作,但这需要更改您的方法并了解某些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等旧版浏览器不支持它)
我将以您希望使用https://files.mydomain.com
指向名为mydomain-files
的S3存储桶为例(存储桶名称不包含并且可以包含点)。
根据“Michael - sqlbot”anwser,它需要使用自定义证书。 我最初的假设是使用CNAME将允许在使用我的自定义域时使用Amazon S3通配符证书,但这是错误的:绝对需要自定义证书,并且可以仅使用CloudFront而不是S3进行设置。
您可以使用您想要的任何证书提供程序,但在这里我使用StartSSL (StartCom)提供免费的SSL证书(仅限于一个子域和1年)。
mydomain.com
的所有权 files.mydomain.com
创建证书 openssl rsa -in files.key -out files.key
cat sub.class1.server.ca.pem ca.pem >> chain.crt
/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/
files.mydomain.com
CUSTOM_CERTIFICATE_NAME
) https://xyzxyzxyz.cloudfront.net/file
等https://xyzxyzxyz.cloudfront.net/file
访问您的存储桶文件 mydomain.com
DNS配置 files IN CNAME xyzxyzxyz.cloudfront.net
添加CNAME: files IN CNAME xyzxyzxyz.cloudfront.net
您现在应该可以使用https://files.mydomain.com/file
访问您的文件。 证书将是为files.mydomain.com
生成的自定义证书,因此一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.