View a markdown version of this page

使用 Let's Encrypt 和 Certbot 在 Nginx 实例上启用 HTTPS - Amazon Lightsail

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Let's Encrypt 和 Certbot 在 Nginx 实例上启用 HTTPS

使用 Lightsail 负载均衡器,Amazon SSL/TLS Lightsail 可以轻松保护您的网站和应用程序。但是,使用 Lightsail 负载均衡器通常可能不是正确的选择。您的站点可能不需要负载均衡器提供的可扩展性或容错能力,或者您可能针对成本进行了优化。

在后一种情况下,您可能会考虑使用 Let's Encrypt 获取免费 SSL 证书。如果是这样,一切都没有问题。您可以将这些证书与 Lightsail 实例集成。本教程向您展示如何使用 Certbot 申请 Let's Encrypt 通配符证书,并将其与您的 Nginx 实例集成。

内容

步骤 1:完成先决条件

如果您尚未完成以下先决条件,请完成这些先决条件:

第 2 步:在你的 Lightsail 实例上安装 Certbot

Certbot 是一个客户端,用于向 Let's Encrypt 请求证书并将其部署到 Web 服务器。Let's Encrypt 使用 ACME 协议来颁发证书,而 Certbot 是与 Let's Encrypt 交互的 ACME-enabled 客户端。

在你的 Lightsail 实例上安装 Certbot
  1. 登录 Lightsail 控制台

  2. 在 Lightsail 主页的实例选项卡上,选择要连接的实例的 SSH 快速连接图标。

    在 Lightsail 主页上使用 SSH 快速连接。
  3. 连接基于 Lightsail 浏览器的 SSH 会话后,输入以下命令以更新实例上的软件包:

    sudo apt-get update
  4. 输入以下命令以安装软件属性包。Certbot 的开发者使用个人软件包档案 (PPA) 来分发 Certbot。借助软件属性包,您可以更高效地使用 PPA。

    sudo apt-get install software-properties-common -y
  5. 输入以下命令来更新 apt,以包含新的存储库:

    sudo apt-get update -y
  6. 输入以下命令以安装 Certbot:

    sudo apt-get install certbot -y

    Certbot 现已安装在你的 Lightsail 实例上。

步骤 3:请求 Let's Encrypt SSL 通配符证书

开始向 Let's Encrypt 申请证书的过程。使用 Certbot 请求通配符证书,您可以将单个证书同时用于某个域及其子域。例如,一个通配符证书可适用于 example.com 顶级域、blog.example.com 以及 stuff.example.com 子域。

申请 Let's Encrypt SSL 通配符证书
  1. 在本教程上一步中使用的基于浏览器的 SSH 终端窗口中,输入以下命令为您的域设置环境变量。请务必将 domain 替换为您注册的域名。

    DOMAIN=domain WILDCARD=*.$DOMAIN

    示例:

    DOMAIN=example.com WILDCARD=*.$DOMAIN
  2. 输入以下命令以确认变量返回正确的值:

    echo $DOMAIN && echo $WILDCARD

    您应该会看到类似以下内容的结果:

    确认域的环境变量。
  3. 输入以下命令以交互模式启动 Certbot。此命令指示 Certbot 使用具有 DNS 质询的手动授权方法验证域所有权。它可以为您的顶级域及其子域请求通配符证书。

    sudo certbot -d $DOMAIN -d $WILDCARD --manual --preferred-challenges dns certonly
  4. 出现提示时输入您的电子邮件地址,因为该地址用于续订和安全通知。

  5. 阅读 Let's Encrypt 服务条款。阅读完后,如果您同意该服务条款,请按 A。如果您不同意,则无法获得 Let's Encrypt 证书。

  6. 针对共享您电子邮件地址的提示以及有关您的 IP 地址已被记录的警告相应地做出响应。

  7. Let's Encrypt 现在会提示您验证您是否拥有指定的域名。您可以通过将 TXT 记录添加到域的 DNS 记录执行此操作。系统会提供一组 TXT 记录值,如以下示例所示:

    注意

    Let's Encrypt 可以提供您必须用于验证的单个或多个 TXT 记录。在本示例中,向我们提供了两个 TXT 记录用于验证。

    Let's Encrypt 证书的 TXT 记录。

步骤 4:将 TXT 记录添加到域的 DNS 区域

将 TXT 记录添加到您的域的 DNS 区域中会验证您拥有该域。出于演示目的,我们使用 Lightsail DNS 区域。但是,该步骤可能类似于通常由域注册商托管的其他 DNS 区域。

注意

要详细了解如何为您的域名创建 Lightsail DNS 区域,请参阅在 L ightsail 中创建 DNS 区域来管理您的域名的 DNS 记录

在 Lightsail 中向你的域名的 DNS 区域添加 TXT 记录
  1. 在左侧导航窗格中,选择域和 DNS

  2. 在页面的 DNS 区域部分下,选择您在 Certbot 证书请求中指定的域的 DNS 区域。

  3. 在 DNS 区域编辑器中,选择 DNS records(DNS 记录)。

  4. 选择添加记录

  5. Record type(记录类型)下拉菜单中,选择 TXT record(TXT 记录)。

  6. 将 Let's Encrypt 证书请求指定的值输入到 Record name(记录名称)和 Responds with(响应内容)字段中。

    注意

    Lightsail 控制台会预先填充域的顶级域部分。例如,如果想要添加子域 _acme-challenge.example.com,您只需在文本框中输入 _acme-challenge,您保存此记录时 Lightsail 会添加 .example.com 部分。

  7. 选择保存

  8. 重复执行第 4 至 7 步,以添加 Let's Encrypt 证书请求指定的另一组 TXT 记录。

  9. 保持 Lightsail 控制台浏览器窗口处于打开状态,本教程稍后将返回该窗口。继续阅读本教程的下一部分

步骤 5:确认 TXT 记录已传播

使用该 MxToolbox 实用程序确认 TXT 记录已传播到互联网的 DNS。DNS 记录传播可能需要一段时间,具体取决于您的 DNS 托管提供商以及已为 DNS 记录配置的生存时间 (TTL)。请务必完成此步骤,并确认您的 TXT 记录已传播,然后再继续执行 Certbot 证书请求。否则,您的证书请求将失败。

确认 TXT 记录已传播到 Internet 的 DNS
  1. 打开一个新的浏览器窗口并转至https://mxtoolbox.com/TXTLookup.aspx

  2. 在文本框中输入以下文本。请务必将 domain 替换为您的域。

    _acme-challenge.domain

    示例:

    _acme-challenge.example.com
    MxToolbox 查找 TXT 记录。
  3. 选择 TXT Lookup (TXT 查找) 以运行检查。

  4. 此时将出现以下任一响应:

    • 如果您的 TXT 记录已传播到 Internet 的 DNS,您将看到类似于以下屏幕截图中所示的响应。关闭浏览器窗口,然后继续执行本教程的下一部分

      确认 TXT 记录已传播。
    • 如果您的 TXT 记录尚未传播到 Internet 的 DNS,您会看到 DNS Record not found (未找到 DNS 记录) 响应。确认您已将正确的 DNS 记录添加到域的 DNS 区域。如果您已添加正确的记录,请等待一段时间,让域的 DNS 记录传播,然后再次运行 TXT 查找。

步骤 6:完成 Let's Encrypt SSL 证书请求

返回您的实例的基于 Lightsail 浏览器的 SSH 会话,然后完成 Let's Encrypt 证书申请。Certbot 会将您的 SSL 证书、链和密钥文件保存到实例上的特定目录中。

完成 Let's Encrypt SSL 证书请求
  1. 在您的实例的基于 Lightsail 浏览器的 SSH 会话中,按 Enter 继续您的 Let's Encrypt SSL 证书申请。如果成功,系统将显示类似于以下屏幕截图中的响应:

    成功申请 “让我们加密” 证书。

    此消息可确认您的证书、证书链和密钥文件都存储在 /etc/letsencrypt/live/domain/ 目录中。请务必将 domain 替换为您的域,如 /etc/letsencrypt/live/example.com/

  2. 记录消息中指定的到期日期。您可以在该日期之前续订证书。

    让我们加密证书续订日期。

第 7 步:在 Nginx 中更新 SSL 配置并将流量从 HTTP 重定向到 HTTPS

更新 Nginx 的 default.conf 中的 SSL 配置
  1. 在 Nginx 实例的 SSH 会话中,输入以下命令以停止底层服务:

    sudo systemctl stop nginx sudo systemctl stop mariadb sudo systemctl stop php8.2-fpm

    您可以看到类似以下内容的响应:

    Nginx 实例服务已停止。
  2. 输入以下命令,为您所在域设置环境变量。您可以更高效地复制和粘贴命令来链接证书文件。请务必将 domain 替换为您注册的域名。

    DOMAIN=domain

    示例:

    DOMAIN=example.com
  3. 输入以下命令以确认变量返回正确的值:

    echo $DOMAIN

    您应该会看到类似以下内容的结果:

    确认域的环境变量。
  4. 运行以下命令更改 SSL 配置:

    注意

    如果您在步骤 3 中设置DOMAIN变量后关闭了基于浏览器的 SSH 终端窗口,请DOMAIN=example.com再次运行,example.com替换为您的域。

    sudo sed \ -i -e "s|ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem|ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem|g" \ -i -e "s|ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key|ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem|g" \ /etc/nginx/conf.d/default.conf
  5. 覆盖default.conf文件后,运行以下命令检查配置并重启 Nginx

    sudo nginx -t sudo systemctl restart nginx sudo systemctl restart mariadb sudo systemctl restart php8.2-fpm

    您应该会看到类似以下内容的结果:

    Nginx 实例服务已启动。

    你的 Nginx 实例现已配置为使用 SSL 加密,流量将从 HTTP 重定向到 HTTPS

第 8 步:每 90 天续订 Let's Encrypt 证书

Let's Encrypt 证书的有效期为 90 天。证书可以在到期前 30 天续订。要续订 Let's Encrypt 证书,请重复步骤 3:申请 Let's Encrypt SSL 通配符证书