Skip to main content

如何在 Ubuntu 22.04 上使用 Certbot 独立模式来获取 Let’s Encrypt SSL 证书

作者 Alex Garnett

导言

Let’s Encrypt 是一项通过自动 API 提供免费 SSL 证书的服务。最流行的 Let’s Encrypt 客户端是 EFFCertbot。 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-keyssl-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 的文档