如何在Ubuntu 20.04上使用Let’s Encrypt保护Nginx

介绍

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

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

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

让 DigitalOcean 来管理 Nginx 和 Let’s Encrypt。DigitalOcean 应用平台将允许您在几分钟内直接从 GitHub 部署。应用平台还将为您处理 SSL 证书和路由。

先决条件

要按照本教程进行操作,您需要:

  • 一个已通过本教程 Ubuntu 20.04 初始服务器设置 设置的 Ubuntu 20.04 服务器,包括一个启用 sudo 的非root用户和防火墙。

  • 一个已注册的域名。本教程将始终使用 example.com。您可以从 Namecheap 购买域名,在 Freenom 免费获取一个,或者使用您选择的域名注册商。

  • 为您的服务器设置以下两个 DNS 记录。如果您使用 DigitalOcean,请参阅我们的 DNS 文档 了解如何添加它们。

    • 一个 A 记录,指向您服务器的公共 IP 地址,域名为 example.com
    • 一个 A 记录,指向您服务器的公共 IP 地址,域名为 www.example.com
  • 按照如何在Ubuntu 20.04上安装Nginx安装了Nginx。确保您为您的域名设置了服务器块。本教程将以/etc/nginx/sites-available/example.com作为示例。

步骤1 —— 安装Certbot

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

使用apt安装Certbot及其Nginx插件:

  1. sudo apt install certbot python3-certbot-nginx

现在Certbot已准备就绪,但为了让它能够自动为Nginx配置SSL,我们需要验证一些Nginx的配置。

第二步 —— 确认Nginx的配置

Certbot需要能够在您的Nginx配置中找到正确的server块,以便能够自动配置SSL。具体来说,它通过查找与您请求证书的域匹配的server_name指令来实现这一点。

如果您遵循了Nginx安装教程中的服务器块设置步骤,您应该已经在/etc/nginx/sites-available/example.com处为您的域设置了一个服务器块,并且server_name指令已经适当设置。

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

  1. sudo nano /etc/nginx/sites-available/example.com

找到现有的server_name行。它应该是这样的:

/etc/nginx/sites-available/example.com
...
server_name example.com www.example.com;
...

如果是这样的,请退出编辑器,然后继续下一步。

如果没有,请更新以匹配。然后保存文件,退出编辑器,并验证配置编辑的语法:

  1. sudo nginx -t

如果出现错误,请重新打开服务器块文件,并检查是否有任何拼写错误或缺少字符。一旦您的配置文件语法正确,重新加载 Nginx 以加载新的配置:

  1. sudo systemctl reload nginx

现在,Certbot 可以自动找到正确的server块并更新它。

接下来,让我们更新防火墙以允许 HTTPS 流量。

步骤 3 —— 允许 HTTPS 通过防火墙

如果您已经启用了 ufw 防火墙,如先决指南中推荐的那样,您需要调整设置以允许 HTTPS 流量。幸运的是,Nginx 在安装时会注册一些 ufw 配置文件。

您可以通过键入以下内容查看当前设置:

  1. sudo ufw status

它可能看起来像这样,意味着只允许 HTTP 流量访问 Web 服务器:

Output
Status: 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 配置文件允许:

  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'

您的状态现在应该是这样的:

  1. sudo ufw status
Output
Status: 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 并重新加载配置。要使用此插件,请输入以下命令:

  1. sudo certbot --nginx -d example.com -d www.example.com

这将使用 --nginx 插件运行 certbot,使用 -d 指定要为其生成有效证书的域名。

如果这是您第一次运行 certbot,系统将提示您输入电子邮件地址并同意服务条款。完成后,certbot 将与 Let’s Encrypt 服务器通信,然后运行一个挑战来验证您控制您要请求证书的域。

如果成功,certbot 将询问您如何配置 HTTPS 设置。

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

选择您的选项,然后按 ENTER 键。配置将被更新,Nginx 将重新加载以应用新的设置。 certbot 将以成功消息结束,并告知您证书存储的位置:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - 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 等级。

最后,我们来测试更新过程。

第5步 — 验证 Certbot 自动更新

Let’s Encrypt 的证书只有效期90天。这是为了鼓励用户自动化证书更新过程。我们安装的 certbot 软件包通过添加一个 systemd 计时器来为我们处理这个问题,该计时器每天运行两次,并自动更新任何在到期前三十天内的证书。

您可以使用 systemctl 查询计时器的状态:

  1. sudo systemctl status certbot.timer
Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

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

  1. sudo certbot renew --dry-run

如果没有错误显示,那么一切都已设置完成。在必要时,Certbot 将更新您的证书并重新加载 Nginx 以应用更改。如果自动更新过程失败,Let’s Encrypt 将向您指定的电子邮件发送消息,警告您的证书即将到期。

结论

在本教程中,您安装了Let’s Encrypt客户端certbot,为您的域名下载了SSL证书,配置了Nginx以使用这些证书,并设置了自动证书续订。如果您对使用Certbot有进一步的问题,官方文档是一个很好的起点。

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04