简介
Let's Encrypt是一个证书颁发机构(CA),它提供了一种获得和安装免费TLS/SSL证书的方法,从而在网络服务器上实现加密的HTTPS。它通过提供一个软件客户端Certbot来帮助这个过程,该客户端试图将大部分(如果不是全部)所需的步骤自动化。目前,在Apache和Nginx上,获取和安装证书的整个过程是完全自动化的。
在本教程中,你将使用Certbot为Debian 11上的Apache获得一个免费的SSL证书,并设置证书的自动更新。
本教程将使用一个单独的Apache虚拟主机文件,而不是默认的配置文件。我们建议为每个域名创建新的Apache虚拟主机文件,因为这有助于避免常见的错误,并保持默认文件作为一个后备配置。
先决条件
要学习本教程,你将需要。
-
一台按照Debian 11 初始服务器设置教程设置的 Debian 11 服务器,包括一个具有
sudo权限的非根用户和一个防火墙。 -
一个完全注册的域名。本教程将以your_domain为例来说明。你可以在Namecheap 上购买一个域名,在Freenom 上免费获得一个,或者使用你选择的域名注册商。
-
为你的服务器设置以下两个DNS记录。要设置这些,你可以按照这些说明来添加域名,然后按照这些说明来创建DNS记录。
- 一个A记录有
your_domain指向你的服务器的公共IP地址。 - 一条A记录
www.your_domain指向你的服务器的公共IP地址。
- 一个A记录有
-
按照How To Install Apache on Debian 11安装Apache。请确保你已经为你的域名设置了一个虚拟主机文件。本教程将以
/etc/apache2/sites-available/your_domain.conf作为一个例子。
第一步 - 安装Certbot
使用Let's Encrypt获得SSL证书的第一步是在服务器上安装Certbot软件。
注意:本教程遵循Certbot文档的建议,即在Debian上使用snappy安装该软件,snappy是为Linux系统开发的软件包管理器,以一种被称为snaps的格式安装软件包。你可以使用apt ,从默认的Debian仓库安装Certbot,但这将安装一个比Certbot snap(1.29.0版,截至本文撰写时的最新版本)更老的版本(1.12.0版)。
要在 Debian 上安装 Certbot 作为 snap,你必须首先在你的服务器上安装snapd 。snapd 是一个安装、使用和管理 snap 的守护程序。安装snapd 包也会在你的服务器上安装snap 命令。
要安装snapd ,如果你最近没有这样做,请更新你的本地软件包索引。
sudo apt update
然后安装snapd 包。
sudo apt install snapd
运行这个命令后,会有一个提示,确认你要安装snapd 及其依赖。你可以按Y ,然后按ENTER ,表示同意。
接下来,使用snap 命令来安装core snap。这将在你的服务器上安装一些依赖项,这些依赖项是你所安装的任何快照所需要的,包括Certbot快照。
sudo snap install core
然后刷新core snap。这样做将确保你安装了最新版本的snapd 和它的依赖项。
sudo snap refresh core
请注意,snap可以安装在三个限制级别中的一个,它们提供了与你的系统不同程度的隔离。例如,大多数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需要能够在你的Apache配置中找到正确的虚拟主机,以便它能够自动配置SSL。具体来说,它通过搜索与你申请证书的域名相匹配的ServerName 指令来实现。
如果你按照Apache安装教程中的虚拟主机设置步骤,你应该为你的域名设置一个VirtualHost ,地址为 /etc/apache2/sites-available/your_domain.conf的位置,并且已经适当地设置了ServerName 指令。
要检查,使用nano 或你喜欢的文本编辑器打开你的域名的虚拟主机文件。
sudo nano /etc/apache2/sites-available/your_domain.conf
找到现有的ServerName 行。它应该像下面这样,用你自己的域名代替 your_domain:
/etc/apache2/sites-available/your_domain.conf
...
ServerName your_domain;
...
如果还没有,更新ServerName 指令,使其指向你的域名。然后保存该文件并退出编辑器。如果你使用了nano ,请按CTRL + X 、Y ,然后按ENTER 。
接下来,验证你的配置编辑的语法。
sudo apache2ctl configtest
如果没有任何语法错误,你的输出将返回如下。
Output. . .
Syntax OK
如果你得到一个错误,重新打开虚拟主机文件,检查是否有任何错别字或丢失的字符。一旦你的配置文件的语法正确了,重新加载Apache以加载新的配置。
sudo systemctl reload apache2
Certbot现在可以找到正确的VirtualHost 块并更新它。
接下来,让我们更新防火墙以允许HTTPS流量。
第3步 - 允许HTTPS通过防火墙
如果你启用了ufw 防火墙,正如先决条件指南所建议的,你需要调整设置以允许HTTPS流量。幸运的是,当安装在Debian上时,ufw 附带了一些配置文件,帮助改变HTTP和HTTPS流量的防火墙规则的过程。
你可以通过运行来验证当前的设置。
sudo ufw status
如果你按照我们关于如何在Debian 11上安装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 your_domain -d www.your_domain
这与--apache 插件一起运行certbot ,使用-d 来指定你希望证书有效的名称。
如果这是你第一次运行certbot ,你将被提示输入一个电子邮件地址并同意服务条款。此外,它还会问你是否愿意与电子前线基金会分享你的电子邮件地址,该基金会是一个倡导数字权利的非营利组织,也是Certbot的制造商。请随意输入Y ,以分享你的电子邮件地址,或输入N ,以拒绝。
这样做后,certbot ,将与Let's Encrypt服务器进行通信,然后运行一个挑战,以验证你控制着你所申请的证书的域名。
如果成功的话,配置将被自动更新,Apache将重新加载以接受新的设置。certbot ,最后会有一条消息告诉你这个过程是成功的,以及你的证书存放在哪里。
OutputSuccessfully 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实验室的服务器测试来测试你的服务器,它将获得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有进一步的疑问,他们的文档是一个很好的开始。