如何使用FreeBSD上的Let加密来保护Nginx

在本教程中,我们将向您展示如何使用Certbot获取免费的SSL证书,并将其与运行Nginx的FreeBSD服务器一起使用。我们还将向您展示如何自动续订SSL证书。

介绍

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

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

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

先决条件

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

  • 一个FreeBSD服务器。 如果您是使用FreeBSD的新手,可以按照本指南来帮助您开始使用。
  • 在您的服务器上安装并配置Nginx。 有关如何设置的指导,请参阅我们的关于如何在FreeBSD 10.1上安装Nginx,MySQL和PHP(FEMP)的指南 请注意,您无需安装或配置PHP或MySQL即可获得Let's Encrypt证书。 尽管如此,您至少需要安装,启用和配置Nginx,如链接教程中所示。
  • 您拥有和控制的注册域名。 如果您还没有注册域名,您可以在其中注册一个域名注册商(例如Namecheap,GoDaddy等)。
  • DNS A Record将您的域名指向您的服务器的公共IP地址。 你可以按照这个主机名教程来获取如何添加它们的细节。 这是必需的,因为让我们加密验证您拥有它颁发证书的域。 例如,如果您想获取example.com的证书,则该域必须解析到您的服务器以使验证过程正常工作。 我们的设置将使用example.comwww.example.com作为域名,所以这两个DNS记录都是必需的

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

第1步 - 安装Certbot

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

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

sudo portsnap fetch

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

sudo portsnap extract

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

cd /usr/ports/security/py-certbot

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

sudo make install clean

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

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

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

sudo make install clean

在这个插件的安装过程中,你会看到几个蓝色的对话框窗口,如下所示:

py-certbot-nginx对话框窗口的例子

这些给你选择安装插件及其依赖的文档。 为了本教程的目的,您可以按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 80 443"
firewall_allowservices="any"

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

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

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

然后,使用以下命令启动ipfw防火墙服务:

sudo service ipfw start

配置防火墙后,您现在可以运行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设置:

. . .
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将收到一条消息,告诉你该过程已成功完成,并存储证书的位置:

IMPORTANT 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实验室服务器测试测试服务器 ,它将获得A级。

在确认您可以通过HTTPS访问您的网站之后,您可以进入本教程的最后一步,在此确认您可以续订您的证书,然后配置一个流程以自动更新它们。

第4步 - 验证Certbot自动更新

让我们加密的证书只有九十天有效。 这是为了鼓励用户自动执行证书更新流程。 本步骤介绍如何通过设置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

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

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

结论

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