

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

# 使用 Let's Encrypt SSL/TLS 保护你的 Lightsail NGINX 网站
<a name="amazon-lightsail-using-lets-encrypt-certificates-with-nginx"></a>

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

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

## 确定你的 Nginx 蓝图供应商
<a name="get-nginx-vendor"></a>

 在你的 Nginx 实例在 Amazon Lightsail 上启动并运行之后，你应该采取以下几个步骤来开始使用。在开始之前，请在实例管理页面上确定您的蓝图供应商：

![\[实例管理页面上的 Nginx 蓝图供应商\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/headers/nginx-blueprint-vendor.png)


为你的 Nginx 实例选择合适的指南：

------
#### [ Bitnami ]

**重要**  
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：完成先决条件](#complete-the-prerequisites-lets-encrypt-nginx)
+ [第 2 步：在你的 Lightsail 实例上安装 Certbot](#install-certbot-on-your-instance-nginx)
+ [步骤 3：请求 Let's Encrypt SSL 通配符证书](#request-a-lets-encrypt-certificate-nginx)
+ [步骤 4：将 TXT 记录添加到域的 DNS 区域](#add-a-text-record-to-your-domains-dns-zone-lets-encrypt-nginx)
+ [步骤 5：确认 TXT 记录已传播](#confirm-the-text-records-have-propagated-lets-encrypt-nginx)
+ [步骤 6：完成 Let's Encrypt SSL 证书请求](#complete-the-lets-encrypt-certificate-request-nginx)
+  [第 7 步：在 NGINX 服务器目录中创建指向 Let's Encrypt 证书文件的链接](#link-the-lets-encrypt-certificate-files-in-the-nginx-directory-nginx) 
+ [步骤 8：为 Web 应用程序配置 HTTP 到 HTTPS 重新导向](#configure-http-to-https-redirection-nginx)
+ [步骤 9：每 90 天续订一次 Let's Encrypt 证书](#renew-a-lets-encrypt-certificate-nginx)

## 步骤 1：完成先决条件
<a name="complete-the-prerequisites-lets-encrypt-nginx"></a>

请完成以下先决条件（如果尚未完成）：
+ 在 Lightsail 中创建一个 Nginx 实例。要了解更多信息，请参阅[创建实例](how-to-create-amazon-lightsail-instance-virtual-private-server-vps.md)。
+ 注册一个域名，并获取管理访问权限以编辑其 DNS 记录。要了解更多信息，请参阅 [DNS](understanding-dns-in-amazon-lightsail.md)。
**注意**  
我们建议您使用 Lightsail DNS 区域来管理域名的 DNS 记录。要了解更多信息，请参阅[创建 DNS 区域以管理域的 DNS 记录](lightsail-how-to-create-dns-entry.md)。
+ 在 Lightsail 控制台中使用基于浏览器的 SSH 终端来执行本教程中的步骤。但是，您也可以使用自己的 SSH 客户端（如 PuTTY）。要了解有关配置 PuTTY 的更多信息，请参阅在 [Amazon Lightsail 中下载并设置 PuTTY 以使用 SSH 进行连接](lightsail-how-to-set-up-putty-to-connect-using-ssh.md)。

完成先决条件后，请继续执行本教程的[下一部分](#install-certbot-on-your-instance-nginx)。

## 第 2 步：在你的 Lightsail 实例上安装 Certbot
<a name="install-certbot-on-your-instance-nginx"></a>

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

**在你的 Lightsail 实例上安装 Certbot**

1. 登录 [Lightsail 控制台](https://lightsail.aws.amazon.com/)。

1. 在左侧导航窗格，选择您想连接的实例的 SSH 快速连接图标。  
![\[在 Lightsail 主页上使用 SSH 快速连接。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/resource_cards/nginx-ssh-quick-connect.png)

1. 连接基于 Lightsail 浏览器的 SSH 会话后，输入以下命令以更新实例上的软件包：

   ```
   sudo apt-get update
   ```  
![\[更新实例上的软件包。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-nginx-update-packages.png)

1. 输入以下命令以安装软件属性包。Certbot 的开发人员使用个人程序包存档 (PPA) 分配 Certbot。软件属性包使其使用起来更加高效 PPAs。

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

1. 输入以下命令以将 Certbot 添加到本地 apt 存储库：
**注意**  
步骤 5 仅适用于使用 Ubuntu Linux 发行版的实例。如果您的实例使用 Debian Linux 发行版，请跳过此步骤。

   ```
   sudo apt-add-repository ppa:certbot/certbot -y
   ```

1. 输入以下命令来更新 apt，以包含新的存储库：

   ```
   sudo apt-get update -y
   ```

1. 输入以下命令以安装 Certbot：

   ```
   sudo apt-get install certbot -y
   ```

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

1. 使基于浏览器的 SSH 终端窗口保持打开状态 - 您将在本教程的稍后部分返回到该窗口。继续执行本教程的[下一部分](#request-a-lets-encrypt-certificate-nginx)。

## 步骤 3：请求 Let's Encrypt SSL 通配符证书
<a name="request-a-lets-encrypt-certificate-nginx"></a>

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

**请求 Let's Encrypt SSL 通配符证书**

1. 在本教程的[步骤 2](#install-certbot-on-your-instance-nginx) 中使用的同一个基于浏览器的 SSH 终端窗口中，输入以下命令为您的域设置环境变量。现在，您可以更高效地复制和粘贴命令以获取证书。请务必将 `domain` 替换为您注册的域名。

   ```
   DOMAIN=domain
   ```

   ```
   WILDCARD=*.$DOMAIN
   ```

   示例：

   ```
   DOMAIN=example.com
   ```

   ```
   WILDCARD=*.$DOMAIN
   ```

1. 输入以下命令以确认变量返回正确的值：

   ```
   echo $DOMAIN && echo $WILDCARD
   ```

   您应该会看到类似以下内容的结果：  
![\[确认域的环境变量。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-confirm-variables.png)

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

   ```
   sudo certbot -d $DOMAIN -d $WILDCARD --manual --preferred-challenges dns certonly
   ```

1. 在系统提示时输入您的电子邮件地址，用于接收续订和安全通知。

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

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

1. Let's Encrypt 现在会提示您确认您拥有指定域。您可以通过将 TXT 记录添加到域的 DNS 记录执行此操作。系统会提供一组 TXT 记录值，如以下示例所示：
**注意**  
Let's Encrypt 可以提供您必须用于验证的单个或多个 TXT 记录。在本示例中，向我们提供了两个 TXT 记录用于验证。  
![\[Let's Encrypt 证书的 TXT 记录。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/ssh/lets-encrypt-text-records.png)

1. 保持基于 Lightsail 浏览器的 SSH 会话处于打开状态，本教程稍后将返回该会话。继续执行本教程的[下一部分](#add-a-text-record-to-your-domains-dns-zone-lets-encrypt-nginx)。

## 步骤 4：将 TXT 记录添加到域的 DNS 区域
<a name="add-a-text-record-to-your-domains-dns-zone-lets-encrypt-nginx"></a>

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

**注意**  
要详细了解如何为您的域名创建 Lightsail DNS 区域，请参阅在 L [ightsail 中创建 DNS 区域来管理您的域名的 DNS 记录](lightsail-how-to-create-dns-entry.md)。

**在 Lightsail 中向你的域名的 DNS 区域添加 TXT 记录**

1. 在左侧导航窗格中，选择**域和 DNS**。

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

1. 在 DNS 区域编辑器中，选择 **DNS records**（DNS 记录）。

1. 选择**添加记录**。

1. 在 **Record type**（记录类型）下拉菜单中，选择 **TXT record**（TXT 记录）。

1. 将 Let's Encrypt 证书请求指定的值输入到 **Record name**（记录名称）和 **Responds with**（响应内容）字段中。
**注意**  
Lightsail 控制台会预先填充域的顶级域部分。例如，如果想要添加子域 `_acme-challenge.example.com`，您只需在文本框中输入 `_acme-challenge`，您保存此记录时 Lightsail 会添加 `.example.com` 部分。

1. 选择**保存**。

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

1. 保持 Lightsail 控制台浏览器窗口处于打开状态，本教程稍后将返回该窗口。继续执行本教程的[下一部分](#confirm-the-text-records-have-propagated-lets-encrypt-nginx)。

## 步骤 5：确认 TXT 记录已传播
<a name="confirm-the-text-records-have-propagated-lets-encrypt-nginx"></a>

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

**确认 TXT 记录已传播到 Internet 的 DNS**

1. 打开一个新的浏览器窗口，然后转到 [https://mxtoolbox.com/TXTLookup.aspx。](https://mxtoolbox.com/TXTLookup.aspx)

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

   ```
   _acme-challenge.domain
   ```

   示例：

   ```
   _acme-challenge.example.com
   ```  
![\[MxToolbox 查找 TXT 记录。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/mxtoolbox-text-record-lookup.png)

1. 选择 **TXT Lookup (TXT 查找)** 以运行检查。

1. 此时将出现以下任一响应：
   + 如果您的 TXT 记录已传播到 Internet 的 DNS，您将看到类似于以下屏幕截图中所示的响应。关闭浏览器窗口，然后继续执行本教程的[下一部分](#complete-the-lets-encrypt-certificate-request-nginx)。  
![\[确认 TXT 记录已传播。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/mxtoolbox-propagated-text-record-lookup.png)
   + 如果您的 TXT 记录尚未传播到 Internet 的 DNS，您会看到 **DNS Record not found (未找到 DNS 记录)** 响应。确认您已将正确的 DNS 记录添加到域的 DNS 区域。如果您已添加正确的记录，请等待一段时间，让域的 DNS 记录传播，然后再次运行 TXT 查找。

## 步骤 6：完成 Let's Encrypt SSL 证书请求
<a name="complete-the-lets-encrypt-certificate-request-nginx"></a>

返回 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 证书请求。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-certificate-request-success.png)

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

1. 记录消息中指定的到期日期。您可以在该日期之前续订证书。  
![\[Let's Encrypt 证书续订日期。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/certificate-renewal-date.png)

1. 您现在已拥有 Let's Encrypt SSL 证书，请继续执行本教程的[下一部分](#link-the-lets-encrypt-certificate-files-in-the-nginx-directory-nginx)。

## 第 7 步：在 NGINX 服务器目录中创建指向 Let's Encrypt 证书文件的链接
<a name="link-the-lets-encrypt-certificate-files-in-the-nginx-directory-nginx"></a>

在 Nginx 实例上的 Nginx 服务器目录中创建指向 “让我们加密 SSL 证书文件” 的链接。此外，请备份现有证书，以便之后需要。

**在 NGINX 服务器目录中创建指向 Let's Encrypt 证书文件的链接**

1. 在 Nginx 实例的基于 Lightsail 浏览器的 SSH 会话中，输入以下命令以停止底层服务：

   ```
   sudo /opt/bitnami/ctlscript.sh stop
   ```

   您可以看到类似以下内容的响应：  
![\[实例服务已停止。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-nginx-stop-services.png)

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

   ```
   DOMAIN=domain
   ```

   示例：

   ```
   DOMAIN=example.com
   ```

1. 输入以下命令以确认变量返回正确的值：

   ```
   echo $DOMAIN
   ```

   您应该会看到类似以下内容的结果：  
![\[确认域的环境变量。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-confirm-domain-variable.png)

1. 分别输入以下命令，以重命名您的现有证书文件作为备份。请参阅本教程开头的**重要提示**，了解有关不同发行版和文件结构的信息。
   + 对于 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
     ```

1. 单独输入以下命令，在 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
     ```

1. 输入以下命令，以启动先前停止运行的基础服务：

   ```
   sudo /opt/bitnami/ctlscript.sh start
   ```

   您应该会看到类似以下内容的结果：  
![\[实例服务已启动。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-nginx-start-services.png)

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

1. 继续执行本教程的[下一部分](#configure-http-to-https-redirection-nginx)。

## 步骤 8：为 Web 应用程序配置 HTTP 到 HTTPS 重新导向
<a name="configure-http-to-https-redirection-nginx"></a>

您可以为 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
   ```

1. 按 `i` 键进入 Vim 编辑器的插入模式。

1. 使用以下示例中的信息编辑该文件：  
![\[应用程序服务器块配置文件。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/using-le-certs-1.png)

1. 按 **ESC** 键，然后输入 `:wq` 以写入（保存）您的编辑内容，然后退出 Vim。

1. 输入以下命令修改 NGINX 配置文件的服务器部分：

   ```
   sudo vim /opt/bitnami/nginx/conf/nginx.conf
   ```

1. 按 `i` 键进入 Vim 编辑器的插入模式。

1. 使用以下示例中的信息编辑该文件：  
![\[NGINX 配置文件。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/using-le-certs-2.png)

1. 按 **ESC** 键，然后输入 `:wq` 以写入（保存）您的编辑内容，然后退出 Vim。

1. 输入以下命令重新启动基础服务，以使编辑内容生效：

   ```
   sudo /opt/bitnami/ctlscript.sh restart
   ```

**方法 B（自包含 Bitnami 安装）：**

1. 在 Nginx 实例的基于 Lightsail 浏览器的 SSH 会话中，输入以下命令以修改 NGINX 配置文件的服务器部分：

   ```
   sudo vim /opt/bitnami/nginx/conf/nginx.conf
   ```

1. 按 `i` 键进入 Vim 编辑器的插入模式。

1. 使用以下示例中的信息编辑该文件：  
![\[NGINX 配置文件。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/using-le-certs-2.png)

1. 按 **ESC** 键，然后输入 `:wq` 以写入（保存）您的编辑内容，然后退出 Vim。

1. 输入以下命令重新启动基础服务，以使编辑内容生效：

   ```
   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
   ```

1. 按 `i` 键进入 Vim 编辑器的插入模式。

1. 在文件中，在 `server_name localhost;` 和 `include "/opt/bitnami/nginx/conf/bitnami/bitnami-apps-prefix.conf";` 之间输入以下文本：

   ```
   return 301 https://$host$request_uri;
   ```

   结果应该类似以下内容：  
![\[为 HTTP 到 HTTPS 的重定向编辑了 NGINX 配置文件。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/bitnami-nginx-config-file.png)

1. 按 **ESC** 键，然后输入 `:wq` 以写入（保存）您的编辑内容，然后退出 Vim。

1. 输入以下命令重新启动基础服务，以使编辑内容生效：

   ```
   sudo /opt/bitnami/ctlscript.sh restart
   ```

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

## 步骤 9：每 90 天续订一次 Let's Encrypt 证书
<a name="renew-a-lets-encrypt-certificate-nginx"></a>

Let's Encrypt 证书的有效期为 90 天。证书可以在到期前 30 天续订。要续订 Let's Encrypt 证书，请运行用于获取它们的原始命令。重复本教程的[请求 Let's Encrypt SSL 通配符证书](#request-a-lets-encrypt-certificate-nginx)部分中的步骤。

------
#### [ Lightsail ]

**内容**
+  [步骤 1：完成先决条件](#complete-the-prerequisites) 
+  [第 2 步：在你的 Lightsail 实例上安装 Certbot](#install-certbot-on-your-instance) 
+  [第 3 步：申请 Let's Encrypt SSL 通配符证书](#request-a-lets-encrypt-certificate) 
+  [第 4 步：将 TXT 记录添加到您的域名的 DNS 区域](#add-a-text-record-to-your-domains-dns-zone-lets-encrypt) 
+  [步骤 5：确认 TXT 记录已传播](#confirm-the-text-records-have-propagated-lets-encrypt) 
+  [第 6 步：完成 “让我们加密 SSL 证书” 申请](#complete-the-lets-encrypt-certificate-request) 
+  [第 7 步：在 NGINX 中更新 SSL 配置并将流量从 HTTP 重定向到 HTTPS](#update-ssl-configuration) 
+  [第 8 步：每 90 天续订 Let's Encrypt 证书](#renew-a-lets-encrypt-certificate) 

## 步骤 1：完成先决条件
<a name="complete-the-prerequisites"></a>

请完成以下先决条件（如果尚未完成）：
+  在 Lightsail 中创建一个 Nginx 实例。要了解更多信息，请参阅[创建实例](how-to-create-amazon-lightsail-instance-virtual-private-server-vps.md)。
+  注册一个域名，并获取管理访问权限以编辑其 DNS 记录。要了解更多信息，请参阅 [DNS](understanding-dns-in-amazon-lightsail.md)。
**注意**  
 我们建议您使用 Lightsail DNS 区域来管理域名的 DNS 记录。要了解更多信息，请参阅[创建 DNS 区域来管理您的域名的 DNS 记录](lightsail-how-to-create-dns-entry.md)。
+  在 Lightsail 控制台中使用基于浏览器的 SSH 终端执行本教程中的步骤：  
![\[在 Lightsail 主页上使用 SSH 快速连接。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/resource_cards/nginx-ssh-quick-connect.png)
**注意**  
 您也可以使用自己的 SSH 客户端，例如 PuTTY。要了解有关配置 PuTTY 的更多信息，请参阅在 [Amazon Lightsail 中下载并设置 PuTTY 以使用 SSH 进行连接](lightsail-how-to-set-up-putty-to-connect-using-ssh.md)。

## 第 2 步：在你的 Lightsail 实例上安装 Certbot
<a name="install-certbot-on-your-instance"></a>

 Certbot 是用于从 Let's Encrypt 请求证书并将其部署到 Web 服务器的客户端。Let's Encrypt 使用 ACME 协议来颁发证书，而 Certbot 是一款支持 ACME 的客户端，可以与 Let's Encrypt 进行交互。

**在你的 Lightsail 实例上安装 Certbot**

1.  使用 SSH 客户端（例如，基于 Lightsail 浏览器的 SSH 终端）连接到您的实例。输入以下命令以更新您的实例上的软件包：

   ```
   sudo apt-get update
   ```

1.  输入以下命令以安装软件属性包。Certbot 的开发人员使用个人程序包存档 (PPA) 分配 Certbot。软件属性包使其使用起来更加高效 PPAs。

   ```
   sudo apt-get install software-properties-common -y
   ```

1. 输入以下命令来更新 apt，以包含新的存储库：

   ```
   sudo apt-get update -y
   ```

1. 输入以下命令以安装 Certbot：

   ```
   sudo apt-get install certbot -y
   ```

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

## 步骤 3：请求 Let's Encrypt SSL 通配符证书
<a name="request-a-lets-encrypt-certificate"></a>

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

**请求 Let's Encrypt SSL 通配符证书**

1.  在本教程的[步骤 2](#install-certbot-on-your-instance) 中使用的同一个基于浏览器的 SSH 终端窗口中，输入以下命令为您的域设置环境变量。现在，您可以更高效地复制和粘贴命令以获取证书。请务必将 `domain` 替换为您注册的域名。

   ```
   DOMAIN=domain
   WILDCARD=*.$DOMAIN
   ```

   示例：

   ```
   DOMAIN=example.com
   WILDCARD=*.$DOMAIN
   ```

1. 输入以下命令以确认变量返回正确的值：

   ```
   echo $DOMAIN && echo $WILDCARD
   ```

   您应该会看到类似以下内容的结果：  
![\[确认域的环境变量。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/confirm-variables.png)

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

   ```
   sudo certbot -d $DOMAIN -d $WILDCARD --manual --preferred-challenges dns certonly
   ```

1. 在系统提示时输入您的电子邮件地址，用于接收续订和安全通知。

1.  阅读 Let's Encrypt 服务条款。完成后，如果您同意，请按 Y。如果不同意，则无法获取 Let's Encrypt 证书。

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

1.  Let's Encrypt 现在会提示您确认您拥有指定域。您可以通过将 TXT 记录添加到域的 DNS 记录执行此操作。系统会提供一组 TXT 记录值，如以下示例所示：
**注意**  
 Let's Encrypt 可能会提供一条或多条 TXT 记录，您必须使用这些记录进行验证。在本示例中，向我们提供了两个 TXT 记录用于验证。  
![\[让我们加密证书的 TXT 记录。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/get-TXT-records.png)

1.  保持基于 Lightsail 浏览器的 SSH 会话处于打开状态，本教程稍后将返回该会话。继续阅读本教程的[下一部分](#add-a-text-record-to-your-domains-dns-zone-lets-encrypt)。

## 步骤 4：将 TXT 记录添加到域的 DNS 区域
<a name="add-a-text-record-to-your-domains-dns-zone-lets-encrypt"></a>

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

**注意**  
 要详细了解如何为您的域名创建 Lightsail DNS 区域，请参阅在 L [ightsail 中创建 DNS 区域来管理您的域名的 DNS 记录](lightsail-how-to-create-dns-entry.md)。

**在 Lightsail 中向你的域名的 DNS 区域添加 TXT 记录**

1. 在左侧导航窗格中，选择**域和 DNS**。

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

1. 在 DNS 区域编辑器中，选择 **DNS records**（DNS 记录）。

1. 选择**添加记录**。

1.  在 **Record type**（记录类型）下拉菜单中，选择 **TXT record**（TXT 记录）。

1.  将 Let's Encrypt 证书请求指定的值输入到 **Record name**（记录名称）和 **Responds with**（响应内容）字段中。
**注意**  
 Lightsail 控制台会预先填充域的顶级域部分。例如，如果想要添加子域 `_acme-challenge.example.com`，您只需在文本框中输入 `_acme-challenge`，您保存此记录时 Lightsail 会添加 `.example.com` 部分。

1. 选择**保存**。

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

1.  保持 Lightsail 控制台浏览器窗口处于打开状态，本教程稍后将返回该窗口。继续阅读本教程的[下一部分](#confirm-the-text-records-have-propagated-lets-encrypt)。

## 步骤 5：确认 TXT 记录已传播
<a name="confirm-the-text-records-have-propagated-lets-encrypt"></a>

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

**确认 TXT 记录已传播到 Internet 的 DNS**

1.  打开一个新的浏览器窗口，然后转到 [https://mxtoolbox.com/TXTLookup.aspx。](https://mxtoolbox.com/TXTLookup.aspx)

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

   ```
   _acme-challenge.domain
   ```

   示例：

   ```
   _acme-challenge.example.com
   ```  
![\[MxToolbox 查找 TXT 记录。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/mxtoolbox-text-record-lookup.png)

1. 选择 **TXT Lookup (TXT 查找)** 以运行检查。

1. 此时将出现以下任一响应：
   +  如果您的 TXT 记录已传播到 Internet 的 DNS，您将看到类似于以下屏幕截图中所示的响应。关闭浏览器窗口，然后继续执行本教程的[下一部分](#complete-the-lets-encrypt-certificate-request-nginx)。  
![\[确认 TXT 记录已传播。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/mxtoolbox-propagated-text-record-lookup.png)
   +  如果您的 TXT 记录尚未传播到 Internet 的 DNS，您会看到 **DNS Record not found (未找到 DNS 记录)** 响应。确认您已将正确的 DNS 记录添加到域的 DNS 区域。如果您已添加正确的记录，请等待一段时间，让域的 DNS 记录传播，然后再次运行 TXT 查找。

## 步骤 6：完成 Let's Encrypt SSL 证书请求
<a name="complete-the-lets-encrypt-certificate-request"></a>

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

**完成 Let's Encrypt SSL 证书请求**

1.  在您的实例的基于 Lightsail 浏览器的 SSH 会话中，**按 Enter** 继续您的 Let's Encrypt SSL 证书申请。如果成功，系统将显示类似于以下屏幕截图中的响应：  
![\[成功申请 “让我们加密” 证书。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/certificate-request-success.png)

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

1.  记录消息中指定的到期日期。您可以在该日期之前续订证书。  
![\[让我们加密证书续订日期。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/certificate-renewal-date.png)

## 第 7 步：在 NGINX 中更新 SSL 配置并将流量从 HTTP 重定向到 HTTPS
<a name="update-ssl-configuration"></a>

**更新 NGINX 的 default.conf 中的 SSL 配置**

1.  在 Nginx 实例的 SSH 会话中，输入以下命令以停止底层服务：

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

   您可以看到类似以下内容的响应：  
![\[Nginx 实例服务已停止。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/nginx-stop-services.png)

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

   ```
   DOMAIN=domain
   ```

   示例：

   ```
   DOMAIN=example.com
   ```

1. 输入以下命令以确认变量返回正确的值：

   ```
   echo $DOMAIN
   ```

   您应该会看到类似以下内容的结果：  
![\[确认域的环境变量。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/confirm-domain-variable.png)

1. 运行以下命令更改 SSL 配置：

   ```
   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
   ```

1.  覆盖`default.conf`文件后，运行以下命令检查配置并重启 NGINX

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

   您应该会看到类似以下内容的结果：  
![\[Nginx 实例服务已启动。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/lets-encrypt/nginx-start-services.png)

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

## 第 8 步：每 90 天续订 Let's Encrypt 证书
<a name="renew-a-lets-encrypt-certificate"></a>

 Let's Encrypt 证书的有效期为 90 天。证书可以在到期前 30 天续订。要续订 Let's Encrypt 证书，请重复[步骤 3：申请 Let's Encrypt SSL 通配符证书](#request-a-lets-encrypt-certificate-nginx)。

------