如何在 Debian 8 上使用 Let's Encrypt 保护 Apache

介绍

本教程将向您展示如何在运行 Apache 作为 Web 服务器的 Debian 8 服务器上从 Let's Encrypt设置 TLS/SSL 证书。

SSL证书用于网络服务器中加密服务器和客户端之间的流量,为访问您的应用程序的用户提供额外的安全性。

前提条件

要完成本指南,您将需要一个 Debian 8 服务器,具有非 root 用户,用于管理任务. 您可以通过遵循我们的 Debian 8 初始服务器设置指南来设置具有相应权限的用户。

您必须拥有或控制您希望使用证书的注册域名;如果您还没有注册域名,您可以与许多域名注册商之一(例如 Namecheap、GoDaddy 等)注册域名。

如果你还没有,请确保创建一个 A Record,将你的域名指向你的服务器的公共IP地址(如果你使用DigitalOcean的DNS,你可以遵循这个指南)(https://andsky.com/tech/tutorials/how-to-set-up-a-host-name-with-digitalocean))。这是由于Let's Encrypt如何验证你拥有它正在发行证书的域名所需的要求。

当您准备好继续运行时,请使用 sudo 帐户登录您的服务器。

步骤1:安装Certbot,让我们加密客户端

使用 Let's Encrypt 获得 SSL 证书的第一步是将 Let's Encrypt 客户端安装在您的服务器上。

当 Debian 8 发布时,certbot包无法使用。要访问certbot包,我们必须在我们的服务器上启用 Jessie backports 存储库。

将 backports 存储库添加到您的服务器,键入:

1echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

添加新的存储库后,更新apt包索引以下载有关新包的信息:

1sudo apt-get update

一旦存储库更新,您可以通过瞄准后备端存储库来安装python-certbot-apache包,该包将引入certbot:

<$>[注] **注:**使用后端口时,建议只安装所需的特定包,而不是使用存储库进行一般更新。

为了避免意外安装或更新使用此存储库的软件包,您必须明确通过存储库名称的t标志来安装软件包

1sudo apt-get install python-certbot-apache -t jessie-backports

certbot客户端现在应该准备好使用。

步骤 2:设置Apache服务器名称和服务器Alias

但是,certbot 也可以从 Apache 配置本身读取这些内容. 由于始终明确你的服务器应该响应的域是很好的做法,我们将直接在 Apache 配置中设置ServerNameServerAlias

當我們安裝「python-certbot-apache」服務時,如果它已經不在系統上,就安裝了Apache。

1sudo nano /etc/apache2/sites-available/000-default.conf

在虚拟主机区块内,添加或删除ServerName指令并将其设置为您的主要域名,任何该服务器也应响应的替代域名都可以使用ServerAlias指令添加。

為我們的例子,我們正在使用「example.com」為我們的典範名稱和「www.example.com」為號.當我們設定這些指令時,它將看起來像這樣:

1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3    . . .
4    ServerName example.com
5    ServerAlias www.example.com
6    . . .
7</VirtualHost>

完成后,将文件保存并关闭,按住 CTRL并按住 X. 键入 Y并按住 Enter来保存文件。

检查配置文件,查找可能由您的更改引入的任何语法错误:

1sudo apache2ctl configtest

在输出中寻找此行:

1[secondary_label Output]
2Syntax OK

如果文件通过了语法测试,请重新启动 Apache 服务以实现更改:

1sudo systemctl restart apache2

现在Apache已与您的域名配置,我们可以使用certbot获取我们的SSL证书。

步骤三:调整防火墙

如果您已启用防火墙,则需要调整设置以允许SSL流量。所需程序取决于您正在使用的防火墙软件。

UFW

如果您正在使用 ufw,您可以通过键入查看当前设置:

1sudo ufw status

它可能看起来像这样,这意味着只允许 SSH 流量到 Web 服务器:

1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6SSH ALLOW Anywhere
7SSH (v6)                   ALLOW Anywhere (v6)

为了进一步允许 HTTP 和 HTTPS 流量,我们可以允许WWW Full应用程序配置:

1sudo ufw allow 'WWW Full'

你的状态现在应该是这样的:

1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6SSH ALLOW Anywhere
7WWW Full ALLOW Anywhere
8SSH (v6)                   ALLOW Anywhere (v6)
9WWW Full (v6)              ALLOW Anywhere (v6)

HTTP 和 HTTPS 请求现在应该被您的服务器接受。

标签

如果您正在使用iptables,您可以通过键入查看当前的规则:

1sudo iptables -S

如果您已启用任何规则,则会显示这些规则. 一个示例配置可能看起来像这样:

1[secondary_label Output]
2-P INPUT DROP
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -i lo -j ACCEPT
6-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
7-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

打开 SSL 流量所需的命令将取决于您当前的规则。 对于像上面这样的一套基本规则,您可以通过键入添加 SSL 访问:

1sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

如果我们再次看看防火墙规则,我们应该看到新的规则:

1sudo iptables -S
1[secondary_label Output]
2-P INPUT DROP
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
6-A INPUT -i lo -j ACCEPT
7-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
9-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

如果您正在使用一个程序在启动时自动应用iptables规则,则需要确保您使用新规则更新配置。

第4步:设置SSL证书

使用 Let’s Encrypt 客户端生成 Apache 的 SSL 证书非常简单,客户端将自动获得并安装一个新的 SSL 证书,该证书适用于我们 Apache 配置中的域。

要执行交互式安装,并获得在您的 Apache 配置中定义的所有域的证书,请键入:

1sudo certbot --apache

certbot实用程序将评估您的Apache配置,以找到应该被要求的证书所覆盖的域。

您将被要求提供一个电子邮件地址,以恢复丢失的密钥和通知,您将能够选择允许httphttps访问或强迫所有请求重定向到https

安装完成后,您应该能够在 /etc/letsencrypt/live 找到生成的证书文件. 您可以通过以下链接验证您的 SSL 证书的状态(不要忘了用您的域代替 example.com):

1https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest

测试可能需要几分钟才能完成,您现在应该能够使用https前缀访问您的网站。

步骤五:设置自动更新

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

要启动所有已安装的域的更新过程,您应该运行:

1sudo certbot renew

由于我们最近安装了证书,该命令只会检查到到期日期,并打印消息,通知证书尚未更新。

 1[secondary_label Output]
 2Saving debug log to /var/log/letsencrypt/letsencrypt.log
 3
 4-------------------------------------------------------------------------------
 5Processing /etc/letsencrypt/renewal/example.com.conf
 6-------------------------------------------------------------------------------
 7Cert not yet due for renewal
 8
 9The following certs are not due for renewal yet:
10  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
11No renewals were attempted.

请注意,如果您创建了包含多个域的组合证书,则输出中只会显示基本域名,但更新应适用于该证书中包含的所有域名。

确保您的证书不会过时的一个实用方法是创建一个 cron 工作,该工作会定期为您执行自动更新命令. 由于更新首先检查到到期日期,并且只执行更新,如果证书在到期日期后不到 30 天,例如,创建一个运行每周甚至每天的 cron 工作是安全的。

让我们编辑 crontab 来创建一个新的任务,它将每周运行更新命令。

1sudo crontab -e

您可能会被要求选择一个编辑器:

1[secondary_label Output]
2no crontab for root - using an empty one
3
4Select an editor. To change later, run 'select-editor'.
5  1. /bin/nano        <---- easiest
6  2. /usr/bin/vim.basic
7  3. /usr/bin/vim.tiny
8
9Choose 1-3 [1]:

除非您对vim更舒适,否则请按 Enter 以使用nano,即默认值。

在 crontab 末尾包含下列内容,全部在一行:

1[secondary_label crontab]
2. . .
330 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

这将创建一个新的cron任务,每周一下午2点30分执行letsencrypt-auto renew命令,命令产生的输出将被导向位于/var/log/le-renewal.log的日志文件。

<$>[注] 有关如何创建和安排 cron 工作的更多信息,请参阅我们的 如何在 VPS 中使用 Cron 来自动化任务指南。

结论

在本指南中,我们看到了如何从 Let's Encrypt 安装免费的 SSL 证书,以便保护由 Apache 托管的网站. 我们建议您不时查看官方 Let's Encrypt 博客的重要更新。

Published At
Categories with 技术
comments powered by Disqus