如何在FreeBSD上使用Let'sEncrypt保护Nginx

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

介绍

Let's Encrypt 是一个证书颁发机构 (CA),它提供了一种简单的方法来获取和安装免费的 TLS/SSL 证书,从而在 Web 服务器上启用加密的 HTTPS。 它通过提供软件客户端 Certbot 来简化流程,该客户端可自动执行大部分步骤。

在本教程中,我们将向您展示如何使用 Certbot 获取免费的 SSL 证书并在运行 Nginx 的 FreeBSD 服务器上使用它。 我们还将向您展示如何自动更新您的 SSL 证书。

我们将在本教程中使用默认的 Nginx 配置文件,而不是单独的服务器块文件。 我们通常建议为每个域创建新的 Nginx 服务器块文件,因为它有助于避免一些常见错误,并按预期维护默认文件作为后备配置。

先决条件

为了完成本教程,您需要:

  • FreeBSD 服务器。 如果您是使用 FreeBSD 11 的新手,您可以按照 本指南 帮助您入门。
  • 在您的服务器上安装和配置 Nginx。 有关如何设置的说明,请参阅我们关于 如何在 FreeBSD 11.2 上安装 Nginx 的指南。
  • 您拥有和控制的注册域名。 如果您还没有注册域名,您可以在众多域名注册商之一注册一个(例如 Namecheap、GoDaddy 等)。
  • DNS A 记录 将您的域指向您服务器的公共 IP 地址。 您可以关注 this hostname tutorial 了解如何添加它们的详细信息。 这是必需的,因为 Let's Encrypt 如何验证您是否拥有它为其颁发证书的域。 例如,如果您想获得 example.com 的证书,则该域必须解析到您的服务器,验证过程才能正常工作。 我们的设置将使用 example.comwww.example.com 作为域名,因此需要 两个 DNS 记录

完成这些先决条件后,让我们继续安装 Certbot,即 Let's Encrypt 客户端软件。

第 1 步 — 安装 Certbot

使用 Let's Encrypt 获取 SSL 证书的第一步是在您的服务器上安装 certbot 客户端软件。 可以使用 FreeBSD 的 端口系统 从源代码安装最新版本的 Certbot。

首先,获取端口树的压缩快照:

sudo portsnap fetch

此命令可能需要几分钟才能完成。 完成后,提取快照:

sudo portsnap extract

此命令也可能需要一段时间才能完成。 完成后,导航到端口树中的 py-certbot 目录:

cd /usr/ports/security/py-certbot

然后使用具有sudo权限的make命令下载并编译Certbot源代码:

sudo make install clean

接下来,导航到端口树中的 py-certbot-nginx 目录:

cd /usr/ports/security/py-certbot-nginx

从此目录再次运行 make 命令。 这将为 Certbot 安装 nginx 插件,我们将使用它来获取 SSL 证书:

sudo make install clean

在此插件的安装过程中,您将看到几个蓝色对话框窗口弹出,如下所示:

这些使您可以选择安装插件及其依赖项的文档。 就本教程而言,您只需按 ENTER 即可接受这些将安装此文档的窗口中的默认选项。

certbot Let's Encrypt 客户端现在可以使用了。 但是,在获取证书之前,设置防火墙并允许 HTTPS 流量通过它很重要,如果您还没有这样做的话。

第 2 步 — 设置防火墙并允许 HTTPS 访问

如果您已经在服务器上设置了防火墙,您应该确保它允许 HTTPS 访问(通过端口 443)。 如果您尚未设置防火墙,则可以按照此步骤中概述的说明进行设置。

使用您喜欢的编辑器打开位于 /etc/ 目录中的 rc.conf 文件。 这里我们将使用 ee

sudo ee /etc/rc.conf

该文件用于通知 FreeBSD 机器启动时应该启动哪些服务。 在文件顶部附近,添加以下突出显示的行:

/etc/rc.conf

. . .
nginx_enable="YES"
firewall_enable="YES"
firewall_type="workstation"
firewall_myservices="22/tcp 80/tcp 443/tcp"
firewall_allowservices="any"

以下是每个指令及其设置的作用:

  • firewall_enable="YES" — 这使防火墙能够在服务器启动时启动。
  • firewall_type="workstation" — FreeBSD 提供了几种默认类型的防火墙,每一种都有略微不同的配置。 通过声明 workstation 类型,防火墙将仅使用状态规则保护此服务器。
  • firewall_myservices="22/tcp 80/tcp 443/tcp"firewall_myservices 指令是您可以列出要允许通过防火墙的 TCP 端口的位置。 在此示例中,我们指定端口 2280443 分别允许 SSH、HTTP 和 HTTPS 访问服务器。
  • firewall_allowservices="any" — 这允许来自任何 IP 地址的机器通过 firewall_myservices 指令中指定的端口进行通信。

添加这些行后,按 CTRL + C 保存文件并关闭编辑器,键入 exit,然后按 ENTER

然后,启动ipfw防火墙服务。 因为这是您第一次在此服务器上启动防火墙,所以这样做可能会导致您的服务器停止,使其无法通过 SSH 访问。 以下 nohup 命令(代表“无挂断”)将启动防火墙,同时防止停止,并将标准输出和错误重定向到临时日志文件:

sudo nohup service ipfw start >/tmp/ipfw.log 2>&1

但是,如果您使用的是 cshtcsh,则此重定向将导致 Ambiguous output redirect. 出现在您的输出中。 在这种情况下,请运行以下命令来启动 ipfw

sudo nohup service ipfw start >&/tmp/ipfw.log

将来,您可以像管理任何其他服务一样管理 ipfw 防火墙。 例如,要停止、启动然后重新启动服务,您将运行以下命令:

sudo service ipfw stop
sudo service ipfw start
sudo service ipfw restart

配置防火墙后,您现在可以运行 Certbot 并获取您的证书。

第 3 步 — 获取 SSL 证书

Certbot 通过各种插件提供了多种获取 SSL 证书的方式。 nginx 插件将负责重新配置 Nginx 并重新加载配置文件:

sudo certbot --nginx -d example.com -d www.example.com

如果这是您第一次在此服务器上运行 certbot,客户端会提示您输入电子邮件地址并同意 Let's Encrypt 服务条款。 完成此操作后,certbot 将与 Let's Encrypt 服务器通信,然后运行质询以验证您是否控制了要为其请求证书的域。

如果挑战成功,Certbot 将询问您希望如何配置 HTTPS 设置:

Output. . .
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

选择您的选择,然后点击 ENTER。 这将更新配置并重新加载 Nginx 以获取新设置。 certbot 将以一条消息结束,告诉您该过程已成功以及您的证书存储在哪里:

OutputIMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /usr/local/etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /usr/local/etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-09-24. 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 /usr/local/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

您的证书现已下载、安装和配置。 尝试使用 https:// 重新加载您的网站,并注意浏览器的安全指示器。 它应该表示该站点已得到适当保护,通常带有绿色锁定图标。 如果您使用 SSL Labs Server Test 测试您的服务器,它将获得 A 等级。

在确认您能够通过 HTTPS 访问您的站点后,您可以进入本教程的最后一步,在该步骤中您将确认您可以更新您的证书,然后配置一个流程来自动更新它们。

第 4 步 — 验证 Certbot 自动续订

Let's Encrypt 的证书有效期只有九十天。 这是为了鼓励用户自动化他们的证书更新过程。 此步骤描述如何通过设置 cron 任务来自动更新证书。 不过,在设置此自动续订之前,测试您是否能够正确续订证书非常重要。

要测试更新过程,您可以使用 certbot 进行试运行:

sudo certbot renew --dry-run

如果您没有看到任何错误,那么您就可以创建一个新的 crontab:

sudo crontab -e 

这将打开一个新的 crontab 文件。 将以下内容添加到新文件中,这将告诉 cron 每天中午和午夜运行两次 certbot renew 命令。 certbot renew 检查系统上是否有任何证书即将到期,并在必要时尝试更新它们:

0 0,12 * * * /usr/local/bin/certbot renew

请注意,由于您在 crontab -e 命令之前使用了 sudo,因此此操作将以 root 身份运行,这是必要的,因为 certbot 需要超级用户权限才能运行。

如果自动续订过程失败,Let's Encrypt 将向您指定的电子邮件发送一条消息,在您的证书即将到期时警告您。

结论

在本教程中,我们安装了 Let's Encrypt 客户端 certbot,为我们的域下载 SSL 证书,配置 Nginx 以使用这些证书,并设置自动证书更新。 如果您对使用 Certbot 有其他疑问, 他们的文档 是一个很好的起点。