如何在Ubuntu18.04上使用Let'sEncrypt保护Nginx

来自菜鸟教程
跳转至:导航、​搜索

介绍

Let's Encrypt 是一个证书颁发机构 (CA),它提供了一种获取和安装免费 TLS/SSL 证书 的方法,从而在 Web 服务器上启用加密的 HTTPS。 它通过提供软件客户端 Certbot 来简化流程,该客户端尝试自动化大部分(如果不是全部)所需步骤。 目前,获取和安装证书的整个过程在 Apache 和 Nginx 上都是完全自动化的。

在本教程中,您将使用 Certbot 在 Ubuntu 18.04 上为 Nginx 获取免费的 SSL 证书,并将您的证书设置为自动更新。

本教程将使用单独的 Nginx 服务器块文件而不是默认文件。 我们建议 为每个域 创建新的 Nginx 服务器块文件,因为它有助于避免常见错误并维护默认文件作为后备配置。

先决条件

要遵循本教程,您将需要:

  • 按照此 Ubuntu 18.04 初始服务器设置教程设置一台 Ubuntu 18.04 服务器,包括 sudo 非 root 用户和防火墙。
  • 完全注册的域名。 本教程将自始至终使用 your_domain。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。
  • 为您的服务器设置了以下两个 DNS 记录。 您可以关注这个DigitalOcean DNS的介绍,详细了解如何添加它们。
    • 带有 your_domain 的 A 记录指向您服务器的公共 IP 地址。
    • 带有 www.your_domain 的 A 记录指向您服务器的公共 IP 地址。
  • 按照 How To Install Nginx on Ubuntu 18.04 安装 Nginx。 确保您的域具有 服务器块 。 同样,本教程将使用 /etc/nginx/sites-available/your_domain 作为示例。

第 1 步 — 安装 Certbot

使用 Let's Encrypt 获取 SSL 证书的第一步是在您的服务器上安装 Certbot 软件。

Certbot 项目建议大多数用户通过 snap 安装软件,这是一个包管理器,最初由 Canonical(Ubuntu 背后的公司)开发,现在可用于许多 Linux 发行版:

sudo snap install --classic certbot

您的输出将显示 Certbot 的当前版本并成功安装:

Output
certbot 1.21.0 from Certbot Project (certbot-eff✓) installed

接下来,从 /usr/bin/ 目录创建指向新安装的 /snap/bin/certbot 可执行文件的符号链接。 这将确保 certbot 命令可以在您的服务器上正确运行。 为此,请运行以下 ln 命令。 这包含 -s 标志,它将创建符号或 链接,而不是 硬链接

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Certbot 现在可以使用了,但是为了让它为 Nginx 配置 SSL,你需要验证 Nginx 的一些配置。

第 2 步 - 确认 Nginx 的配置

Certbot 需要能够在 Nginx 配置中找到正确的 server 块,才能自动配置 SSL。 具体来说,它通过搜索与您为其请求证书的域匹配的 server_name 指令来执行此操作。

如果您按照 Nginx 安装教程 中推荐的 服务器块设置步骤进行操作,您将在 /etc/nginx/sites-available/your_domain 处为您的域提供一个服务器块,其中 server_name 指令已正确设置.

要检查,请使用 nano 或您喜欢的文本编辑器打开您的域的服务器块文件:

sudo nano /etc/nginx/sites-available/your_domain

找到现有的 server_name 行。 它应该如下所示:

/etc/nginx/sites-available/your_domain

...
server_name your_domain www.your_domain;
...

如果是,请退出编辑器并继续下一步。

如果没有,请更新它以匹配。 然后保存文件并退出编辑器。 如果您使用的是 nano,您可以通过按 CTRL + X 然后按 YENTER 来执行此操作。

现在验证配置编辑的语法:

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'

现在,当您运行 ufw status 命令时,它将反映这些新规则:

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 your_domain -d your_domain

这将使用 --nginx 插件运行 certbot,使用 -d 指定您希望证书有效的名称。

如果这是您第一次运行 certbot,系统将提示您输入电子邮件地址并同意服务条款。 完成此操作后,certbot 将与 Let's Encrypt 服务器通信,为您的域请求证书。 如果成功,您将收到以下输出:

Output
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-01-27.
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/nginx/sites-enabled/your_domain
Successfully deployed certificate for www.your_domain to /etc/nginx/sites-enabled/your_domain
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 Server Test 测试您的服务器,它将获得 A 等级。

现在您已经获得了 SSL 证书,最后一步是测试续订过程。

第 5 步 — 验证 Certbot 自动续订

Let's Encrypt 的证书有效期只有九十天。 这是为了鼓励用户自动化他们的证书更新过程。 您安装的 certbot 软件包通过将更新脚本添加到 /etc/cron.d 来解决此问题。 此脚本每天运行两次,并将自动更新到期后三十天内的任何证书。

要测试更新过程,您可以使用 certbot 进行试运行:

sudo certbot renew --dry-run

如果您没有收到错误,则一切就绪。 必要时,Certbot 将更新您的证书并重新加载 Nginx 以获取更改。 如果自动续订过程失败,Let's Encrypt 将向您指定的电子邮件发送一条消息,在您的证书即将到期时警告您。

结论

在本教程中,您安装了 Let's Encrypt 客户端 certbot,为您的域下载 SSL 证书,配置 Nginx 以使用这些证书,并设置自动证书更新。 如果您对使用 Certbot 有其他疑问, 他们的文档 是一个很好的起点。