如何在Debian8上使用Let'sEncrypt保护Apache

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

介绍

本教程将向您展示如何在运行 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.comwww.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 配置中设置 ServerNameServerAlias

当我们安装 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 配置以查找应由请求的证书覆盖的域。 您将能够取消选择您不希望证书涵盖的任何已定义域。

您将看到一个分步指南来自定义您的证书选项。 您将被要求提供丢失密钥恢复和通知的电子邮件地址,并且您可以选择启用 httphttps 访问或强制所有请求重定向到 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 博客 以获取重要更新。