如何在FreeBSD12.0上使用Let'sEncrypt保护Apache

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

作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。

介绍

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

在本教程中,您将使用 Certbot 在运行 Apache 作为 Web 服务器的 FreeBSD 12.0 服务器上设置来自 Let's Encrypt 的 TLS/SSL 证书。 此外,您将使用 cron 作业自动执行证书更新过程。

先决条件

在开始本指南之前,您需要以下内容:

  • FreeBSD 12.0 服务器,您可以使用 How To Get Started with FreeBSD 上的本指南随意设置。
  • 通过完成此 FAMP 堆栈教程 的第 1 步安装 Apache。
  • 使用本 tutorial 说明中的防火墙配置步骤启用的防火墙。
  • 两个 DNS A 记录 将您的域指向您服务器的公共 IP 地址。 我们的设置将使用 your-domainwww.your-domain 作为域名,这两个域名都需要有效的 DNS 记录。 您可以关注这个DigitalOcean DNS介绍详细了解如何使用DigitalOcean平台添加DNS记录。 DNS A 记录是必需的,因为 Let's Encrypt 如何验证您是否拥有它为其颁发证书的域。 例如,如果您想获得 your-domain 的证书,则该域必须解析到您的服务器,验证过程才能正常工作。

一旦满足这些先决条件,您就可以开始安装 Certbot,该工具将允许您安装 Let's Encrypt 证书。

第 1 步 — 为 Let's Encrypt 安装 Certbot 工具

Let's Encrypt 证书确保用户的浏览器可以验证 Web 服务器是否由受信任的证书颁发机构保护。 与 Web 服务器的通信受到使用 HTTPS 的加密保护。

在此步骤中,您将为您的 Web 服务器安装 Certbot 工具,以向 Let's Encrypt 服务器发出请求,以便为您的域颁发有效的证书和密钥。

运行以下命令来安装 Certbot 包及其 Apache HTTP 插件:

sudo pkg install -y py37-certbot py37-certbot-apache

现在您已经安装了该软件包,您可以继续在 Web 服务器中启用 TLS 连接。

第 2 步 — 在 Apache HTTP 中启用 SSL/TLS 连接

默认情况下,任何 Apache HTTP 安装都将在端口 80 (HTTP) 上提供内容。 主 httpd.conf 配置文件中的 Listen 80 条目证实了这一点。 为了允许 HTTPS 连接,您需要默认端口为 443。 要添加端口 443 并建立 SSL/TLS 连接,您将在 Apache HTTP 中启用 mod_ssl 模块。

要在 httpd.conf 文件中找到此模块,您将使用带有 -n 标志的 grep 对指定路径中文件的行进行编号。 在这里,您将通过运行以下命令找到 mod_ssl.so

grep -n 'mod_ssl.so' /usr/local/etc/apache24/httpd.conf

作为输出,您将收到所需线路的编号:

/usr/local/etc/apache24/httpd.conf

148 #LoadModule ssl_module libexec/apache24/mod_ssl.so

要启用该模块,您将删除行首的主题标签符号。

使用上一个命令中的行号打开文件,如下所示:

sudo vi +148 /usr/local/etc/apache24/httpd.conf

这会将您直接带到正确的行进行编辑。

x 编辑该行,如下所示:

/usr/local/etc/apache24/httpd.conf

#LoadModule session_dbd_module libexec/apache24/mod_session_dbd.so
#LoadModule slotmem_shm_module libexec/apache24/mod_slotmem_shm.so
#LoadModule slotmem_plain_module libexec/apache24/mod_slotmem_plain.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
#LoadModule dialup_module libexec/apache24/mod_dialup.so
#LoadModule http2_module libexec/apache24/mod_http2.so
#LoadModule proxy_http2_module libexec/apache24/mod_proxy_http2.so

删除 # 后,按 :wq 然后按 ENTER 关闭文件。

您已在 Apache HTTP 中启用 SSL/TLS 功能。 在下一步中,您将在 Apache HTTP 中配置虚拟主机。

第 3 步 — 启用和配置虚拟主机

虚拟主机是一种方法,通过该方法,多个网站可以使用相同的 Apache HTTP 安装同时且独立地存在于同一服务器中。 Certbot 需要此设置在配置文件(虚拟主机)中放置特定规则,以使 Let's Encrypt 证书正常工作。

首先,您将在 Apache HTTP 中启用虚拟主机。 运行以下命令以在文件中找到指令:

grep -n 'vhosts' /usr/local/etc/apache24/httpd.conf

您将在输出中看到行号:

Output508  #Include etc/apache24/extra/httpd-vhosts.conf

现在使用以下命令编辑文件并从该行的开头删除 #

sudo vi +508 /usr/local/etc/apache24/httpd.conf

和以前一样,点击 x 从行首删除 # ,如下所示:

/usr/local/etc/apache24/httpd.conf

...
# User home directories
#Include etc/apache24/extra/httpd-userdir.conf

# Real-time info on requests and configuration
#Include etc/apache24/extra/httpd-info.conf

# Virtual hosts
Include etc/apache24/extra/httpd-vhosts.conf

# Local access to the Apache HTTP Server Manual
#Include etc/apache24/extra/httpd-manual.conf

# Distributed authoring and versioning (WebDAV)
#Include etc/apache24/extra/httpd-dav.conf
...

然后按 :wqENTER 保存并退出文件。

现在您已经在 Apache HTTP 中启用了虚拟主机,您将修改默认虚拟主机配置文件以将示例域替换为您的域名。

您现在将向 httpd-vhosts.conf 文件添加一个虚拟主机块。 您将使用以下命令编辑文件并在第 23 行的注释块之后删除两个现有的 VirtualHost 块:

sudo vi +23 /usr/local/etc/apache24/extra/httpd-vhosts.conf

打开文件后删除两个现有的 VirtualHost 配置块,然后添加以下具有此特定配置的块:

/usr/local/etc/apache24/extra/httpd-vhosts.conf

<VirtualHost *:80>
    ServerAdmin your_email@your_domain.com
    DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
    ServerName your_domain.com
    ServerAlias www.your_domain.com
    ErrorLog "/var/log/your_domain.com-error_log"
    CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>

在此块中,您正在配置以下内容:

  • ServerAdmin:这是放置该特定站点负责人的电子邮件的位置。
  • DocumentRoot:该指令定义了特定站点的文件将被放置和读取的位置。
  • ServerName:这是站点的域名。
  • ServerAlias:与 ServerName 类似,但在域名前放置 www.
  • ErrorLog:这是声明错误日志路径的地方。 所有错误消息都将写入此指令指定的文件中。
  • CustomLog:类似于ErrorLog,但这次是收集所有访问日志的文件。

最后,您将创建放置站点的目录。 此路径必须与您在 httpd-vhosts.conf 文件中的 DocumentRoot 指令中声明的路径相匹配。

sudo mkdir /usr/local/www/apache24/data/your_domain.com

现在更改目录的权限,以便 Apache HTTP 进程(以 www 用户身份运行)可以使用它:

sudo chown -R www:www /usr/local/www/apache24/data/your_domain.com

您已经使用 chown 来更改所有权,并带有 -R 标志以使操作递归。 用户和组由www:www设置。

您已在 Apache HTTP 中启用虚拟主机。 您现在将启用重写模块。

第 4 步 — 启用重写模块

在 Apache HTTP 中启用重写模块对于更改 URL 是必要的,例如从 HTTP 重定向到 HTTPS 时。

使用以下命令查找重写模块:

grep -n 'rewrite' /usr/local/etc/apache24/httpd.conf

您将看到类似于以下内容的输出:

Output180  #LoadModule rewrite_module libexec/apache24/mod_rewrite.so

要启用该模块,您现在将从行首删除 #

sudo vi +180 /usr/local/etc/apache24/httpd.conf

通过点击 x 从行首删除 # 来编辑您的文件,如下所示:

/usr/local/etc/apache24/httpd.conf

#LoadModule actions_module libexec/apache24/mod_actions.so
#LoadModule speling_module libexec/apache24/mod_speling.so
#LoadModule userdir_module libexec/apache24/mod_userdir.so
LoadModule alias_module libexec/apache24/mod_alias.so
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule php7_module        libexec/apache24/libphp7.so

# Third party modules
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf

<IfModule unixd_module>

保存并退出此文件。

您现在已完成在 Apache 中设置必要的配置。

第 5 步 — 获取 Let's Encrypt 证书

Certbot 通过各种插件提供了多种获取 SSL 证书的方式。 apache 插件将负责重新配置 Apache HTTP。 要执行交互式安装并获取仅涵盖单个域的证书,请运行以下 certbot 命令:

sudo certbot --apache -d your-domain -d www.your-domain

如果要安装对多个域或子域有效的单个证书,可以将它们作为附加参数传递给命令,用 -d 标志标记每个新域或子域。 参数列表中的第一个域名将是 Let's Encrypt 用来创建证书的 base 域。 出于这个原因,首先传递基本域名,然后是任何其他子域或别名。

如果这是您第一次在此服务器上运行 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

您还可以在启用 HTTPHTTPS 访问或强制所有请求重定向到 HTTPS 之间进行选择。 为了更好的安全性,如果您没有任何特殊需要允许未加密的连接,建议选择选项2: Redirect。 选择您的选择,然后点击 ENTER

这将更新配置并重新加载 Apache HTTP 以获取新设置。 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 yyyy-mm-dd. 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 等级。

Certbot 进行了一些重要的配置更改。 当它在您的 Web 服务器中安装证书时,它必须将它们放置在特定路径中。 如果您现在阅读 httpd-vhosts.conf 文件中的内容,您将观察到 Certbot 程序所做的一些更改。

例如,在 <VirtualHost *:80> 部分中,重定向规则(如果选择)位于其底部。

/usr/local/etc/apache24/extra/httpd-vhosts.conf

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.your_domain.com [OR]
RewriteCond %{SERVER_NAME} =your_domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Certbot 还创建了一个名为 httpd-vhosts-le-ssl.conf 的文件,其中放置了 Apache 上的证书配置:

/usr/local/etc/apache24/extra/httpd-vhosts-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin your_email@your_domain.com
    DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
    ServerName your_domain.com
    ServerAlias www.your_domain.com
    ErrorLog "/var/log/your_domain.com-error_log"
    CustomLog "/var/log/your_domain.com-access_log" common

Include /usr/local/etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem
SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem
</VirtualHost>
</IfModule>

注意: 如果您想在使用 Let's Encrypt 证书的站点上更改 密码套件 的使用,可以在 /usr/local/etc/letsencrypt/options-ssl-apache.conf 文件中进行。


获得 Let's Encrypt 证书后,您现在可以继续设置自动续订。

第 6 步 — 配置自动证书更新

Let's Encrypt 证书的有效期为 90 天,但建议您每 60 天更新一次证书,以允许存在误差。 因此,最佳实践是自动化此过程以定期检查和更新证书。

首先,让我们检查一下您将用于更新证书的命令。 certbot Let's Encrypt 客户端有一个 renew 命令,该命令会自动检查当前安装的证书,并在距离到期日期不到 30 天时尝试更新它们。 通过使用 --dry-run 选项,您可以运行此任务的模拟来测试更新的工作方式:

sudo certbot renew --dry-run

确保您的证书不会过时的一种实用方法是创建一个 cron 作业,它将定期为您执行自动更新命令。 由于续订首先检查到期日期,并且仅在证书距离到期不到 30 天时才执行续订,因此创建每周甚至每天运行的 cron 作业是安全的。

官方 Certbot 文档 建议每天运行两次 cron。 这将确保在 Let's Encrypt 发起证书吊销的情况下,Certbot 更新您的证书不会超过半天。

编辑 crontab 以创建一个每天运行两次更新的新作业。 要为 root 用户编辑 crontab,请运行:

sudo crontab -e

将以下配置放入文件中,以便系统每天两次查找可更新证书并在需要时更新它们:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute    hour    mday    month   wday    command
  0         0,12    *       *       *       /usr/local/bin/certbot renew

在前两行中,您声明了环境变量,因此可以找到可执行路径以及它们正在执行的 shell。 然后,您指示您感兴趣的时间范围和要执行的命令。

通过这组简短的说明,您已经配置了证书的自动续订。

结论

在本教程中,您已经安装了 Let's Encrypt 客户端 certbot,下载了域的 SSL 证书,配置了 Apache 以使用这些证书,并设置了自动证书更新。 有关详细信息,请参阅 Certbot 的 文档