Skip to main content

如何在 Debian 11 上使用 Let’s Encrypt 保护Apache

作者 Kathleen Juell, Mark Drake, Erika Heidi and Jeanelle Horcasitas

导言

Let's Encrypt 是一个证书颁发机构(Certificate Authority,缩写为CA),它提供了一种获得和安装免费 TLS/SSL 证书的方法,从而可以在网络服务器上实现加密的 HTTPS。它提供了软件客户端 Certbot 来辅助这个过程,该客户端会努力自动化进行大部分(如果不是全部)所需步骤。目前,在 Apache 和 Nginx 上获取和安装证书的整个过程是完全自动化的。 在本教程中,你将使用 Certbot 为 Debian 11 上的 Apache 获得一个免费的 SSL 证书,并设置证书为自动更新。 本教程将使用一个单独的 Apache 虚拟主机文件,而不是默认的配置文件。我们建议为每个域名创建新的 Apache 虚拟主机文件,因为这有助于避免常见的错误。默认文件则作为备用配置。

前期准备

学习本教程将需要:

  • 一台设置好的 Debian 11 服务器,包括一个具有 sudo 权限的非 root 用户和防火墙。
  • 一个完全注册好的域名。本教程将以 your_domain 为例来进行说明。
  • 为你的服务器设置以下两个 DNS 记录:
    • 一条A记录,用 your_domain 指向你服务器的公共 IP 地址。
    • 一条A记录,用 www.your_domain 指向你的服务器的公共IP地址。
  • 安装的 Apache。请确保你已经为你的域名设置了一个虚拟主机文件。本教程将使用 /etc/apache2/sites-available/your_domain.conf 作为例子。

第一步:安装 Certbot

使用 Let's Encrypt 获得 SSL 证书的第一步是在服务器上安装 Certbot 软件。 注意:本教程遵循 Certbot 文档中的建议,使用 snappy 在 Debian 上安装该软件,snappy 是为 Linux 系统开发的软件包管理器,以 snap 格式安装软件包。你可以使用 apt 从默认的 Debian 软件库中安装 Certbot,但这会导致安装一个比 Certbot snap(1.29.0版,截至本文写作时的最新版本)更老的版本(1.12.0版)。 要在 Debian 上将 Certbot 安装为 snap 格式,你必须先在服务器上安装 snapdsnapd 是安装、使用和管理 snap 格式应用所需的守护程序。安装 snapd 软件包也会在您的服务器上安装 snap 命令。 如果要安装 snapd,如果您最近没有更新您的本地软件包索引,请进行更新:

$ sudo apt update

然后安装 snapd 包:

$ sudo apt install snapd

运行这个命令后,会有一个提示,确认你要安装 snapd 及其依赖。你可以按 Y,然后按 ENTER 键来同意。 接下来,使用 snap 命令来安装 core snap。这将在你的服务器上安装一些任何你所安装的 snap 应用都需要的依赖,包括 Certbot snap:

$ sudo snap install core

然后刷新 core snap。这样做将确保你安装了最新版本的 snapd 及其依赖:

$ sudo snap refresh core

请注意,共有三个限制级别,分别提供了与你的系统不同程度的隔离,snap 应用可以被安装在其中一个级别下面。例如,大多数 snap 默认安装在 —-strict 级别下,这个级别可以防止这些程序访问你的系统文件或网络。由于必须允许 Certbot 编辑某些配置文件以正确地设置证书,因此该命令也包括 —-classic 选项。这个限制级别允许安装在它下面的任何 snap 应用与传统软件包一样访问系统资源。 考虑到这一点,你可以用以下命令安装 certbot snap:

$ sudo snap install --classic certbot

这个安装过程将把 certbot 可执行文件安装在 /snap/bin/ 目录下。接下来在 /usr/bin/ 目录下为该文件创建一个符号链接,以确保你能在系统的任何地方运行 certbot 命令:

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Certbot 现在就可以使用了,但为了让它为 Apache 配置 SSL,你需要确认Apache 已经被配置妥当。

第二步:设置 SSL 证书

Certbot 需要能够在你的 Apache 配置中找到正确的虚拟主机,以便它能够自动配置 SSL。具体来说,Certbot 通过搜索与你申请证书的域名相匹配的 ServerName 指令来找到虚拟主机。 如果你在 Apache 中配置好了虚拟主机,你的域名在 /etc/apache2/sites-available/your_domain.conf 中会有一个 VirtualHost 块,并且 ServerName 指令应该也已经设置好了。

如果要检查,用 nano 或你喜欢的文本编辑器打开你的域名的虚拟主机文件:

$ sudo nano /etc/apache2/sites-available/your_domain.conf

找到已存在的 ServerName 代码行。它看上去应该像下面这样,除了要将 your_domain 替换成你的域名。 /etc/apache2/sites-available/your_domain.conf

...
ServerName your_domain;
...

如果还没有的话,更新 ServerName 指令,使其指向你的域名。然后保存该文件并退出编辑器。如果你使用 nano,按 CTRL+XY,然后按 ENTER 键,就可以了。 接下来,验证你的配置编辑的语法:

$ sudo apache2ctl configtest

如果没有任何语法错误,输出将返回如下:

Output
. . .
Syntax OK

如果你得到一个错误,重新打开虚拟主机文件,检查是否有错别字或丢失的字符。一旦你的配置文件的语法正确,重新加载 Apache 以加载新的配置:

$ sudo systemctl reload apache2

现在 Certbot 可以找到正确的 VirtualHost 块并更新它。 接下来,让我们更新防火墙以允许 HTTPS 流量。

第三步:允许 HTTPS 通过防火墙

如果你启用了 ufw 防火墙,正如“前期准备”所说,你需要调整设置以允许 HTTPS 流量。幸运的是,当安装在 Debian 上时,ufw 附带了一些配置文件,有助于改变防火墙规则以适用 HTTP 和 HTTPS 流量。 可以通过运行以下程序来验证当前的设置:

$ sudo ufw status

如果配置正确,这个命令的输出将如下,表明只允许 HTTP 流量进入 web 服务器:

Output
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
WWW ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
WWW (v6) ALLOW Anywhere (v6)

要允许 HTTPS 流量,请允许 WWW Full 配置文件,并删除多余的 WWW 配置文件许可:

$ sudo ufw allow 'WWW Full'
$ sudo ufw delete allow 'WWW'

现在你的状态应该是:

$ sudo ufw status
Output
Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
WWW Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
WWW Full (v6) ALLOW Anywhere (v6)

接下来,让我们运行 Certbot 并获取证书。

第四步:获取 SSL 证书

Certbot 提供了多种通过插件获取 SSL 证书的方法。Apache 插件将负责重新配置 Apache 并在必要时重新加载配置。要使用这个插件,请运行以下程序:

$ sudo certbot --apache -d your_domain -d www.your_domain

以上代码用 --apache 插件运行 certbot,用 -d 来指定你希望证书有效的名字。 如果这是你第一次运行 certbot,系统会提示你输入一个电子邮件地址并同意服务条款。此外,它还会问你是否愿意与电子前沿基金会分享你的电子邮件地址,电子前沿基金会是一个倡导数字权利的非营利组织,也是 Certbot 的制造商。可输入 Y 以分享你的电子邮件地址,或输入 N 以拒绝。 这样做之后,certbot 将与 Let's Encrypt 服务器通信,然后运行以验证你是否控制着你所申请证书的域名。 如果验证成功的话,配置将被自动更新,Apache 将重新加载以接受新的设置。certbot 将以一条消息结束,告诉你这个过程成功了,以及你的证书存放在哪里,如下:

Output
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-10-31.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for your_domain to /etc/apache2/sites-available/your_domain-le-ssl.conf
Successfully deployed certificate for www.your_domain to /etc/apache2/sites-available/your_domain-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

现在你的证书已经下载、安装并加载好了。试着用 https:// 重新加载你的网站,并注意你的浏览器的安全指示灯。通常有一个绿色的锁形图标来表示网站是被妥善保护的。如果使用 SSL 实验室的服务器测试来测试你的服务器,结果将是A级。 最后我们来测试一下更新过程。

第五步:验证 Certbot 自动更新

Let's Encrypt 证书的有效期只有九十天。这是为了鼓励用户自动完成证书更新过程。你所安装的 certbot 软件包可以解决这个问题,方法是在 /etc/cron.d 中添加一个更新脚本。这个脚本每天运行两次,将自动更新任何在30天内到期的证书。 为了测试更新过程,你可以用 certbot 模拟运行一次:

$ sudo certbot renew --dry-run

如果没有收到任何错误,说明一切就绪了。必要时,Certbot 会更新你的证书,并重新加载 Apache 以接收这些更新。如果自动更新过程失败,Let's Encrypt 会向你指定的邮箱发送一条信息,警告你证书即将过期。

结语

在本教程中,你安装了 Let's Encrypt 客户端 certbot,为你的域名下载了 SSL 证书,配置了 Apache 以使用这些证书,并设置了自动证书更新。如果对使用 Certbot 有进一步的疑问,可以参考它们的官方文档