教程:将 Let's Encrypt SSL 证书与 Lightsail Nginx 实例结合使用 - Amazon Lightsail

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

教程:将 Let's Encrypt SSL 证书与 Lightsail Nginx 实例结合使用

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

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

重要
  • 2020 年 7 月,Bitnami 实例使用的 Linux 发行版从 Ubuntu 更改为 Debian。由于此更改,本教程中的某些步骤将因实例的 Linux 发行版而异。在更改后创建的所有 Bitnami 蓝图实例都将使用 Debian Linux 发行版。在更改之前创建的实例将继续使用 Ubuntu Linux 发行版。要检查实例的发行版,请运行 uname -a 命令。响应会将 Ubuntu 或 Debian 显示为实例的 Linux 发行版。

  • Bitnami 正在修改许多堆栈的文件结构。本教程中的文件路径可能会发生变化,具体取决于您的 Bitnami 堆栈是使用本地 Linux 系统包(方法 A),还是自包含安装(方法 B)。要确定 Bitnami 安装类型以及要遵循的方法,请运行以下命令:

    test ! -f "/opt/bitnami/common/bin/openssl" && echo "Approach A: Using system packages." || echo "Approach B: Self-contained installation."

内容

步骤 1:完成先决条件

请完成以下先决条件(如果尚未完成):

完成先决条件后,请继续执行本教程的下一部分

步骤 2:在 Lightsail 实例上安装 Certbot

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

在 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
    注意

    如果您在运行 sudo apt-get install 命令时遇到 Could not get lock 错误,请等待大约 15 分钟,然后重试。此错误可能是由 cron 作业导致的,该作业使用 Apt 包管理工具来安装无人参与升级。

  5. 输入以下命令以将 Certbot 添加到本地 apt 存储库:

    注意

    步骤 5 仅适用于使用 Ubuntu Linux 发行版的实例。如果您的实例使用 Debian Linux 发行版,请跳过此步骤。

    sudo apt-add-repository ppa:certbot/certbot -y
  6. 输入以下命令来更新 apt,以包含新的存储库:

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

    sudo apt-get install certbot -y

    Certbot 现已安装到您的 Lightsail 实例上。

  8. 使基于浏览器的 SSH 终端窗口保持打开状态 - 您将在本教程的稍后部分返回到该窗口。继续执行本教程的下一部分

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

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

请求 Let's Encrypt SSL 通配符证书
  1. 在本教程的步骤 2 中使用的同一个基于浏览器的 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 记录。
  8. 使基于浏览器的 Lightsail SSH 会话保持打开状态 - 您将在本教程的稍后部分返回到此会话。继续执行本教程的下一部分

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

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

注意

要详细了解如何创建域的 Lightsail DNS 区域,请参阅在 Lightsail 中创建 DNS 区域以管理域的 DNS 记录

在 Lightsail 中将 TXT 记录添加到域的 DNS 区域
  1. 在 Lightsail 主页中,选择 Domains & DNS(域和 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. 选择 Save(保存)。

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

  9. 使 Lightsail 控制台浏览器窗口保持打开状态 - 您将在本教程的稍后部分返回到该窗口。继续执行本教程的下一部分

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

使用 MxToolbox 实用工具确认 TXT 记录已传播到 Internet 的 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 证书请求

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

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

    
            成功的 Let's Encrypt 证书请求。

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

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

    
            Let's Encrypt 证书续订日期。
  3. 您现在已拥有 Let's Encrypt SSL 证书,请继续执行本教程的下一部分

创建指向 Nginx 实例上 Nginx 服务器中的 Let's Encrypt SSL 证书文件的链接。此外,请备份现有证书,以便之后需要。

创建指向 Nginx 服务器目录中的 Let's Encrypt 证书文件的链接
  1. 在 Nginx 实例的基于浏览器的 Lightsail SSH 会话中,输入以下命令以停止运行基础服务:

    sudo /opt/bitnami/ctlscript.sh stop

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

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

    DOMAIN=domain

    示例:

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

    echo $DOMAIN

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

    
            确认域的环境变量。
  4. 分别输入以下命令,以重命名您的现有证书文件作为备份。请参阅本教程开头的重要提示,了解有关不同发行版和文件结构的信息。

    • 对于 Debian Linux发行版

      方法 A(使用系统包安装 Bitnami):

      sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.crt /opt/bitnami/nginx/conf/bitnami/certs/server.crt.old
      sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.key /opt/bitnami/nginx/conf/bitnami/certs/server.key.old

      方法 B(自包含 Bitnami 安装):

      sudo mv /opt/bitnami/nginx/conf/server.crt /opt/bitnami/nginx/conf/server.crt.old
      sudo mv /opt/bitnami/nginx/conf/server.key /opt/bitnami/nginx/conf/server.key.old
    • 对于使用 Ubuntu Linux 发行版的较旧实例:

      sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.crt /opt/bitnami/nginx/conf/bitnami/certs/server.crt.old
      sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.key /opt/bitnami/nginx/conf/bitnami/certs/server.key.old
  5. 分别输入以下命令,以创建指向 Nginx 服务器目录中的 Let's Encrypt 证书文件的链接。请参阅本教程开头的重要提示,了解有关不同发行版和文件结构的信息。

    • 对于 Debian Linux发行版

      方法 A(使用系统包安装 Bitnami):

      sudo ln -sf /etc/letsencrypt/live/$DOMAIN/privkey.pem /opt/bitnami/nginx/conf/bitnami/certs/server.key
      sudo ln -sf /etc/letsencrypt/live/$DOMAIN/fullchain.pem /opt/bitnami/nginx/conf/bitnami/certs/server.crt

      方法 B(自包含 Bitnami 安装):

      sudo ln -sf /etc/letsencrypt/live/$DOMAIN/privkey.pem /opt/bitnami/nginx/conf/server.key
      sudo ln -sf /etc/letsencrypt/live/$DOMAIN/fullchain.pem /opt/bitnami/nginx/conf/server.crt
    • 对于使用 Ubuntu Linux 发行版的较旧实例:

      sudo ln -s /etc/letsencrypt/live/$DOMAIN/privkey.pem /opt/bitnami/nginx/conf/bitnami/certs/server.key
      sudo ln -s /etc/letsencrypt/live/$DOMAIN/fullchain.pem /opt/bitnami/nginx/conf/bitnami/certs/server.crt
  6. 输入以下命令,以启动先前停止运行的基础服务:

    sudo /opt/bitnami/ctlscript.sh start

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

    
            实例服务已启动。

    您的 Nginx 实例现已配置为使用 SSL 加密。但是,流量不会自动从 HTTP 重新导向到 HTTPS。

  7. 继续执行本教程的下一部分

步骤 8:为 Web 应用程序配置 HTTP 到 HTTPS 重新导向

您可以为 Nginx 实例配置 HTTP 到 HTTPS 重新导向。自动从 HTTP 重新导向到 HTTPS 将使您的站点只能由使用 SSL 的客户访问,即使他们使用 HTTP 进行连接也是如此。请参阅本教程开头的重要提示,了解有关不同发行版和文件结构的信息。

本教程使用 Vim 来进行演示;但是,您可以使用您选择的任何文本编辑器。

对于 Debian Linux 发行版,为 Web 应用程序配置 HTTP 到 HTTPS 的重定向
方法 A(使用系统包安装 Bitnami):
  1. 在 Nginx 实例的 Lightsail 基于浏览器的 SSH 会话中,输入以下命令,以修改服务器块的配置文件。将 <ApplicationName> 替换为您的应用程序的名称。

    sudo vim /opt/bitnami/nginx/conf/server_blocks/<ApplicationName>-server-block.conf
  2. i 键进入 Vim 编辑器的插入模式。

  3. 使用以下示例中的信息编辑该文件:

    
            应用程序服务器块配置文件。
  4. ESC 键,然后输入 :wq 以写入(保存)您的编辑内容,然后退出 Vim。

  5. 输入以下命令,修改 Nginx 配置文件的服务器部分:

    sudo vim /opt/bitnami/nginx/conf/nginx.conf
  6. i 键进入 Vim 编辑器的插入模式。

  7. 使用以下示例中的信息编辑该文件:

    
            Nginx 配置文件。
  8. ESC 键,然后输入 :wq 以写入(保存)您的编辑内容,然后退出 Vim。

  9. 输入以下命令重新启动基础服务,以使编辑内容生效:

    sudo /opt/bitnami/ctlscript.sh restart
方法 B(自包含 Bitnami 安装):
  1. 在 Nginx 实例的 Lightsail 基于浏览器的 SSH 会话中,输入以下命令,以修改 Nginx 配置文件的服务器部分:

    sudo vim /opt/bitnami/nginx/conf/nginx.conf
  2. i 键进入 Vim 编辑器的插入模式。

  3. 使用以下示例中的信息编辑该文件:

    
            Nginx 配置文件。
  4. ESC 键,然后输入 :wq 以写入(保存)您的编辑内容,然后退出 Vim。

  5. 输入以下命令重新启动基础服务,以使编辑内容生效:

    sudo /opt/bitnami/ctlscript.sh restart
对于使用 Ubuntu Linux 发行版的较旧实例,为 Web 应用程序配置 HTTP 到 HTTPS 的重定向
  1. 在 Nginx 实例的基于浏览器的 Lightsail SSH 会话中,输入以下命令以使用 Vim 文本编辑器编辑 Nginx Web 服务器配置文件:

    sudo vim /opt/bitnami/nginx/conf/bitnami/bitnami.conf
  2. i 键进入 Vim 编辑器的插入模式。

  3. 在文件中,在 server_name localhost;include "/opt/bitnami/nginx/conf/bitnami/bitnami-apps-prefix.conf"; 之间输入以下文本:

    return 301 https://$host$request_uri;

    结果应该类似以下内容:

    
            针对 HTTP 到 HTTPS 重新导向编辑的 Nginx 配置文件。
  4. ESC 键,然后输入 :wq 以写入(保存)您的编辑内容,然后退出 Vim。

  5. 输入以下命令重新启动基础服务,以使编辑内容生效:

    sudo /opt/bitnami/ctlscript.sh restart

    您的 Nginx 实例现已配置为自动将连接从 HTTP 重新导向到 HTTPS。当访问者访问 http://www.example.com 时,系统会自动将其重新导向至已加密的 https://www.example.com 地址。

步骤 9:每 90 天续订一次 Let's Encrypt 证书

Let's Encrypt 证书的有效期为 90 天。证书可以在到期前 30 天续订。要续订 Let's Encrypt 证书,请运行用于获取它们的原始命令。重复本教程的请求 Let's Encrypt SSL 通配符证书部分中的步骤。