介绍
Let's Encrypt 是一项通过自动化 API 提供免费 SSL 证书的服务。 最受欢迎的 Let's Encrypt 客户端是 EFF 的 Certbot 客户端。
Certbot 提供了多种方式来验证您的域、获取证书以及自动配置 Apache 和 Nginx。 在本教程中,我们将讨论 Certbot 的 独立模式 以及如何使用它来保护其他类型的服务,例如邮件服务器或像 RabbitMQ 这样的消息代理。
我们不会讨论 SSL 配置的细节,但是当您完成后,您将拥有一个自动更新的有效证书。 此外,您将能够自动重新加载您的服务以获取更新的证书。
先决条件
在开始本教程之前,您需要:
- Debian 10 服务器、具有
sudo
权限的非 root 用户和基本防火墙,详见 this Debian 10 server setup tutorial。 - 指向您的服务器的域名,您可以按照此 文档 在 DigitalOcean 上创建 DNS 记录来完成。
- 您的服务器上的端口
80
或443
必须是 unused。 如果您尝试保护的服务位于具有占用这两个端口的 Web 服务器的计算机上,则您需要使用不同的模式,例如 Certbot 的 webroot 模式 或基于 DNS 的挑战模式.
第 1 步 — 安装 Certbot
Debian 10 在其默认存储库中包含 Certbot 客户端,它应该是最新的,足以满足基本使用。 如果您需要进行基于 DNS 的挑战或使用其他较新的 Certbot 功能,则应按照 官方 Certbot 文档 的指示从 buster-backports
存储库安装。
更新您的包裹清单:
sudo apt update
使用 apt
安装 certbot
包:
sudo apt install certbot
您可以通过要求 certbot
输出其版本号来测试您的安装:
certbot --version
Outputcertbot 0.31.0
现在我们已经安装了 Certbot,让我们运行它来获取我们的证书。
第 2 步 — 运行 Certbot
Certbot 需要回答 Let's Encrypt API 发出的加密挑战,以证明我们控制了我们的域。 它使用端口 80
(HTTP) 或 443
(HTTPS) 来完成此操作。 在防火墙中打开适当的端口:
sudo ufw allow 80
如果那是您正在使用的端口,请替换上面的 443
。 ufw
将输出确认您的规则已添加:
OutputRule added Rule added (v6)
我们现在可以运行 Certbot 来获取我们的证书。 我们将使用 --standalone
选项告诉 Certbot 使用自己的内置 Web 服务器处理挑战。 --preferred-challenges
选项指示 Certbot 使用端口 80
或端口 443
。 如果您使用端口 80
,您将使用 --preferred-challenges http
选项。 对于端口 443
,使用 --preferred-challenges tls-sni
。 最后,我们将使用 -d
标志来指定我们请求证书的域。 您可以添加多个 -d
选项以在一个证书中覆盖多个域。
我们将使用 --preferred-challenges http
选项进行演示,但您应该使用对您的用例有意义的选项。 使用您的首选选项运行以下命令以获取您的证书:
sudo certbot certonly --standalone --preferred-challenges http -d your_domain
运行命令时,系统会提示您输入电子邮件地址并同意服务条款。 完成此操作后,您应该会看到一条消息,告诉您该过程已成功以及您的证书存储在哪里:
OutputIMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2019-08-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - 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
您将看到以下输出:
Outputcert.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 文档的 我的证书在哪里? 部分。
某些软件将需要其他格式或位置的证书,或具有其他用户权限的证书。 最好将所有内容保留在 letsencrypt
目录中,并且不要更改那里的任何权限(无论如何,权限只会在更新时被覆盖),但有时这不是一个选项。 在这种情况下,您需要编写一个脚本来移动文件并根据需要更改权限。 每当 Certbot 更新证书时,都需要运行此脚本,我们将在接下来讨论。
第 4 步 — 处理 Certbot 自动续订
Let's Encrypt 证书的有效期只有九十天。 这是为了鼓励用户自动化证书更新过程。 我们安装的 certbot
包通过向 /etc/cron.d
添加更新脚本来为我们解决这个问题。 此脚本每天运行两次,并将续订到期后三十天内的任何证书。
随着我们的证书自动更新,我们仍然需要一种在更新后运行其他任务的方法。 我们至少需要重新启动或重新加载我们的服务器以获取新证书,并且如步骤 3 中所述,我们可能需要以某种方式操作证书文件以使其与我们正在使用的软件一起使用。 这是 Certbot 的 renew_hook 选项的目的。
要添加 renew_hook
,我们需要更新 Certbot 的更新配置文件。 Certbot 会记住您首次获取证书的所有详细信息,并在续订时使用相同的选项运行。 我们只需要添加我们的钩子。 使用您喜欢的编辑器打开配置文件:
sudo nano /etc/letsencrypt/renewal/your_domain.conf
将打开一个带有一些配置选项的文本文件。 在最后一行添加你的钩子。 在这种情况下,我们使用的示例将重新加载 rabbitmq
服务:
/etc/letsencrypt/renew/your_domain.conf
renew_hook = systemctl reload rabbitmq
将上面的命令更新为重新加载服务器或运行自定义文件修改脚本所需的任何命令。 在 Debian 上,您通常会使用 systemctl
重新加载服务。
保存并关闭文件,然后运行 Certbot 试运行以确保语法正常:
sudo certbot renew --dry-run
如果您没有看到任何错误,则说明一切就绪。 Certbot 设置为在必要时更新并运行使用新文件获取服务所需的任何命令。
结论
在本教程中,我们安装了 Certbot Let's Encrypt 客户端,使用独立模式下载了 SSL 证书,并使用更新挂钩启用了自动更新。 这应该为您在使用 Let's Encrypt 证书和典型 Web 服务器以外的服务提供一个良好的开端。
更多信息请参考Certbot的文档。