前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
本教程将向您展示如何在运行 Apache 作为 Web 服务器的 Debian 8 服务器上设置来自 Let’s Encrypt 的 TLS/SSL 证书。我们还将介绍如何使用定时作业自动更新证书。
SSL 证书在 Web 服务器内部使用,用于加密服务器和客户端之间的流量,为访问您的应用程序的用户提供额外的安全性。Let’s Encrypt 提供了一种轻松获取和安装免费受信任证书的方式。
先决条件
要完成本指南,您需要一个具有非根 sudo
用户以执行管理任务的 Debian 8 服务器。您可以按照我们的 Debian 8 初始服务器设置指南设置具有适当权限的用户。
您必须拥有或控制要在证书中使用的注册域名。如果您尚未拥有注册域名,可以通过许多域名注册商(例如 Namecheap、GoDaddy 等)注册一个。
如果尚未完成,请确保创建一个将您的域指向服务器的 A 记录(如果您使用 DigitalOcean 的 DNS,则可以按照此指南操作)。这是必需的,因为 Let’s Encrypt 验证您拥有要发放证书的域的方式。例如,如果您想为 example.com
获取证书,则该域必须解析到您的服务器才能使验证过程正常工作。我们的设置将使用 example.com
和 www.example.com
作为域名,因此 两个 DNS 记录都是必需的。
当您准备好继续时,请使用您的 sudo 帐户登录服务器。
步骤 1:安装 Let’s Encrypt 客户端 Certbot
使用 Let’s Encrypt 获取 SSL 证书的第一步是在服务器上安装 certbot
Let’s Encrypt 客户端。
在 Debian 8 发布时,certbot
软件包尚不可用。要访问 certbot
软件包,我们需要在服务器上启用 Jessie 回退存储库。此存储库可用于安装比稳定存储库中包含的更近期版本的软件。
通过输入以下命令将回退存储库添加到服务器:
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
:
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。打开默认的 Apache 虚拟主机文件,以便我们可以明确设置我们的域名:
sudo nano /etc/apache2/sites-available/000-default.conf
在其中,在虚拟主机块内,添加或取消注释 ServerName
指令,并将其设置为您的主域名。可以使用 ServerAlias
指令添加任何此服务器还应响应的替代域名。
在我们的示例中,我们使用 example.com
作为我们的规范名称,www.example.com
作为别名。设置这些指令后,将如下所示:
<VirtualHost *:80> . . . ServerName example.com ServerAlias www.example.com . . .</VirtualHost>
完成后,通过按住 CTRL 并按 X 键来保存并关闭文件。键入 Y 并按 Enter 保存文件。
检查配置文件以捕获可能由更改引入的任何语法错误:
sudo apache2ctl configtest
在输出中查找以下行:
Syntax OK
如果文件通过了语法测试,请重新启动 Apache 服务以实施更改:
sudo systemctl restart apache2
现在,Apache 已配置为使用您的域名,我们可以使用 certbot
获取我们的 SSL 证书。
步骤 3:调整防火墙
如果你启用了防火墙,你需要调整设置以允许 SSL 流量。所需的步骤取决于你正在使用的防火墙软件。如果你当前没有配置防火墙,可以跳过此步骤。
UFW
如果你使用 ufw,可以通过输入以下命令查看当前设置:
sudo ufw status
可能会显示如下内容,表示只允许 SSH 流量访问 Web 服务器:
状态:activeTo Action From-- ------ ----SSH ALLOW AnywhereSSH (v6) ALLOW Anywhere (v6)
为了额外允许 HTTP 和 HTTPS 流量,我们可以允许“WWW Full”应用程序配置:
sudo ufw allow 'WWW Full'
现在你的状态应该是这样的:
sudo ufw status
状态:activeTo Action From-- ------ ----SSH ALLOW AnywhereWWW Full ALLOW AnywhereSSH (v6) ALLOW Anywhere (v6)WWW Full (v6) ALLOW Anywhere (v6)
现在你的服务器应该能够接受 HTTP 和 HTTPS 请求。
IPTables
如果你使用 iptables
,可以通过输入以下命令查看当前规则:
sudo iptables -S
如果你已经启用了任何规则,它们将被显示出来。一个示例配置可能如下所示:
-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
-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 证书非常简单。该客户端将自动获取并安装一个新的 SSL 证书,该证书对 Apache 配置中的域名有效。
要执行交互式安装并为 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
因为我们最近安装了证书,该命令只会检查到期日期并打印一条消息,通知证书尚未到期续订。输出应该类似于这样:
Saving debug log to /var/log/letsencrypt/letsencrypt.log-------------------------------------------------------------------------------Processing /etc/letsencrypt/renewal/example.com.conf-------------------------------------------------------------------------------Cert not yet due for renewalThe 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
可能会提示你选择编辑器:
no crontab for root - using an empty oneSelect an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tinyChoose 1-3 [1]:
除非你更喜欢使用 vim
,否则按 Enter 使用默认的 nano
。
在 crontab 的末尾包含以下内容,全部在一行中:
[secondary_label crontab]. . .30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
保存并退出。这将创建一个新的 cron 作业,每周一凌晨 2:30 执行 letsencrypt-auto renew
命令。命令产生的输出将被重定向到位于 /var/log/le-renewal.log
的日志文件中。
结论
在本指南中,我们学习了如何安装来自 Let’s Encrypt 的免费 SSL 证书,以确保 Apache 托管的网站的安全性。我们建议您定期查看官方 Let’s Encrypt 博客,以获取重要的更新信息。