如何在Ubuntu22.04上使用Let'sEncrypt保护Nginx
介绍
Let's Encrypt 是一个证书颁发机构 (CA),它提供了一种可访问的方式来获取和安装免费的 TLS/SSL 证书,从而在 Web 服务器上启用加密的 HTTPS。 它通过提供软件客户端 Certbot 来简化流程,该客户端尝试自动化大部分(如果不是全部)所需步骤。 目前,获取和安装证书的整个过程在 Apache 和 Nginx 上都是完全自动化的。
在本教程中,您将使用 Certbot 在 Ubuntu 22.04 上为 Nginx 获取免费的 SSL 证书,并将您的证书设置为自动更新。
本教程将使用单独的 Nginx 服务器配置文件而不是默认文件。 我们建议为每个域创建新的 Nginx 服务器块文件,因为它有助于避免常见错误并维护默认文件作为后备配置。
先决条件
要遵循本教程,您将需要:
- 按照此 Ubuntu 22.04 初始服务器设置教程设置一台 Ubuntu 22.04 服务器,包括启用 sudo 的非 root 用户和防火墙。
- 一个注册的域名。 本教程将自始至终使用
example.com
。 您可以从 Namecheap 购买一个域名,通过 Freenom 免费获得一个,或者使用您选择的域名注册商。 - 为您的服务器设置了以下两个 DNS 记录。 如果您使用的是 DigitalOcean,请参阅我们的 DNS 文档 了解如何添加它们的详细信息。
- 带有
example.com
的 A 记录指向您服务器的公共 IP 地址。 - 带有
www.example.com
的 A 记录指向您服务器的公共 IP 地址。
- 带有
- 按照 How To Install Nginx on Ubuntu 22.04 安装 Nginx。 确保您的域具有 服务器块 。 本教程将以
/etc/nginx/sites-available/example.com
为例。
第 1 步 — 安装 Certbot
Certbot 建议使用他们的 snap 包进行安装。 Snap 包几乎适用于所有 Linux 发行版,但它们要求您先安装 snapd 才能管理 snap 包。 Ubuntu 22.04 支持开箱即用的 snap,因此您可以首先确保 snapd 核心是最新的:
sudo snap install core; sudo snap refresh core
如果您在以前安装了旧版本 certbot 的服务器上工作,则应在继续之前将其删除:
sudo apt remove certbot
之后,您可以安装 certbot
包:
sudo snap install --classic certbot
最后,您可以将 snap install 目录中的 certbot
命令链接到您的路径,因此您只需键入 certbot
即可运行它。 并非所有软件包都需要这样做,但默认情况下,快照的侵入性往往较小,因此它们不会意外与任何其他系统软件包发生冲突:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
现在我们已经安装了 Certbot,让我们运行它来获取我们的证书。
第 2 步 - 确认 Nginx 的配置
Certbot 需要能够在 Nginx 配置中找到正确的 server
块,才能自动配置 SSL。 具体来说,它通过查找与您为其请求证书的域匹配的 server_name
指令来做到这一点。
如果您按照 Nginx 安装教程 中的 服务器块设置步骤进行操作,您应该在 /etc/nginx/sites-available/example.com
处为您的域设置一个服务器块,并且已经正确设置了 server_name
指令。
要检查,请使用 nano
或您喜欢的文本编辑器打开您的域的配置文件:
sudo nano /etc/nginx/sites-available/example.com
找到现有的 server_name
行。 它应该如下所示:
/etc/nginx/sites-available/example.com
... server_name example.com www.example.com; ...
如果是,请退出编辑器并继续下一步。
如果没有,请更新它以匹配。 然后保存文件,退出编辑器,并验证配置编辑的语法:
sudo nginx -t
如果出现错误,请重新打开服务器块文件并检查是否有任何拼写错误或缺少字符。 配置文件语法正确后,重新加载 Nginx 以加载新配置:
sudo systemctl reload nginx
Certbot 现在可以找到正确的 server
块并自动更新它。
接下来,让我们更新防火墙以允许 HTTPS 流量。
第 3 步 — 允许 HTTPS 通过防火墙
如果按照先决条件指南的建议启用了 ufw
防火墙,则需要调整设置以允许 HTTPS 流量。 幸运的是,Nginx 在安装时使用 ufw
注册了一些配置文件。
您可以通过键入以下内容查看当前设置:
sudo ufw status
它可能看起来像这样,这意味着只允许 HTTP 流量进入 Web 服务器:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
要额外允许 HTTPS 流量,请允许 Nginx Full 配置文件并删除多余的 Nginx HTTP 配置文件允许:
sudo ufw allow 'Nginx Full' sudo ufw delete allow 'Nginx HTTP'
您的状态现在应该如下所示:
sudo ufw status
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
接下来,让我们运行 Certbot 并获取我们的证书。
第 4 步 — 获取 SSL 证书
Certbot 提供了多种通过插件获取 SSL 证书的方式。 Nginx 插件将负责重新配置 Nginx 并在必要时重新加载配置。 要使用此插件,请键入以下内容:
sudo certbot --nginx -d example.com -d www.example.com
这将使用 --nginx
插件运行 certbot
,使用 -d
指定我们希望证书有效的域名。
运行命令时,系统会提示您输入电子邮件地址并同意服务条款。 完成此操作后,您应该会看到一条消息,告诉您该过程已成功以及您的证书存储在哪里:
OutputIMPORTANT NOTES: 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-06-01. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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
您的证书已下载、安装和加载,您的 Nginx 配置现在将自动将所有 Web 请求重定向到 https://
。 尝试重新加载您的网站并注意浏览器的安全指示器。 它应该表明该站点得到了适当的保护,通常带有一个锁定图标。 如果您使用 SSL Labs Server Test 测试您的服务器,它将获得 A 等级。
让我们通过测试更新过程来结束。
第 5 步 — 验证 Certbot 自动续订
Let's Encrypt 的证书有效期只有九十天。 这是为了鼓励用户自动化他们的证书更新过程。 我们安装的 certbot
软件包为我们解决了这个问题,它添加了一个每天运行两次的 systemd 计时器,并自动更新到期后 30 天内的任何证书。
您可以通过systemctl
查询定时器的状态:
sudo systemctl status snap.certbot.renew.service
Output○ snap.certbot.renew.service - Service for snap application certbot.renew Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static) Active: inactive (dead) TriggeredBy: ● snap.certbot.renew.timer
要测试更新过程,您可以使用 certbot
进行试运行:
sudo certbot renew --dry-run
如果您没有看到任何错误,则说明一切就绪。 必要时,Certbot 将更新您的证书并重新加载 Nginx 以获取更改。 如果自动续订过程失败,Let's Encrypt 将向您指定的电子邮件发送一条消息,在您的证书即将到期时警告您。
结论
在本教程中,您安装了 Let's Encrypt 客户端 certbot
,为您的域下载 SSL 证书,配置 Nginx 以使用这些证书,并设置自动证书更新。 如果您对使用 Certbot 有其他疑问, 官方文档 是一个很好的起点。