作为 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-domain
和www.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 ...
然后按 :wq
和 ENTER
保存并退出文件。
现在您已经在 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
您还可以在启用 HTTP
和 HTTPS
访问或强制所有请求重定向到 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 的 文档 。