10

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

这就是我所做的:

从 AWS 证书管理器:

  • 申请证书
  • 申请公共证书
  • 域名:*.myweb.commyweb.com,按照这个答案在这里
  • 验证方式:DNS验证
  • 然后我有Name,TypeValue我的 CNAME。
  • 我去了 Google Domains,将我从 AWS 获得的值添加到:DNS/自定义资源记录,但我的 AWS 证书请求仍在等待中。我之前尝试过,但请求没有被接受,所以它们过期了。

我已经在这里这里这里这里查看了指南,但没有任何运气。

5 月 10 日更新:

非常感谢@hephalump 的帮助。除了他的回答之外,他还从 AWS 向我发送了这个超级有用的链接

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

  • 创建 CloudFron Distribution 后,我向 AWS Route 53 托管区域添加了 2 个记录集:
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). 

现在它可以工作了。

4

4 回答 4

8

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

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

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

在 AWS Certificate Manager 证书确认屏幕上,得到如下内容:

姓名: _3341936be9c722351e9e3345d5118ee28.yourdomain.com.

类型: CNAME

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

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

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

编辑: 由于您似乎正在使用 Route53 来处理您的 DNS,这真的很容易。无论您的存储桶在哪里,请确保您在 US-EAST-1(弗吉尼亚北部)区域申请您的证书。按照所有请求步骤和“步骤 4:验证”,当证书生成时,单击“在 Route 53 中创建记录”。等待 5 分钟,如果 Route53 确实在处理您的 DNS,那么您的证书就可以使用了。

展开图片

于 2019-05-04T20:18:58.237 回答
4

1. 设置 S3 存储桶

创建存储桶
  • 选择“创建存储桶”</li>
  • 对于存储桶名称,它必须与您的域名匹配,包括 www。所以它必须是 www.<您的网站名称>.com。如果它与您的域名不匹配,那么很确定这一切都不起作用。
  • 可选(如果您需要,这仅用于测试目的,一旦一切正常,我将在下面的额外步骤部分指导您完成此操作):取消选中阻止所有公共访问,然后选择“我承认当前设置可能会导致此存储桶和其中的对象公开”。一旦一切都连接到您的域,您绝对应该将其更改回阻止,但现在,这将允许您确保至少您的 S3 存储桶正在工作。
  • 您不必添加标签,但为了命名和方便您自己,请制作标签。对于键,将其称为“名称”,对于值,将其称为 <您的网站>-Bucket。无需在 Tag 值中包含“www”,再次只是一个可以帮助您的名称。
  • 将所有其他值保留为默认值。
  • 选择“创建存储桶”
添加文件
  • 从主页单击进入您的新存储桶以了解详细信息。
  • 现在上传您的 index.html 和 error.html 文件,以及任何其他附加文件。
  • 全选。通过选择“操作”并选择“公开”将它们全部公开。
特性
  • 在底部的属性中,在“静态网站托管”下选择“编辑”。
  • 启用静态网站托管。并分别为索引和错误文档放入“index.html”和“error.html”。
可选,但需要完成前面的可选任务(以便测试您的 S3 存储桶):权限

您最终将只允许 OAI 的权限,如前所述,阻止您不希望人们能够直接访问您的 S3 存储桶,并且仅通过您的域名访问您的网站,当 S3 存储桶为 http 时,该域名将具有 https,但如果您愿意,出于测试目的,请继续执行以下操作。在 Permissions 中的 Bucket policy 中,选择 edit 并放置它,一旦我们有了 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 存储桶以重新注册内容,以便说话。不知道这是为什么。

2. 证书管理器

前往证书管理器

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

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

对我来说,在 Google Domains 中进行路由后,我花了 4 分钟才获得证书。所以,在你等待的时候,啜饮咖啡,喘口气!它不应该很长。

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

3.云前

前往 AWS 中的 CloudFront。

  • 选择创建分发。
  • 源域:www.<您的网站名称>.com.s3.amazonaws.com
  • 对于 Origin Path 放置“index.html”。如果不这样做,一旦您阻止所有公共访问并只允许您的 OAI(稍后将详细介绍 OAI),您将遇到下面屏幕截图中显示的此错误: 在此处输入图像描述
  • 查看器协议策略:将 HTTP 重定向到 HTTPS 允许的 HTTP 方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
  • 在底部,在“设置”下,为“备用域名”选择“添加项目”,然后输入 www.<您的网站名称>.com,因为这应该与您指向的存储桶匹配。
  • 对于自定义 SSL 证书,请选择您的新证书。如果您没有看到它,那么很可能您在证书管理器中制作证书时没有选择N. Virginia作为区域。
  • 保持所有其他默认设置并选择“创建分发”完成。

4. 53号公路

创建托管区域
  • 选择创建托管区域。
  • 执行以下操作: 域名:www.<您的网站名称>.com。
  • 将类型保留为“公共托管区域”
  • 如果需要,请添加描述和标签。
  • 现在完成
将记录添加到 CloudFront 的 Route 53 托管区域

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

  • 选择创建记录
  • 打开别名。
  • 对于“将流量路由到”,选择“别名到 CloudFront 分配”</li>
  • 您应该会看到您的 CloudFront 分配出现,例如:dd56opwkqiwae.coudfront.net。选择这个。
  • 现在完成选择底部的创建记录。

您现在已经完成了 AWS 端。

5. 谷歌域名

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

现在这很有趣,撰写本文时的 AWS 文档说在 Google Domains 中创建一个合成记录,但 Google Domains 最近更改了他们的界面。它不再在他们的“DNS”页面中将它们称为“合成记录”,您必须转到 Google Domain 的“网站”页面并单击“转发域”并在那里转发您的裸域 <您的网站名称>.com到 www.<您的网站名称>.com。然后转到您的 DNS 页面,并在那里创建一条 CNAME 记录,将您的 www.<您的网站名称>.com 指向您的 CloudFront 分配。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我屏蔽了我的信息,还输入了假样本数据,让您了解您的 AWS 记录在 Google Domains 中应该是什么样子。 在此处输入图像描述

恭喜您成功拥有 HTTPS 网站!

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

额外步骤

现在您已经拥有它,以便您的用户可以使用 https 通过您的域名访问 S3 存储桶,您希望关闭存储桶直接访问(这是 http 而不是 https 以及其他原因)。所以,首先去 CloudFront。

1.云前

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

2. S3

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

OAI 的 JSON,如果您在上一步中选择了“是,更新存储桶策略”,则应该已设置。我在操作列表中添加了“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 存储桶。

于 2021-10-20T01:11:25.367 回答
3

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

从上面的链接。

您需要的 CNAME 信息不包括您的域名。如果您在 DNS 数据库 CNAME 记录中包含您的域名,验证将失败。例如,显示的名称可能类似于以下内容:

_a79865eb4cd1a6ab990a45779b4e0b96.yourdomain.com 但是,所需的 CNAME 信息仅包括以下内容:

_a79865eb4cd1a6ab990a45779b4e0b96

于 2020-08-25T14:22:53.280 回答
0

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

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

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

于 2020-10-23T03:09:54.383 回答