

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

# 使用 “让我们加密 SSL 证书” 保护你的 Lightsail LAMP 实例
<a name="amazon-lightsail-using-lets-encrypt-certificates-with-lamp"></a>

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

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

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

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

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

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

## 步骤 2：在实例上安装 Certbot
<a name="install-certbot-on-your-instance-lamp"></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/amazon-lightsail-lamp-ssh-quick-connect.png)

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

   ```
   sudo apt-get update
   ```  
![\[更新实例上的软件包。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-lamp-ssh-lets-encrypt-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-lamp)。

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

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

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

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

   ```
   DOMAIN=Domain
   ```

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

   在命令中，*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-lamp)。

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

## 步骤 5：确认 TXT 记录已传播
<a name="confirm-the-text-records-have-propagated-lets-encrypt-lamp"></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. 在文本框中输入以下文本。

   ```
   _acme-challenge.Domain
   ```

   *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-lamp)。  
![\[确认 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-lamp"></a>

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

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

1. 在您的 LAMP 实例的基于 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-apache-directory-lamp)。

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

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

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

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

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

   您可以看到类似以下内容的响应：  
![\[实例服务已停止。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-ssh-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/apache2/conf/bitnami/certs/server.crt /opt/bitnami/apache2/conf/bitnami/certs/server.crt.old
     ```

     ```
     sudo mv /opt/bitnami/apache2/conf/bitnami/certs/server.key /opt/bitnami/apache2/conf/bitnami/certs/server.key.old
     ```

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

     ```
     sudo mv /opt/bitnami/apache2/conf/server.crt /opt/bitnami/apache2/conf/server.crt.old
     ```

     ```
     sudo mv /opt/bitnami/apache2/conf/server.key /opt/bitnami/apache2/conf/server.key.old
     ```
   + 对于使用 Ubuntu Linux 发行版的较旧实例：

     ```
     sudo mv /opt/bitnami/apache/conf/bitnami/certs/server.crt /opt/bitnami/apache/conf/bitnami/certs/server.crt.old
     ```

     ```
     sudo mv /opt/bitnami/apache/conf/bitnami/certs/server.key /opt/bitnami/apache/conf/bitnami/certs/server.key.old
     ```

1. 分别输入以下命令，以创建指向 apache2 服务器目录中的 Let's Encrypt 证书文件的链接。请参阅本教程开头的**重要提示**，了解有关不同发行版和文件结构的信息。
   + 对于 Debian Linux发行版

     方法 A（使用系统包安装 Bitnami）：

     ```
     sudo ln -sf /etc/letsencrypt/live/$DOMAIN/privkey.pem /opt/bitnami/apache2/conf/bitnami/certs/server.key
     ```

     ```
     sudo ln -sf /etc/letsencrypt/live/$DOMAIN/fullchain.pem /opt/bitnami/apache2/conf/bitnami/certs/server.crt
     ```

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

     ```
     sudo ln -sf /etc/letsencrypt/live/$DOMAIN/privkey.pem /opt/bitnami/apache2/conf/server.key
     ```

     ```
     sudo ln -sf /etc/letsencrypt/live/$DOMAIN/fullchain.pem /opt/bitnami/apache2/conf/server.crt
     ```
   + 对于使用 Ubuntu Linux 发行版的较旧实例：

     ```
     sudo ln -s /etc/letsencrypt/live/$DOMAIN/privkey.pem /opt/bitnami/apache/conf/bitnami/certs/server.key
     ```

     ```
     sudo ln -s /etc/letsencrypt/live/$DOMAIN/fullchain.pem /opt/bitnami/apache/conf/bitnami/certs/server.crt
     ```

1. 输入以下命令以启动之前停止运行的基础 LAMP 堆栈服务：

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

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

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

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

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

您可以为 LAMP 实例配置 HTTP 到 HTTPS 重新导向。自动从 HTTP 重新导向到 HTTPS 将使您的站点只能由使用 SSL 的客户访问，即使他们使用 HTTP 进行连接也是如此。

**为 Web 应用程序配置 HTTP 到 HTTPS 重新导向**

1. 在基于 LAMP 实例的 Lightsail 浏览器的 SSH 会话中，输入以下命令，使用 Vim 文本编辑器编辑 Apache Web 服务器配置文件：

   ```
   sudo vim /opt/bitnami/apache2/conf/bitnami/bitnami.conf
   ```
**注意**  
本教程使用 Vim 来进行演示；但是，您可以针对此步骤使用您选择的任何文本编辑器。

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

1. 在文件中，在 `DocumentRoot "/opt/bitnami/apache2/htdocs"` 和 `<Directory "/opt/bitnami/apache2/htdocs">` 之间输入以下文本：

   ```
   RewriteEngine On
   RewriteCond %{HTTPS} !=on
   RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]
   ```

   结果应该类似以下内容：  
![\[针对 HTTP 到 HTTPS 重新导向编辑的 Apache 配置文件。\]](http://docs.aws.amazon.com/zh_cn/lightsail/latest/userguide/images/amazon-lightsail-lamp-ssh-lets-encrypt-apache-config-file.png)

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

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

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

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

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

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