如何在 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地址。
- 一条A记录,用
- 安装的 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 格式,你必须先在服务器上安装 snapd
。 snapd
是安装、使用和管理 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+X
、Y
,然后按 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 有进一步的疑问,可以参考它们的官方文档。