如何在 Ubuntu 22.04 上使用 Certbot 独立模式来获取 Let’s Encrypt SSL 证书
作者 Alex Garnett
导言
Let’s Encrypt 是一项通过自动 API 提供免费 SSL 证书的服务。最流行的 Let’s Encrypt 客户端是 EFF 的 Certbot。 Certbot 提供了多种方法来验证你的域名,获取证书,自动配置 Apache 和 Nginx。在本教程中,我们将讨论 Certbot 的独立模式,以及如何使用它来保护其他类型的服务,如邮件服务器或 RabbitMQ 这样的消息代理。 我们不会讨论 SSL 配置的细节,但当你完成后,你将拥有一个自动更新的有效证书。此外,你将能够自动重新加载你的服务以获取更新的证书。
前期准备
在开始本教程之前,你将需要:
- 一台 Ubuntu 22.04 服务器,有一个非 root 、有 sudo 功能的用户和基本的防火墙设置。
- 一个指向你的服务器的域名。如果你使用的是 DigitalOcean Droplet,你可以按照 DigitalOcean 的域名和DNS文档来完成这个任务。本教程将自始至终使用
your_domain
。 - 你的服务器上的80或443端口必须是未使用的。如果你要保护的服务在一台有 Web 服务器的机器上,而 Web 服务器占用了这两个端口,你就需要使用不同的模式,如 Certbot 的 webroot 模式。
第1步 - 安装Certbot
Certbot 建议使用它的 snap 包进行安装。Snap 包几乎适用于所有的 Linux 发行版,但它们要求你先安装 snapd,以便管理 snap 包。Ubuntu 22.04 开箱即支持 snap,所以首先你可以确保 snapd 核心已更新到最新:
$ sudo snap install core; sudo snap refresh core
如果你所在的服务器之前安装了旧版本的 certbot,你应该在进行下一步之前将其删除:
$ sudo apt remove certbot
之后,你可以安装 certbot
软件包:
$ sudo snap install --classic certbot
最后,你可以把 snap 安装目录下的 certbot
命令链接到你的路径上,这样你就可以通过输入 certbot
来运行它。并不是所有软件包都需要这样做,但在默认情况下 snap 往往干扰性较小,所以不会意外与其他系统软件包冲突。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
现在我们已经安装了Certbot,让我们运行它来获取我们的证书吧。
第2步 - 运行 Certbot
Certbot 需要回答 Let’s Encrypt API 发出的加密挑战,以证明我们确实控制着我们的域名。它使用 80(HTTP)或 443(HTTPS)端口来完成这一任务。使用以下代码在你的防火墙中打开适当的端口:
$ sudo ufw allow 80
sudo ufw allow 443
Output
Rule added
Rule added (v6)
现在我们可以运行 Certbot 来获取证书。我们将使用 --standalone
选项来让 Certbot 使用它自己的内置 Web 服务器来处理挑战。最后,-d
标记用于指定你申请证书的域。你可以添加多个 -d
选项,以便在一个证书中涵盖多个域。
$ sudo certbot certonly --standalone -d your_domain
运行该命令时,将提示你输入一个电子邮件地址并同意服务条款。这样做之后,你应该看到下面这段信息,告诉你这个过程是成功的,以及你的证书存放在哪里:
Output
IMPORTANT NOTES:
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-02.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
现在你应该就有证书了。在下一步,我们将检查下载的一些文件,并了解其功能。
第3步 - 配置你的应用程序
为 SSL 配置你的应用程序不在本文的范围之内,因为每个应用程序都有不同的要求和配置选项,但我们可以看看 Certbot 为我们下载了什么。使用 ls
来给出存放密钥和证书的目录列表:
$ sudo ls /etc/letsencrypt/live/your_domain
Output
cert.pem chain.pem fullchain.pem privkey.pem README
这个目录下的 README
文件有关于这些文件的更多信息。大多数情况下,你只需要其中的两个文件:
privkey.pem
。这是证书的私钥,需要安全存放和保密,这就是为什么/etc/letsencrypt
目录大部分具有非常严格的权限,并且只有 root 用户可以访问。大多数软件配置会以类似于ssl-certificate-key
或ssl-certificate-key-file
这样的名字来引用它。fullchain.pem
。这是我们的证书,与所有中间证书捆绑在一起。大多数软件将使用这个文件作为真正的证书,并在配置中以ssl-certificate
这样的名称来引用它。 关于其他文件的更多信息,请参考Certbot文档中的“Where are my certificates(我的证书在哪)”这一部分。 一些软件将需要其他格式、在其他位置或有其他用户权限的证书。最好是把所有东西都留在letsencrypt
目录中,并且不改变其中的任何权限(反正权限在更新时也会被覆盖),但有时不能选择这样做。在这种情况下,你将需要写一个脚本来移动文件并根据需要改变权限。这个脚本需要在 Certbot 更新证书的时候运行,我们接下来会讨论这个问题。
第4步 - 处理Certbot自动更新
Let's Encrypt 证书的有效期只有九十天。这是为了鼓励用户自动完成证书更新过程。我们所安装的 certbot
软件包可以解决这个问题,方法是在 /etc/cron.d
中添加一个更新脚本。这个脚本每天运行两次,将自动更新任何在30天内到期的证书。
有了自动更新的证书后,我们仍然需要一种方法来在更新后运行其他任务。我们至少需要重启或重新加载我们的服务器以获取新的证书,而且正如第3步所提到的,我们可能需要以某种方式处理证书文件,使其能够与我们的软件一起使用。这就是 Certbot 的 renew_hook
选项的作用。
$ sudo nano /etc/letsencrypt/renewal/your_domain.conf
一个带有一些配置选项的文本文件将被打开。你可以在最后一行添加一个钩子,它将重新加载任何面向 Web 的服务,使它们使用更新的证书。 /etc/letsencrypt/renewal/<^>your_domain<^>.conf
renew_hook = systemctl reload your_service
将上面的命令更新为你需要运行的任何命令,以重新加载你的服务器或运行你的自定义文件管理脚本。通常在 Ubuntu 上,你大多会使用 systemctl
来重新加载服务。保存并关闭该文件,然后运行 Certbot 模拟运行以确保语法无误。
$ sudo certbot renew --dry-run
如果没有任何错误,一切就完成了。Certbot 已设置为在必要时进行更新,并运行任何需要的命令,使你的服务使用新的文件。
结语
在本教程中,我们安装了Certbot Let’s Encrypt客户端,使用独立模式下载了一个 SSL 证书,并通过 renew 钩子启用了自动更新功能。本文应该能让你在使用 Let’s Encrypt 证书时有一个良好的开端,而不是使用典型的 Web 服务器的服务。 欲了解更多信息,请参考 Certbot 的文档。