介绍
本教程将向您展示如何在运行 Apache 作为 Web 服务器的 Debian 8 服务器上从 Let's Encrypt 设置 TLS/SSL 证书。 我们还将介绍如何使用 cron 作业自动执行证书更新过程。
SSL 证书在 Web 服务器中用于加密服务器和客户端之间的流量,为访问您的应用程序的用户提供额外的安全性。 Let's Encrypt 提供了一种免费获取和安装可信证书的简单方法。
先决条件
为了完成本指南,您需要一个具有非 root sudo
用户的 Debian 8 服务器来执行管理任务。 您可以按照我们的 Debian 8 初始服务器设置指南 设置具有适当权限的用户。
您必须拥有或控制您希望使用证书的注册域名。 如果您还没有注册域名,您可以在众多域名注册商之一注册一个(例如 Namecheap、GoDaddy 等)。
如果您还没有,请务必创建一个 A 记录,将您的域指向您服务器的公共 IP 地址(如果您使用 DigitalOcean 的 DNS,您可以按照 本指南 [X194X ])。 这是必需的,因为 Let's Encrypt 如何验证您是否拥有它为其颁发证书的域。 例如,如果您想获得 example.com
的证书,则该域必须解析到您的服务器,验证过程才能正常工作。 我们的设置将使用 example.com
和 www.example.com
作为域名,因此需要 两个 DNS 记录。
当您准备好继续前进时,使用您的 sudo 帐户登录您的服务器。
第 1 步:安装 Certbot,Let's Encrypt 客户端
使用 Let's Encrypt 获取 SSL 证书的第一步是在您的服务器上安装 certbot
Let's Encrypt 客户端。
certbot
软件包在 Debian 8 发布时不可用。 要访问 certbot
包,我们必须在我们的服务器上启用 Jessie backports 存储库。 此存储库可用于安装比稳定存储库中包含的更新版本的软件。
通过键入以下内容将 backports 存储库添加到您的服务器:
echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list
添加新存储库后,更新 apt
包索引以下载有关新包的信息:
sudo apt-get update
更新存储库后,您可以安装 python-certbot-apache
包,它通过定位反向端口存储库来引入 certbot
:
注意: 使用 backports 时,建议只安装您需要的特定包,而不是使用存储库进行一般更新。 与主存储库相比,反向移植包的兼容性保证更少。
为了帮助避免使用此存储库意外安装或更新软件包,您必须显式传递带有存储库名称的 -t
标志以从后端安装软件包。
sudo apt-get install python-certbot-apache -t jessie-backports
certbot
客户端现在应该可以使用了。
第 2 步:设置 Apache ServerName 和 ServerAlias
在调用 certbot
实用程序时,可以将我们希望保护的域作为参数传递。 但是,certbot
也可以从 Apache 配置本身读取这些。 由于始终明确您的服务器应响应的域是一种很好的做法,因此我们将直接在 Apache 配置中设置 ServerName
和 ServerAlias
。
当我们安装 python-certbot-apache
服务时,如果系统上不存在 Apache,则安装它。 打开默认的 Apache 虚拟主机文件,以便我们可以显式设置我们的域名:
sudo nano /etc/apache2/sites-available/000-default.conf
在内部,在 Virtual Host 块中,添加或取消注释 ServerName
指令并将其设置为您的主域名。 可以使用 ServerAlias
指令添加此服务器也应响应的任何替代域名。
对于我们的示例,我们使用 example.com
作为我们的规范名称,使用 www.example.com
作为别名。 当我们设置这些指令时,它将如下所示:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> . . . ServerName example.com ServerAlias www.example.com . . . </VirtualHost>
完成后,按住 CTRL 并按 X 保存并关闭文件。 输入 Y 并按 Enter 保存文件。
检查配置文件以捕获您的更改可能引入的任何语法错误:
sudo apache2ctl configtest
在输出中查找这一行:
OutputSyntax OK
如果文件通过了语法测试,请重新启动 Apache 服务以实施您的更改:
sudo systemctl restart apache2
现在 Apache 已经配置了您的域名,我们可以使用 certbot
来获取我们的 SSL 证书。
第三步:调整防火墙
如果您启用了防火墙,则需要调整设置以允许 SSL 流量。 所需的过程取决于您使用的防火墙软件。 如果您当前没有配置防火墙,请随时跳过。
UFW
如果您使用 ufw,您可以通过键入以下内容查看当前设置:
sudo ufw status
它可能看起来像这样,这意味着只允许 SSH 流量到 Web 服务器:
OutputStatus: active To Action From -- ------ ---- SSH ALLOW Anywhere SSH (v6) ALLOW Anywhere (v6)
为了额外允许 HTTP 和 HTTPS 流量,我们可以允许“WWW Full”应用程序配置文件:
sudo ufw allow 'WWW Full'
您的状态现在应该如下所示:
sudo ufw status
OutputStatus: active To Action From -- ------ ---- SSH ALLOW Anywhere WWW Full ALLOW Anywhere SSH (v6) ALLOW Anywhere (v6) WWW Full (v6) ALLOW Anywhere (v6)
您的服务器现在应该接受 HTTP 和 HTTPS 请求。
IPTables
如果您使用 iptables
,您可以通过键入以下内容查看当前规则:
sudo iptables -S
如果您启用了任何规则,它们将被显示。 示例配置可能如下所示:
Output-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
打开 SSL 流量所需的命令取决于您当前的规则。 对于像上面这样的基本规则集,您可以通过键入以下内容添加 SSL 访问:
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
如果我们再次查看防火墙规则,我们应该会看到新规则:
sudo iptables -S
Output-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
如果您使用程序在启动时自动应用 iptables
规则,您需要确保使用新规则更新您的配置。
第 4 步:设置 SSL 证书
使用 Let's Encrypt 客户端为 Apache 生成 SSL 证书非常简单。 客户端将自动获取并安装对我们的 Apache 配置中的域有效的新 SSL 证书。
要执行交互式安装并获取 Apache 配置中定义的所有域的证书,请键入:
sudo certbot --apache
certbot
实用程序将评估您的 Apache 配置以查找应由请求的证书覆盖的域。 您将能够取消选择您不希望证书涵盖的任何已定义域。
您将看到一个分步指南来自定义您的证书选项。 您将被要求提供丢失密钥恢复和通知的电子邮件地址,并且您可以选择启用 http
和 https
访问或强制所有请求重定向到 https
。 通常要求 https
是最安全的,除非您特别需要未加密的 http
流量。
安装完成后,您应该可以在 /etc/letsencrypt/live
找到生成的证书文件。 您可以使用以下链接验证 SSL 证书的状态(不要忘记将 example.com 替换为您的域):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
测试可能需要几分钟才能完成。 您现在应该可以使用 https
前缀访问您的网站。
第 5 步:设置自动续订
Let's Encrypt 证书的有效期为 90 天,但建议您每 60 天更新一次证书,以允许存在误差。 certbot
客户端有一个 renew
命令,它会自动检查当前安装的证书,并在距离到期日期不到 30 天时尝试更新它们。
要触发所有已安装域的续订过程,您应该运行:
sudo certbot renew
因为我们最近安装了证书,所以该命令只会检查到期日期并打印一条消息,通知证书尚未到期续订。 输出应与此类似:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/example.com.conf ------------------------------------------------------------------------------- Cert not yet due for renewal The following certs are not due for renewal yet: /etc/letsencrypt/live/example.com/fullchain.pem (skipped) No renewals were attempted.
请注意,如果您创建了包含多个域的捆绑证书,则输出中将仅显示基本域名,但续订应对该证书中包含的所有域都有效。
确保您的证书不会过时的一种实用方法是创建一个 cron 作业,该作业将定期为您执行自动更新命令。 由于续订首先检查到期日期,并且仅在证书距离到期不到 30 天时才执行续订,因此可以安全地创建一个每周甚至每天运行的 cron 作业。
让我们编辑 crontab 以创建一个每周运行更新命令的新作业。 要为 root 用户编辑 crontab,请运行:
sudo crontab -e
系统可能会提示您选择编辑器:
Outputno crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny Choose 1-3 [1]:
除非您更习惯使用 vim
,否则请按 Enter 以使用默认值 nano
。
在 crontab 的末尾包含以下内容,全部在一行中:
crontab. . . 30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
保存并退出。 这将创建一个新的 cron 作业,该作业将在每周一凌晨 2:30 执行 letsencrypt-auto renew
命令。 该命令产生的输出将通过管道传送到位于 /var/log/le-renewal.log
的日志文件。
有关如何创建和安排 cron 作业的更多信息,您可以在 VPS 指南中查看我们的 How to Use Cron to Automate Tasks。
结论
在本指南中,我们了解了如何从 Let's Encrypt 安装免费的 SSL 证书,以保护由 Apache 托管的网站。 我们建议您不定期查看官方 Let's Encrypt 博客 以获取重要更新。