【问题标题】:Amazon S3: using DNS alias to bucket + HTTPS at the same timeAmazon S3:同时使用 DNS 别名来存储桶 + HTTPS
【发布时间】:2015-12-19 06:46:38
【问题描述】:

我想在法兰克福区域创建一个 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 posts 确认的是,如果我希望 SSL 工作,我必须使用不带点的存储桶名称,否则带有通配符的 Amazon 证书将与存储桶域不匹配。

使用 DNS 别名/CNAME

在此S3 documentation 下,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.net.s3.amazonaws.com,http://images.johnsmith.net/filename 将与 http://images.johnsmith.net.s3.amazonaws.com/filename 相同。

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

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

所以我在这里理解的是,要使 CNAME 起作用,我们必须在存储桶名称中使用点。

两者一起?

如果我在存储桶名称中使用点:

  • SSL 不起作用
  • CNAME 将起作用

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

  • SSL 可以工作
  • CNAME 不起作用

我已经测试了这两种情况,但无法使 SSL 和 CNAME 一起正常工作。

我该怎么做才能让两者都发挥作用?在我看来,我想要实现的不是很花哨......

【问题讨论】:

    标签: amazon-web-services amazon-s3 https dns cname


    【解决方案1】:

    目前看来仅使用 S3 是不可能的,但使用 CloudFront 是可能的,因为它支持自定义证书。

    CloudFront 不是很贵,在某些情况下甚至可能比 S3 便宜。使用SNI时免费支持自定义证书(但旧版浏览器不支持,如

    如何使用 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
    • 使用来自here 的 StartSSL 文件生成证书链:cat sub.class1.server.ca.pem ca.pem >> chain.crt

    上传证书到 AWS

    • 安装 AWS CLI 上传证书(注意密钥必须未加密,证书为 PEM 格式,CloudFront 需要证书链)。您必须选择名称和路径(选择您想要的,但路径应以 /cloudfront/ 开头
    • 将您的证书上传到 AWS 以供 Cloudfront 使用,如记录的 here: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

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

    配置 DNS

    • 打开您的mydomain.com DNS 配置
    • 添加 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 的传输是免费的)。
    • 感谢迈克尔提供的这些详细信息,我已经编辑了我的 anwser,我相信它会对许多人有所帮助
    【解决方案2】:

    根据您的意思,您可以同时执行这两种操作,但这需要您改变方法并了解一些 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 获取内容,然后从存储桶中提取内容。

    现在...假设这不是您要问的...假设您不希望自己的域使用 Amazon 的证书在 SSL 中工作...您可以配置一个带点名称的存储桶,允许您创建一个 CNAME 来托管您的“example.com”内容......并且仍然使用 HTTPS 访问存储桶。但是,由于上述原因,您无法使用 SSL 使用 CNAME 访问它...因为您的主机名与 S3 的 SSL 证书上的主机名不匹配。

    但是,如果您想通过 SSL 访问名称中带有点的存储桶,您可以使用配置存储桶的区域端点来执行此操作。

    us-west-2 区域中的“example.com”存储桶将通过将存储桶名称放在第一部分(如果是路径而不是主机名的开头)来解决......就像这样:

    https://s3-us-west-2.amazonaws.com/example.com/path/to/file.jpg
    

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

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

    【讨论】:

    • 感谢迈克尔。我添加了我自己的答案,解释了如何使用 CloudFront 来做文档。实际上我知道你所说的一切,除了我认为 Amazon S3 通配符证书可能与我的自定义域匹配,以防 CNAME 重定向到 S3,但事实并非如此
    • 它不匹配,特别是因为浏览器地址栏中的主机名 - 不是可能在 DNS 中用于解析目标的中间主机名 - 是浏览器用来验证提供的证书的由服务器。 CloudFront 使用服务器名称标识 (SNI),浏览器在其中提供它期望在证书中看到的主机名,这就是 CloudFront 可以为任何给定请求提供正确证书的方式,假设它有这样的证书要提供。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-08-25
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多