Debian 11 Apache配置:使用Let’s Encrypt实现SSL安全加密
引言
受信任的证书颁发机构(CA)—— Let’s Encrypt,提供了一种免费获取和安装TLS/SSL证书的方式,从而使Web服务器能够启用加密的HTTPS。它通过提供软件客户端Certbot来协助这个过程,尝试自动化大部分(如果不是全部)必要的步骤。目前,获得和安装证书的整个过程在Apache和Nginx上都是全自动化的。
在本教程中,您将使用 Certbot 为 Debian 11 上的 Apache 获取免费的 SSL 证书,并设置证书自动续期。
本教程将使用单独的Apache虚拟主机文件,而不是默认的配置文件。我们建议为每个域名创建新的Apache虚拟主机文件,因为这有助于避免常见错误,并将默认文件保留为备用配置。
先决条件
要按照本教程进行操作,你需要:
- 一个已按照Debian 11初始服务器设置教程配置好的Debian 11服务器,包括一个具有sudo权限的非root用户和防火墙。
- 一个完全注册的域名。本教程将全程使用
your_domain
作为示例。您可以在 Namecheap 购买域名,在 Freenom 免费获取,或使用您选择的域名注册商。 - 为您的服务器设置好以下两条DNS记录。要设置这些记录,您可以按照添加域名的说明,然后按照创建DNS记录的说明进行操作:
- 一个将
your_domain
指向您服务器公共IP地址的A记录。 - 一个将
www.your_domain
指向您服务器公共IP地址的A记录。
- 一个将
- 已按照如何在Debian 11上安装Apache的教程安装好Apache。请确保您已为您的域名设置了虚拟主机文件。本教程将使用
/etc/apache2/sites-available/your_domain.conf
作为示例。
步骤1 – 安装Certbot
使用Let’s Encrypt获取SSL证书的第一步是在您的服务器上安装Certbot软件。
注意:本教程遵循Certbot文档的建议,使用适用于Linux系统的包管理器snappy,在Debian上安装软件。snappy以一种称为snaps的格式安装软件包。您可以使用apt从默认的Debian软件源安装Certbot,但其安装的版本(1.12.0版本)比Certbot snap(1.29.0版本,截至本文撰写时的最新版本)要旧。在Debian上将Certbot安装为snap包,首先需要在服务器上安装snapd。snapd是一个必需的后台程序,用于安装、使用和管理snap包。安装snapd软件包还会在您的服务器上安装snap命令。
要安装snapd,如果您最近还没有更新本地软件包索引,请先更新它。
sudo apt update
然后安装snapd软件包。
sudo apt install snapd
运行此命令后,将会出现一个提示来确认是否要安装snapd以及它的依赖项。您可以通过按下 Y
键然后按下回车键来同意安装。
接下来,使用snap命令安装核心snap。这将在您的服务器上安装一些依赖项,这些依赖项对您安装的任何snap都是必需的,包括Certbot snap。
sudo snap install core
然后刷新核心快照。这样做将确保您安装了最新版本的snapd及其依赖项。
sudo snap refresh core
请注意,Snaps 可以在三种约束级别之一下进行安装,这些级别提供了不同程度的与系统隔离。例如,默认情况下,大多数 Snaps 是在 --strict
约束级别下安装的,这会阻止这些程序访问您系统的文件或网络。由于 Certbot 必须被允许编辑某些配置文件以正确设置证书,所以这个命令包括了 --classic
选项。这个约束级别允许任何在其下安装的 Snaps 与传统软件包一样访问系统资源。
考虑到这一点,您可以使用以下命令安装certbot snap。
sudo snap install --classic certbot
安装过程将会在 /snap/bin/
目录中安装certbot可执行文件。在 /usr/bin/
目录中创建一个符号链接以确保您可以在系统的任何位置运行certbot命令。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Certbot现在可以使用了,但为了让它为Apache配置SSL,您需要核实Apache已正确配置。
步骤2 — 设置SSL证书
为了让Certbot能够自动配置SSL,它需要在您的Apache配置中找到正确的虚拟主机。具体而言,通过搜索与您请求证书的域名相匹配的 ServerName
指令来实现此功能。
如果您按照Apache安装教程中的虚拟主机设置步骤操作,您的域名应该在 /etc/apache2/sites-available/your_domain.conf
处有一个 VirtualHost
块,并且 ServerName
指令已经适当地设置好了。
要检查,请使用nano或您喜欢的文本编辑器打开您域名的虚拟主机文件。
sudo nano /etc/apache2/sites-available/your_domain.conf
找到现有的 ServerName
行。它应该像下面这样,您需要用您自己的域名来替代 your_domain
。
您的域名配置文件位于 /etc/apache2/sites-available/your_domain.conf
。
这是文章《如何在Debian 11上使用Let’s Encrypt保护Apache》的第2部分(共3部分)。
...
ServerName your_domain;
...
如果尚未设置,请更新ServerName
指令以指向您的域名。然后保存文件并退出编辑器。如果您使用的是nano,请按CTRL + X
,然后按Y
,最后按ENTER
完成操作。
接下来,验证您所做的配置编辑的语法是否正确。
- sudo apache2ctl configtest
如果没有语法错误,您的输出将返回以下结果:
. . . Syntax OK
如果出现错误,请重新打开虚拟主机文件并检查是否有拼写错误或缺少字符。一旦配置文件的语法正确,重新加载Apache以加载新的配置文件。
- sudo systemctl reload apache2
Certbot现在可以找到正确的VirtualHost块并更新它。
接下来,让我们更新防火墙以允许HTTPS流量通过。
步骤三 — 允许防火墙通过HTTPS进入
如果您已经按照先决指南的建议启用了ufw防火墙,您需要调整设置以允许HTTPS流量。幸运的是,当在Debian上安装ufw时,它附带了几个配置文件,可以帮助您更改防火墙规则以适应HTTP和HTTPS流量。
您可以通过运行以下命令来验证当前设置。
- sudo ufw status
如果您按照我们在《如何在Debian 11上安装Apache》指南中的第二步操作,这个命令的输出将如下所示,表示只允许HTTP流量访问Web服务器。
Status: 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
Status: active
To Action From
— —— —-
OpenSSH ALLOW Anywhere
WWW Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
WWW Full (v6) ALLOW Anywhere (v6)
接下来,我们来运行Certbot并获取我们的证书。
步骤四 — 获取SSL证书
Certbot通过插件提供了多种方式来获取SSL证书。Apache插件将负责在必要时重新配置Apache并重新加载配置。要使用此插件,请运行以下命令:
- sudo certbot –apache -d your_domain -d www.your_domain
这个命令在certbot
上使用--apache
插件,并使用-d
参数来指定您希望证书有效的域名。
如果这是您第一次运行Certbot,系统会提示您输入电子邮件地址并同意服务条款。此外,系统还会询问您是否愿意与电子前哨基金会共享您的电子邮件地址,该基金会是一个倡导数字权利的非营利组织,也是Certbot的开发者。您可以选择输入Y
共享您的电子邮件地址或输入N
拒绝。
完成这些操作后,Certbot将与Let’s Encrypt服务器进行通信,然后运行一个挑战来验证您控制正在请求证书的域名。
如果成功的话,配置将会自动更新,Apache会重新加载以获取新的设置。Certbot会以一条消息告诉您进程已成功并指出证书的存储位置。
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-10-31. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/apache2/sites-available/your_domain-le-ssl.conf Successfully deployed certificate for www.your_domain to /etc/apache2/sites-available/your_domain-le-ssl.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – 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服务器测试来测试您的服务器,它将获得A级评分。
让我们通过测试续订流程来结束吧。
第五步-验证Certbot自动续订让我们加密的证书只有九十天的有效期。这是为了鼓励用户自动化他们的证书更新流程。您安装的certbot软件包会通过在/etc/cron.d中添加一个更新脚本来为您处理这个问题。这个脚本每天运行两次,会自动更新任何距过期还有三十天的证书。
为了测试续订过程,您可以使用certbot进行干运行。
- sudo certbot renew –dry-run
如果你没有收到任何错误,那么一切都准备就绪了。在必要时,Certbot将会更新你的证书并重新加载Apache以应用这些变化。如果自动续订过程失败,Let’s Encrypt将会发送邮件到你指定的邮箱,并在你的证书即将到期时提醒你。