如何在Debian9上使用Let'sEncrypt保护Apache
介绍
Let's Encrypt 是一个证书颁发机构 (CA),它提供了一种简单的方法来获取和安装免费的 TLS/SSL 证书,从而在 Web 服务器上启用加密的 HTTPS。 它通过提供软件客户端 Certbot 来简化流程,该客户端尝试自动化大部分(如果不是全部)所需步骤。 目前,获取和安装证书的整个过程在 Apache 和 Nginx 上都是完全自动化的。
在本教程中,您将使用 Certbot 为 Debian 9 上的 Apache 获取免费的 SSL 证书,并将您的证书设置为自动更新。
本教程将使用单独的 Apache 虚拟主机文件而不是默认配置文件。 我们建议为每个域创建新的 Apache 虚拟主机文件,因为它有助于避免常见错误并将默认文件作为后备配置进行维护。
先决条件
要遵循本教程,您将需要:
- 按照此 Debian 9 初始服务器设置教程设置一台 Debian 9 服务器,包括具有
sudo
权限的非 root 用户和防火墙。 - 完全注册的域名。 本教程将自始至终使用 example.com。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。
- 为您的服务器设置了以下两个 DNS 记录。 您可以关注这个DigitalOcean DNS的介绍,详细了解如何添加它们。
- 带有
example.com
的 A 记录指向您服务器的公共 IP 地址。 - 带有
www.example.com
的 A 记录指向您服务器的公共 IP 地址。
- 带有
- 按照 How To Install Apache on Debian 9 安装 Apache。 确保您的域具有 虚拟主机文件 。 本教程将以
/etc/apache2/sites-available/example.com.conf
为例。
第 1 步 — 安装 Certbot
使用 Let's Encrypt 获取 SSL 证书的第一步是在您的服务器上安装 Certbot 软件。
在撰写本文时,默认情况下 Certbot 无法从 Debian 软件存储库中获得。 为了使用 apt
下载软件,您需要将 backports 存储库添加到 sources.list
文件中,其中 apt
查找包源。 Backports 是来自 Debian 的测试和不稳定发行版的软件包,它们经过重新编译,因此它们可以在没有新库的情况下在稳定的 Debian 发行版上运行。
要添加 backports 存储库,请在 /etc/apt/
目录中打开(或创建)sources.list
文件:
sudo nano /etc/apt/sources.list
在文件的底部,添加以下行:
/etc/apt/sources.list.d/sources.list
. . . deb http://ftp.debian.org/debian stretch-backports main
这包括符合 Debian 自由软件指南 (DFSG) 的 main
软件包,以及 non-free
和 contrib
组件,它们是要么本身不符合 DFSG,要么在此类别中包含依赖项。
按 CTRL+X
、Y
,然后按 ENTER
保存并关闭文件,然后更新您的软件包列表:
sudo apt update
然后使用以下命令安装 Certbot。 请注意,-t
选项告诉 apt
通过查看您刚刚添加的 backports 存储库来搜索包:
sudo apt install python-certbot-apache -t stretch-backports
Certbot 现在可以使用了,但为了让它为 Apache 配置 SSL,我们需要验证 Apache 是否已正确配置。
第 2 步 — 设置 SSL 证书
Certbot 需要能够在您的 Apache 配置中找到正确的虚拟主机,才能自动配置 SSL。 具体来说,它通过查找与您为其请求证书的域匹配的 ServerName
指令来做到这一点。
如果您按照 Apache 安装教程 中的 虚拟主机设置步骤进行操作,您应该在 /etc/apache2/sites-available/example.com.conf
的域中有一个 VirtualHost
块和 ServerName
指令已经适当设置。
要检查,请使用 nano
或您喜欢的文本编辑器打开您的域的虚拟主机文件:
sudo nano /etc/apache2/sites-available/example.com.conf
找到现有的 ServerName
行。 它应该看起来像这样,使用您自己的域名而不是 example.com
:
/etc/apache2/sites-available/example.com.conf
... ServerName example.com; ...
如果还没有,请更新 ServerName
指令以指向您的域名。 然后保存文件,退出编辑器,并验证配置编辑的语法:
sudo apache2ctl configtest
如果没有任何语法错误,您将看到以下输出:
OutputSyntax OK
如果出现错误,请重新打开虚拟主机文件并检查是否有任何拼写错误或缺少字符。 一旦配置文件的语法正确,重新加载 Apache 以加载新配置:
sudo systemctl reload apache2
Certbot 现在可以找到正确的 VirtualHost 块并对其进行更新。
接下来,让我们更新防火墙以允许 HTTPS 流量。
第 3 步 — 允许 HTTPS 通过防火墙
如果按照先决条件指南的建议启用了 ufw
防火墙,则需要调整设置以允许 HTTPS 流量。 幸运的是,当安装在 Debian 上时,ufw
附带了一些配置文件,这些配置文件有助于简化更改 HTTP 和 HTTPS 流量的防火墙规则的过程。
您可以通过键入以下内容查看当前设置:
sudo ufw status
如果您按照我们关于 如何在 Debian 9 上安装 Apache 的指南的第 2 步操作,此命令的输出将如下所示,表明仅允许 HTTP 流量进入 Web 服务器:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere WWW ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) WWW (v6) ALLOW Anywhere (v6)
要额外允许 HTTPS 流量,请允许“WWW Full”配置文件并删除多余的“WWW”配置文件允许:
sudo ufw allow 'WWW Full' sudo ufw delete allow 'WWW'
您的状态现在应该如下所示:
sudo ufw status
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere WWW Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) WWW Full (v6) ALLOW Anywhere (v6)
接下来,让我们运行 Certbot 并获取我们的证书。
第 4 步 — 获取 SSL 证书
Certbot 提供了多种通过插件获取 SSL 证书的方式。 Apache 插件将负责重新配置 Apache 并在必要时重新加载配置。 要使用此插件,请键入以下内容:
sudo certbot --apache -d example.com -d www.example.com
这将使用 --apache
插件运行 certbot
,使用 -d
指定您希望证书有效的名称。
如果这是您第一次运行 certbot
,系统将提示您输入电子邮件地址并同意服务条款。 完成此操作后,certbot
将与 Let's Encrypt 服务器通信,然后运行质询以验证您是否控制了要为其请求证书的域。
如果成功,certbot
将询问您希望如何配置 HTTPS 设置:
OutputPlease 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):
选择您的选择,然后点击 ENTER
。 配置将被更新,Apache 将重新加载以获取新设置。 certbot
将以一条消息结束,告诉您该过程已成功以及您的证书存储在哪里:
OutputIMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2018-12-04. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /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 等级。
让我们通过测试更新过程来结束。
第 5 步 — 验证 Certbot 自动续订
Let's Encrypt 的证书有效期只有九十天。 这是为了鼓励用户自动化他们的证书更新过程。 我们安装的 certbot
包通过向 /etc/cron.d
添加更新脚本来为我们解决这个问题。 此脚本每天运行两次,并将自动更新到期后三十天内的任何证书。
要测试更新过程,您可以使用 certbot
进行试运行:
sudo certbot renew --dry-run
如果您没有看到任何错误,则说明一切就绪。 必要时,Certbot 将更新您的证书并重新加载 Apache 以获取更改。 如果自动续订过程失败,Let's Encrypt 将向您指定的电子邮件发送一条消息,在您的证书即将到期时警告您。
结论
在本教程中,您安装了 Let's Encrypt 客户端 certbot
,为您的域下载 SSL 证书,配置 Apache 以使用这些证书,并设置自动证书更新。 如果您对使用 Certbot 有其他疑问, 他们的文档 是一个很好的起点。