如何在 FreeBSD 12.0 上用 Let's Encrypt 加密 Apache

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

Let's Encrypt是一个证书授权机构(CA),它提供了一个简单的方法来获取和安装免费的TLS/SSL证书(https://andsky.com/tech/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs),从而在Web服务器上允许加密HTTPS。

在本教程中,您将使用 Certbot 在运行 Apache 作为 Web 服务器的 FreeBSD 12.0 服务器上设置从 Let’s Encrypt 的 TLS/SSL 证书。

<$>[注] **注:**截至2022年7月1日,DigitalOcean不再支持通过控制面板或API创建新的FreeBSD Droplets。

前提条件

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

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

步骤 1 — 安装 Let’s Encrypt 的 Certbot 工具

Let’s Encrypt 证书确保用户的浏览器可以验证网页服务器是否由受信任的证书授权机构保护。

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

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

1sudo 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」文件中找到此模块,您将使用「grep」和「-n」旗号来编号指定的路径中的文件中的行。

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

作为输出,您将收到您需要的行号码:

1[label /usr/local/etc/apache24/httpd.conf]
2148 #LoadModule ssl_module libexec/apache24/mod_ssl.so

要启用该模块,您将在行开始时删除标签符号。

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

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

这将把你直接带到正确的编辑线。

通过按x来编辑行以显示如下:

1[label /usr/local/etc/apache24/httpd.conf]
2#LoadModule session_dbd_module libexec/apache24/mod_session_dbd.so
3#LoadModule slotmem_shm_module libexec/apache24/mod_slotmem_shm.so
4#LoadModule slotmem_plain_module libexec/apache24/mod_slotmem_plain.so
5LoadModule ssl_module libexec/apache24/mod_ssl.so
6#LoadModule dialup_module libexec/apache24/mod_dialup.so
7#LoadModule http2_module libexec/apache24/mod_http2.so
8#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 中启用虚拟主机. 运行以下命令以在文件中找到指令:

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

您将在输出中看到行号码:

1[secondary_label Output]
2508  #Include etc/apache24/extra/httpd-vhosts.conf

现在使用以下命令来编辑文件,并从该行开始删除#:

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

如前所述,点击x,从行开始删除#,看起来如下:

 1[label /usr/local/etc/apache24/httpd.conf]
 2...
 3# User home directories
 4#Include etc/apache24/extra/httpd-userdir.conf
 5
 6# Real-time info on requests and configuration
 7#Include etc/apache24/extra/httpd-info.conf
 8
 9# Virtual hosts
10Include etc/apache24/extra/httpd-vhosts.conf
11
12# Local access to the Apache HTTP Server Manual
13#Include etc/apache24/extra/httpd-manual.conf
14
15# Distributed authoring and versioning (WebDAV)
16#Include etc/apache24/extra/httpd-dav.conf
17...

然后按:wqENTER来保存和关闭文件。

现在您已在 Apache HTTP 中启用了虚拟主机,您将更改默认的虚拟主机配置文件以用您的域名取代示例域名。

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

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

打开文件后,删除现有的两个VirtualHost配置块,然后添加下面的配置块:

1[label /usr/local/etc/apache24/extra/httpd-vhosts.conf]
2<VirtualHost *:80>
3    ServerAdmin your_email@your_domain.com
4    DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
5    ServerName your_domain.com
6    ServerAlias www.your_domain.com
7    ErrorLog "/var/log/your_domain.com-error_log"
8    CustomLog "/var/log/your_domain.com-access_log" common
9</VirtualHost>

在这个区块中,您正在配置以下内容:

DocumentRoot:本指令定义了特定网站的文件将放在哪里,并从那里读取 *ServerName:这是网站的域名 *ServerAlias:类似于ServerName,但将www.放在域名之前 *ErrorLog:这是错误日志路径声明的地方。

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

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

现在更改目录的权限,以便Apache HTTP 流程(作为www用户运行)可以与其工作:

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

您已经使用chown来更改拥有权,使用-R旗帜来使操作回归性。

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

步骤 4 – 启用重写模块

在 Apache HTTP 中启用重写模块是必要的,以使 URL 发生更改,例如,当从 HTTP 重定向到 HTTPS。

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

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

你会看到类似的输出:

1[secondary_label Output]
2180  #LoadModule rewrite_module libexec/apache24/mod_rewrite.so

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

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

通过点击x来编辑您的文件,从行开始删除#:

 1[label /usr/local/etc/apache24/httpd.conf]
 2#LoadModule actions_module libexec/apache24/mod_actions.so
 3#LoadModule speling_module libexec/apache24/mod_speling.so
 4#LoadModule userdir_module libexec/apache24/mod_userdir.so
 5LoadModule alias_module libexec/apache24/mod_alias.so
 6LoadModule rewrite_module libexec/apache24/mod_rewrite.so
 7LoadModule php7_module libexec/apache24/libphp7.so
 8
 9# Third party modules
10IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf
11
12<IfModule unixd_module>

保存和退出此文件。

您现在已经完成了在 Apache 中设置所需的配置。

步骤5 – 获取 Let’s Encrypt 证书

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

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

如果你想安装一个单一的证书,适用于多个域或子域,你可以将其作为额外的参数传递给命令,标记每个新域或子域的d旗帜。参数列表中的第一个域名将是使用Let’s Encrypt创建证书的 base域名。

如果这是您第一次在这个服务器上运行certbot,客户端将提示您输入电子邮件地址并同意Let’s Encrypt服务条款。

如果挑战成功,Certbot 会问您如何配置 HTTPS 设置:

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

您还可以选择允许HTTPHTTPS访问,或者强迫所有请求重定向到HTTPS。为了更好的安全性,建议您选择2:重定向,如果您没有任何特殊需要允许未加密连接。

这将更新配置并重新加载Apache HTTP以获取新的设置。 certbot将带上一个消息,告诉您该过程成功,您的证书存储在哪里:

 1[secondary_label Output]
 2IMPORTANT NOTES:
 3- Congratulations! Your certificate and chain have been saved at:
 4 /usr/local/etc/letsencrypt/live/example.com/fullchain.pem
 5 Your key file has been saved at:
 6 /usr/local/etc/letsencrypt/live/example.com/privkey.pem
 7 Your cert will expire on yyyy-mm-dd. To obtain a new or tweaked
 8 version of this certificate in the future, simply run certbot
 9 again. To non-interactively renew *all* of your certificates, run
10 "certbot renew"
11- Your account credentials have been saved in your Certbot
12 configuration directory at /usr/local/etc/letsencrypt. You should
13 make a secure backup of this folder now. This configuration
14 directory will also contain certificates and private keys obtained
15 by Certbot so making regular backups of this folder is ideal.
16- If you like Certbot, please consider supporting our work by:
17
18 Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
19 Donating to EFF:                    https://eff.org/donate-le

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

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

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

1[label /usr/local/etc/apache24/extra/httpd-vhosts.conf]
2RewriteEngine on
3RewriteCond %{SERVER_NAME} =www.your_domain.com [OR]
4RewriteCond %{SERVER_NAME} =your_domain.com
5RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

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

 1[label /usr/local/etc/apache24/extra/httpd-vhosts-le-ssl.conf]
 2<IfModule mod_ssl.c>
 3<VirtualHost *:443>
 4    ServerAdmin your_email@your_domain.com
 5    DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
 6    ServerName your_domain.com
 7    ServerAlias www.your_domain.com
 8    ErrorLog "/var/log/your_domain.com-error_log"
 9    CustomLog "/var/log/your_domain.com-access_log" common
10
11Include /usr/local/etc/letsencrypt/options-ssl-apache.conf
12SSLCertificateFile /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem
13SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem
14</VirtualHost>
15</IfModule>

<$>[注] 注: 如果您想在使用 Let's Encrypt 证书的网站上对 cipher suites的使用进行更改,则可以在 /usr/local/etc/letsencrypt/options-ssl-apache.conf 文件中进行。

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

步骤 6 – 配置自动更新证书

Let’s Encrypt 证书有效期为 90 天,但建议您每隔 60 天更新证书,以便出现错误。

首先,让我们看看您将使用的命令来更新证书。certbot``Let’s Encrypt客户端有一个更新命令,该命令会自动检查当前安装的证书,并尝试更新它们,如果它们距离到期日期不到30天。

1sudo certbot renew --dry-run

确保您的证书不会过时的一种实用方法是创建一个 cron job,该任务会定期为您执行自动更新命令。

官方Certbot文件建议每天运行cron两次,这将确保如果Let's Encrypt启动证书撤销,在Certbot更新您的证书之前不会超过半天。

编辑crontab以创建一个新的工作,每天将运行更新两次。

1sudo crontab -e

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

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

在前两行中,您正在声明环境变量,因此可以找到可执行路径的位置和它们正在执行的壳,然后您表示您感兴趣的时间框架和要执行的命令。

使用此简短的指令集,您已配置了证书的自动更新。

结论

在本教程中,您已经安装了 Let’s Encrypt 客户端certbot,下载了域的 SSL 证书,配置了 Apache 以使用这些证书,并设置了自动证书更新。

Published At
Categories with 技术
comments powered by Disqus