AWS SSL with Google S3 静态网站域

AWS SSL with Google Domain for static website in S3

我正在尝试将 HTTPS 添加到托管在 S3 存储桶中的静态网站,该网站的域是从 Google 的域购买的。我知道为了设置 CloudFront 分发,我需要将 SSL 证书从 AWS Certificate Manager 发送到 Google.

这是我所做的:

来自 AWS 证书管理器:

我看了指南 here, here, here and here 没有任何运气。

5 月 10 日更新:

非常感谢@hephalump 的帮助。除了他的回答,他还发给我 this super helpful link from AWS.

就我而言,它与 Geoff 的视频略有不同:

Name: mywebsite.com - Type: A - Value (ALIAS target): CloudFront Distribution (from the list).
Name: www.mywebsite.com - Type: A - Value (ALIAS target): mywebsite.com (on the bottom of the list). 

现在可以使用了。

由于您使用的是 AWS 服务,因此您可能希望认真考虑使用 Route53 作为您的 DNS;它会让你的生活更轻松。

即使您不使用 Route53,仍然可以使用 DNS 验证方法来验证您的证书。或者,如果这不起作用,您可以使用电子邮件验证方法,该方法也非常可靠。

要对 Google 个域使用 DNS 验证方法,您需要执行以下操作:

在 AWS Certificate Manager 证书确认屏幕上得到如下信息:

姓名: _3341936be9c722351e9e3345d5118ee28.yourdomain.com.

类型: CNAME

值: _3341936be9c722351e9e3345d5118ee28.ltfvzjuylp.acm-validations.aws.

转到 Google 域管理器并转到“自定义资源记录”部分。在第一个字段中输入 _3341936be9c722351e9e3345d5118ee28。在下拉菜单中 select CNAME。在 TTL 中输入 1H。在数据字段中输入 _3341936be9c722351e9e3345d5118ee28.ltfvzjuylp.acm-validations.aws。最后,点击添加。

那就等等。您必须等待 DNS 记录传播,并且必须等待 ACM 对其进行检查。最多可能需要 1 小时。

编辑: 因为看起来您正在使用 Route53 来处理您的 DNS,所以这真的很容易。无论您的存储桶位于何处,请确保您在 US-EAST-1(弗吉尼亚北部)区域申请证书。按照所有请求步骤进行操作,并在 "Step 4: Validation" 上生成证书后单击 "Create record in Route 53"。等待 5 分钟,如果 Route53 确实在处理您的 DNS,那么您的证书就可以使用了。

我正在尝试相同的方法,使用 Google 域 DNS 管理器添加 CNAME。对我来说,问题是,我没有添加字母数字部分,而是添加了包括域在内的整个字符串。一旦我删除它,我相信它可能只需要不到一个小时。浏览下面的 link 并特别注意 'important' 部分下的那个。 https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-validate-dns.html

从上面link.

The CNAME information that you need does not include the name of your domain. If you include your domain name in the DNS database CNAME record, validation fails. For example, the displayed Name may resemble the following:

_a79865eb4cd1a6ab990a45779b4e0b96.yourdomain.com However, the required CNAME information only includes the following:

_a79865eb4cd1a6ab990a45779b4e0b96

@hephalump 所说的一切,而且——而且我不是网络工程师,所以对此有深入的了解将不胜感激:

我在我的 google 域上使用 AWS 名称服务器作为我的自定义名称服务器——所以即使我认为我的域没有在 AWS 上注册,CNAME 记录仍然需要放在路由 53 中

如果您交换了名称服务器——将 CNAME 添加到 Route53 而不是 google

1。设置 S3 存储桶

创建存储桶
  • Select“创建存储桶”
  • 对于存储桶名称,它必须与您的域名相匹配,包括 www.所以它必须是 www.<您的网站名称>.com。如果它与您的域名不匹配,很确定 none 这将起作用。
  • 可选(这仅用于测试目的,如果您需要它,请在一切正常后将其更改回来,我将在下面的“额外步骤”部分中指导您完成):取消选中“全部阻止”public 访问权限,以及 select “我承认当前设置可能会导致此存储桶和其中的对象变为 public”。一旦所有内容都连接到您的域,您绝对应该将此更改回阻止,但就目前而言,这将允许您确保至少您的 S3 存储桶正在运行。
  • 您不必添加标签,但为了命名和方便您自己,请创建标签。对于键,将其称为“名称”,对于值,将其称为 -Bucket。无需在 Tag 值中包含“www”,只需一个名称即可。
  • 保留所有其他值的默认值。
  • Select“创建存储桶”
添加文件
  • 从主页点击进入您的新存储桶以查看详细信息。
  • 现在上传您的 index.html 和 error.html 文件,以及任何其他附加文件。
  • Select全部。通过 selecting“Actions”和 selecting“Make public”使它们全部 public。自 2021 年 11 月起,AWS 现已更改此设置,您应该在策略中而不是在此处执行此操作,但您现在必须选择“使用 ACL 创建 public”,这需要进入存储桶的权限 -> 对象所有权和 select 正在“启用 ACLS”。
属性
  • 在底部的属性中,在“静态网站托管”下 select“编辑”。
  • 启用静态网站托管。并分别为索引和错误文档输入“index.html”和“error.html”。
可选但需要完成之前的可选任务(因此用于测试您的 S3 存储桶):权限

您最终将只允许 OAI 的权限,如前所述,阻止您不希望人们能够直接访问您的 S3 存储桶,并且只能通过您的域名访问您的网站,当S3 存储桶是 http,但如果您愿意,出于测试目的,请继续执行以下操作。 在权限中,在存储桶策略中,select 编辑并放置它,一旦我们有了 OAI,我们将再次更改它:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.<your website name>.com/*"
        }
    ]
}
S3 存储桶的最终说明

如果您在连接到您的 CloudFront 分配之前忘记启用静态网站托管,则会在尝试查看您的网站时导致此错误: 如果发生这种情况,您可以尝试将您的 CloudFront 分配重新连接到您的 S3 存储桶,可以这么说 re-register 事情。不知道这是为什么。

2。证书管理器

前往证书管理器

非常重要: 从您的当前位置更改为 美国东部(弗吉尼亚北部)us-east-1。无论如何,必须从该区域请求证书。如果您不这样做,而是以北加州为例,当您进入下一步即 Cloudfront 时,您的 ssl 证书将不会显示,您将无法完成 HTTPS 设置。不完全确定这是为什么,但要使用 CloudFront,证书的区域必须是 美国东部(弗吉尼亚北部)us-east-1.

提出请求
  • Select“请求”。
  • 对于“证书类型”,将其留在“请求 public 证书”。
  • 对于“完全限定的域名”,请输入您的 <您的网站名称>.com,并添加第二个 www.<您的网站名称>.com。
  • Select DNS 验证而不是电子邮件。只要您的 Google 域记录中有 CNAME 记录(在发出此请求后将提供),您就永远不必担心再次更新证书。如果您使用电子邮件路线,则必须每年更新一次,我不会为此担心。 Select DNS验证,就好了。
  • Select 提出请求并转到状态页面。
将 CNAME 记录添加到 Google 个域
  • 现在,在 AWS Certificate Manager 的“证书”页面上,它会显示您的状态为待处理。
  • 点击进入您刚刚提出的证书申请。您应该看到 www.<您的网站名称>.com 和您的 <您的网站名称>.com 的 CNAME 名称和 CNAME 值。如果值为空,这是可能发生的故障,只需刷新页面直到它们出现,它们应该显示马上起来。
  • 复制这些 CNAME 名称和 CNAME 值。您会将这些放入您的 Google 域中。
  • 在 Google 域中,转到 DNS。
  • 创建两条 CNAME 记录,一条用于您的裸域,一条用于另一个。因此,对于 www..com 主机名将类似于:_123a456789012b3456c7d8ef901a234b.www,类型:CNAME,DATA 类似于:_fe098765432dc10b987a65f43e21098d.abcdefghij.acm-validations.aws.
  • 对于另一条记录(裸域),获取与您的域名相关联的 CNAME 名称和值,并执行与您之前创建的记录相同的操作。需要明确的是,裸域的 CNAME 名称和值应该与 www..com.
  • 不同
  • 请务必将您的域名留在外面,因为 Google Domains 会自动为您附加此域名,否则您的域名将在主机名中出现两次,例如 _123a456789012b3456c7d8ef901a234b.<您的网站名称>.com。 <您的网站名称>.com。 这会导致错误
  • Select 保存并返回 AWS。
等待成功状态

对我来说,在 Google 域中路由后花了 4 分钟才颁发了我的证书。所以,在等待的时候啜饮咖啡,喘口气!应该不会太长。

证书状态将更改为“已颁发”。

3。 CloudFront

前往 AWS 中的 CloudFront。

  • Select 创建分布。
  • 来源域名:www.<您的网站名称>.com.s3.amazonaws.com
  • 仍在学习中,但对于原始路径,请尝试留空,将“index.html”或“/index.html”放在这里对我来说是错误的。一旦您阻止所有 public 访问并仅允许您的 OAI(稍后将详细介绍 OAI),您可能 运行 会出现下面屏幕截图中显示的错误,请在评论中告诉我什么有效,以及我可以修复此步骤:
  • 查看器协议策略:将 HTTP 重定向到 HTTPS 允许的 HTTP 方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
  • 在底部,在“设置”下,select“添加项目”为“备用域名”,然后输入 www.<您的网站名称>.com,因为这应该与您指向的存储桶相匹配到.
  • 对于自定义 SSL 证书 select 您的新证书。 如果你没有看到它,那么很可能你没有 select N。弗吉尼亚州作为在证书管理器中制作证书时的区域。
  • 保持所有其他默认值,select“创建分发”以完成。

4。 53 号公路

创建托管区域
  • Select 创建托管区域。
  • 执行以下操作:域名:www.<您的网站名称>.com.
  • 将类型保留为“Public 托管区域”
  • 如果需要,请添加说明和标签。
  • 并创建。
向 CloudFront 的 Route 53 托管区域添加记录

现在转到托管区域详细信息(如果您还没有被带到那里)。您现在将创建一条连接到我们的 CloudFront 分配的记录,以将其添加到您的托管区域中应该已经存在的两条记录的列表中。

  • Select 创建记录
  • 打开别名。
  • 对于“将流量路由到”select“CloudFront 分配的别名”
  • 您应该会看到您的 CloudFront 分配显示,类似于:dd56opwkqiwae.coudfront.net。 Select这个。
  • 现在通过 select 在底部创建记录来完成。

您现在已经完成了 AWS 方面的工作。

5。 Google 域

您需要为 www.<您的网站名称>.com 创建 CNAME 记录以连接到您的 Cloudfront 分配,并从 <您的网站名称>.com 重定向到 www.<您的网站名称>.com这样您的用户就可以输入您的裸域名并仍然可以访问您的网站。如果 google 域支持 ANAME/ALIAS 记录,你可以做不同的事情,你也可以为你的裸域 .com 和路由 .com 创建一个 Cloudfront 分布在 Google 域中它自己的 CloudFront 分布。但是由于 Google 不支持 ANAME/ALIAS 记录,您必须将您的裸域重定向到您的域,然后将您的域重定向到您的 CloudFront。此外,您还必须为您的裸域创建一个 s3 存储桶,您可以在其中将其指向另一个 s3 存储桶。但您不必担心这一点,因为 Google 域首先不支持 ANAME/ALIAS 记录。如果它让你感觉更好,amazon.com 重定向到 www.amazon.com,因此将裸域重定向到 www url 不仅很常见,而且被大人物使用。

这很有趣,AWS docs at the time of writing this say create a Synthetic Record within Google Domains,但是 Google Domains 最近更改了它们的界面。它不再称它们为“DNS”页面中的“综合记录”,相反,您必须:

  • 转到 Google 域的“网站”页面并单击“转发域”

  • 在这里,将您的<您的网站名称>.com裸域名转发到https://www.<您的网站名称>.com。
  • Select“高级选项”和select“转发路径”和“启用 SSL”。
  • 然后转到您的 DNS 页面,在那里创建一个 CNAME 记录,将您的 www.<您的网站名称>.com 指向您的 CloudFront 分配。

我屏蔽了我的信息,还放入了虚假的示例数据,让您了解您的 AWS 记录在 Google 域中应该是什么样子。

恭喜您成功拥有一个HTTPS网站!

因此,当有人访问 <您的网站名称>.com 时,Google Domains 会将其重定向到 www.<您的网站名称>.com,然后执行 CNAME 查找并找到您的 CloudFront 分配 url.从拥有您的 SSL 证书的 CloudFront,Route 53 发现 CloudFront 分配已到达并为您的 S3 存储桶静态站点提供服务。

额外步骤

现在您已经有了它,您的用户可以使用 https 通过您的域名访问 S3 存储桶,您想要关闭直接访问存储桶(这是 http 而不是 https 等原因)。因此,首先转到 CloudFront。

1。 CloudFront

  • 在 CloudFront 中的安全性下,单击源访问身份。
  • Select“创建新的源访问身份”
  • 随便你怎么称呼它,但为了保持不变,继续称它为<你的网站名称>-OAI。
  • 转到 CloudFront 分配。
  • 单击您的分配。
  • Select“起源”
  • Select你的来源显示在列表里。
  • Select“编辑”
  • 在 S3 存储桶访问下,select 是使用 OAI(存储桶只能访问 CloudFront)
  • 从出现的 Origin Access Identity 下拉菜单中,select 您刚刚创建的新 OAI。
  • Select“是的,更新存储桶策略”。您仍然需要转到 S3 并删除我们在本教程开头设置的先前允许策略,该策略只是可选的,因为它用于测试目的。
  • Select 在底部“保存更改”,您现在已经连接了 OAI。

2。 S3

  • 现在前往 S3。
  • Select 你的桶。
  • 只有您的 OAI 需要访问权限,因此您现在应该阻止所有 public 访问权限。因此,在权限中,在阻止 public 访问(存储桶设置)下,继续并立即阻止所有访问。在存储桶策略下,您应该具有以下内容:

JSON 用于 OAI,如果您在上一步中 select 编辑了“是的,更新存储桶策略”,则应该已设置。我在操作列表中添加了“s3:PutObject”,如下所示

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <your OAI ID>"
           },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
           "Resource": "[resource_name]"
        }
    ]
}

现在用户应该只能通过 CloudFront 进入您的静态网站,而不能直接通过您的 S3 存储桶。