如何在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 有其他疑问, 官方文档 是一个很好的起点。