如何在CentOS7上使用Certbot独立模式检索Let'sEncryptSSL证书

来自菜鸟教程
跳转至:导航、​搜索

介绍

Let's Encrypt 是一项通过自动化 API 提供免费 SSL 证书的服务。 最受欢迎的 Let's Encrypt 客户端是 EFFCertbot

Certbot 提供了多种方法来验证您的域、获取证书以及自动配置 Apache 和 Nginx。 在本教程中,我们将讨论 Certbot 的 standalone 模式以及如何使用它来保护其他类型的服务,例如邮件服务器或 RabbitMQ 等消息代理。

我们不会讨论 SSL 配置的细节,但是当您完成后,您将拥有一个自动更新的有效证书。 此外,您将能够自动重新加载您的服务以获取更新的证书。

先决条件

在开始本教程之前,您需要:

  • 具有非 root 用户、启用 sudo 的 CentOS 7 服务器,详见 this CentOS 7 initial server setup tutorial
  • 指向您的服务器的域名,您可以按照“如何使用 DigitalOcean 设置主机名”来完成。 本教程将自始至终使用 example.com
  • 您的服务器上必须未使用端口 80 443。 如果您要保护的服务位于具有占用这两个端口的 Web 服务器的机器上,则您需要使用不同的模式,例如 Certbot 的 webroot 模式

第 1 步 — 安装 Certbot

Certbot 打包在一个名为 Extra Packages for Enterprise Linux (EPEL) 的额外存储库中。 要在 CentOS 7 上启用此存储库,请运行以下 yum 命令:

sudo yum --enablerepo=extras install epel-release

之后,可以使用 yum 安装 certbot 包:

sudo yum install certbot

您可以通过调用 certbot 命令确认安装成功:

certbot --version
Outputcertbot 0.31.0

现在我们已经安装了 Certbot,让我们运行它来获取我们的证书。

第 2 步 — 运行 Certbot

Certbot 需要回答 Let's Encrypt API 发出的加密挑战,以证明我们控制了我们的域。 它使用端口 80 (HTTP) 或 443 (HTTPS) 来完成此操作。 如果您使用的是防火墙,请立即打开相应的端口。 对于 firewalld 这将类似于以下内容:

sudo firewall-cmd --add-service=http
sudo firewall-cmd --runtime-to-permanent

如果您使用端口 443,请用 https 替换上面的 http

我们现在可以运行 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 key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-10-09. 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/example.com
Outputcert.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 文档的“我的证书在哪里”部分。

某些软件将需要其他格式、其他位置或具有其他用户权限的证书。 最好将所有内容保留在 letsencrypt 目录中,并且不要更改其中的任何权限(无论如何,权限只会在更新时被覆盖),但有时这不是一个选项。 在这种情况下,您需要编写一个脚本来移动文件并根据需要更改权限。 每当 Certbot 更新证书时,都需要运行此脚本,我们将在接下来讨论。

第 4 步 — 启用自动证书更新

Let's Encrypt 的证书有效期只有九十天。 这是为了鼓励用户自动化他们的证书更新过程。 我们安装的 certbot 软件包包括一个 systemd 计时器,用于每天检查两次续订,但默认情况下它是禁用的。 通过运行以下命令启用计时器:

sudo systemctl enable --now certbot-renew.timer
OutputCreated symlink from /etc/systemd/system/timers.target.wants/certbot-renew.timer to /usr/lib/systemd/system/certbot-renew.timer.

您可以使用 systemctl 验证计时器的状态:

sudo systemctl status certbot-renew.timer
Output● certbot-renew.timer - This is the timer to set the schedule for automated renewals
   Loaded: loaded (/usr/lib/systemd/system/certbot-renew.timer; enabled; vendor preset: disabled)
   Active: active (waiting) since Fri 2019-05-31 15:10:10 UTC; 48s ago

计时器应该处于活动状态。 Certbot 现在将在必要时自动更新此服务器上的任何证书。

第 5 步 — 更新证书时运行任务

现在我们的证书正在自动更新,我们需要一种在更新后运行某些任务的方法。 我们至少需要重新启动或重新加载我们的服务器以获取新证书,并且如步骤 3 中所述,我们可能需要以某种方式操作证书文件以使其与我们正在使用的软件一起使用。 这就是 Certbot 的 renew_hook 选项的目的。

为了添加 renew_hook,我们更新了 Certbot 的更新配置文件。 Certbot 会记住您首次获取证书的所有详细信息,并在续订时使用相同的选项运行。 我们只需要添加我们的钩子。 使用您喜欢的编辑器打开配置文件:

sudo vi /etc/letsencrypt/renewal/example.com.conf

将打开一个带有一些配置选项的文本文件。 在最后一行添加你的钩子:

/etc/letsencrypt/renewal/example.com.conf

renew_hook = systemctl reload rabbitmq

将上面的命令更新为重新加载服务器或运行自定义文件修改脚本所需的任何命令。 通常,在 CentOS 上,您主要使用 systemctl 来重新加载服务。 保存并关闭文件,然后运行 Certbot 试运行以确保语法正常:

sudo certbot renew --dry-run

如果您没有看到任何错误,则说明一切就绪。 Certbot 设置为在必要时更新并运行使用新文件获取服务所需的任何命令。

结论

在本教程中,我们安装了 Certbot Let's Encrypt 客户端,使用独立模式下载了 SSL 证书,并使用更新挂钩启用了自动更新。 这应该为您在使用 Let's Encrypt 证书和典型 Web 服务器以外的服务提供一个良好的开端。

更多信息请参考Certbot的文档