如何使用 Certbot 独立模式在 Ubuntu 16.04 上检索 Let's Encrypt SSL 证书
介绍
证书机器人。
Certbot 提供了多种方法来验证您的域、获取证书以及自动配置 Apache 和 Nginx。在本教程中,我们将讨论 Certbot 的独立模式,以及如何使用它来保护其他类型的服务,例如邮件服务器或 RabbitMQ 等消息代理。
我们不会讨论 SSL 配置的细节,但是完成后您将拥有一个自动续订的有效证书。此外,您将能够自动重新加载您的服务以获取更新的证书。
先决条件
在开始本教程之前,您需要:
- 一台 Ubuntu 16.04 服务器,具有非根用户、启用 sudo 的用户和基本防火墙设置,详见此 Ubuntu 16.04 服务器设置教程。
- 指向您的服务器的域名,您可以按照“如何使用 DigitalOcean 设置主机名”来完成。本教程将始终使用
example.com
。 - 端口 80 或 443 在您的服务器上必须未使用。如果您要保护的服务位于一台机器上,该机器的网络服务器占用了这两个端口,您将需要使用不同的模式,例如 Certbot 的 webroot 模式。
第 1 步 — 安装 Certbot
Ubuntu 在其默认存储库中包含 Certbot 客户端,但它有点过时了。相反,我们将从 Certbot 的官方 Ubuntu PPA 或 Personal Package Archive 安装它。这些是替代存储库,用于打包更新或更晦涩的软件。首先,添加存储库:
- sudo add-apt-repository ppa:certbot/certbot
您需要按 ENTER
接受。之后,更新包列表以获取新存储库的包信息:
- sudo apt-get update
最后,安装 certbot
包:
- sudo apt-get install certbot
现在我们已经安装了 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
选项以在一个证书中涵盖多个域。
- sudo certbot certonly --standalone --preferred-challenges http -d example.com
运行命令时,系统会提示您输入电子邮件地址并同意服务条款。执行此操作后,您应该会看到一条消息,告诉您该过程已成功以及您的证书存储在何处:
OutputIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2017-10-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again with the
"certonly" option. 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/example.com
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/example.com.conf
将打开一个包含一些配置选项的文本文件。在最后一行添加你的钩子:
renew_hook = systemctl reload rabbitmq
将上面的命令更新为重新加载服务器或运行自定义文件修改脚本所需运行的任何命令。通常,在 Ubuntu 上,您主要使用 systemctl
来重新加载服务。保存并关闭文件,然后运行 Certbot 试运行以确保语法正确:
- sudo certbot renew --dry-run
如果您没有看到任何错误,则一切就绪。 Certbot 设置为在必要时更新并运行使用新文件获取服务所需的任何命令。
结论
在本教程中,我们安装了 Certbot Let's Encrypt 客户端,使用独立模式下载了 SSL 证书,并使用更新挂钩启用了自动更新。这应该给您一个良好的开端,让您可以将 Let's Encrypt 证书与典型 Web 服务器以外的服务一起使用。
有关更多信息,请参阅 Certbot 的文档。