

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

# 使用 Let's Encrypt 和 Certbot 在 Nginx 实例上启用 HTTPS
<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 实例集成。

 **内容** 
+  [步骤 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 终端来执行本教程中的步骤。但是，您也可以使用自己的 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 是与 Let's Encrypt 交互的 ACME-enabled 客户端。

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

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

1. 在 Lightsail 主页的实例选项卡上，选择要连接的实例的 SSH 快速连接图标。  
![在 Lightsail 主页上使用 SSH 快速连接。](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/instances/resource_cards/ssh-quick-connect.png)

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

   ```
   sudo apt-get update
   ```

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

   ```
   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. 在本教程上一步中使用的基于浏览器的 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 服务条款。阅读完后，如果您同意该服务条款，请按 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/lets-encrypt/get-TXT-records.png)

## 步骤 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)。  
![确认 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 配置：
**注意**  
如果您在步骤 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
   ```

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)。