Debian 11系统下Nginx配置Let’s Encrypt SSL证书完整教程

介绍

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

在本教程中,你将使用Certbot在Debian 11上为Nginx获取免费的SSL证书,并设置证书自动续期。

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

先决条件

要跟随本教程,你需要的是:

  • 一台按照Debian 11初始服务器设置教程配置的Debian 11服务器,包括一个启用了sudo权限的非root用户和防火墙。
  • 一个已注册的域名。本教程将全程使用example.com作为示例。你可以从Namecheap购买域名,从Freenom免费获取一个,或使用你选择的域名注册商。
  • 为你的服务器设置了以下两条DNS记录。如果你使用的是硅云,请参阅我们的DNS文档了解如何添加它们的详细信息。
    一条将example.com指向你的服务器公网IP地址的A记录。
    一条将www.example.com指向你的服务器公网IP地址的A记录。
  • 已按照《如何在Debian 11上安装Nginx》教程安装了Nginx。确保你拥有一个针对你的域名的服务器块。本教程将使用/etc/nginx/sites-available/example.com作为示例。

第一步 – 安装Certbot

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

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

  1. sudo apt install certbot python3-certbot-nginx

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

第二步 — 确认Nginx的配置

为了能够自动配置SSL,Certbot需要能够在您的Nginx配置中找到正确的服务器块。具体来说,它通过查找与您请求证书的域名匹配的server_name指令来实现此功能。

如果你按照Nginx安装教程中的服务块设置步骤进行操作,那么你应该在/etc/nginx/sites-available/example.com目录下拥有一个针对你的域名的服务块,并且server_name指令已经适当地设置好了。

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

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

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

example.com的配置文件位于/etc/nginx/sites-available目录下。

...server_name example.com www.example.com;...

如果是这种情况,就退出编辑器,继续下一步操作。

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

  1. sudo nginx -t

如果你遇到错误,重新打开服务器配置文件并检查是否有任何拼写错误或遗漏的字符。一旦你的配置文件语法正确,重新加载Nginx以加载新的配置。

  1. sudo systemctl reload nginx

Certbot现在可以自动找到正确的服务器块并更新它。

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

第三步——允许防火墙通过HTTPS

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

通过输入以下命令可以看到当前设置。

  1. sudo ufw status

可能会看起来像这样,意味着仅允许将HTTP流量发送到网络服务器。

输出

状态:活动
到 动作 来自
-- ------ ----
OpenSSH 允许 任何地方
Nginx HTTP 允许 任何地方
OpenSSH (v6) 允许 任何地方 (v6)
Nginx HTTP (v6) 允许 任何地方 (v6)

为了进一步允许HTTPS流量通过,允许Nginx的完整配置文件,同时删除冗余的Nginx HTTP配置文件的允许。

  1. sudo ufw allow ‘Nginx Full’
  2. sudo ufw delete allow ‘Nginx HTTP’

你的现状应该是这样的:

  1. sudo ufw status
输出
状态:活动 目标 动作 来源 -- ------ ---- OpenSSH 允许 任何地方 Nginx Full 允许 任何地方 OpenSSH (v6) 允许 任何地方 (v6) Nginx Full (v6) 允许 任何地方 (v6)

接下来,让我们运行 Certbot 并获取我们的证书。

第四步 — 获得一个SSL证书

Certbot 提供了多种通过插件获取 SSL 证书的方式。Nginx 插件会在必要时负责重新配置 Nginx 并重新加载配置文件。要使用该插件,请输入以下内容:

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

这个命令在使用 –nginx 插件的情况下运行 certbot,并且使用 -d 参数指定我们想要证书验证的域名。

如果这是您第一次运行 certbot,您将被提示输入电子邮件地址并同意服务条款。在这样做之后,certbot 将与 Let’s Encrypt 服务器通信,然后运行一个验证挑战以验证您控制所请求证书的域名。

配置将会更新,Nginx 将重新加载以应用新的设置。certbot 将会以一条信息告知您进程已成功结束,并指出您的证书存储位置。

输出
重要提示:- 恭喜!您的证书和链已保存在:/etc/letsencrypt/live/example.com/fullchain.pem 您的密钥文件已保存在:/etc/letsencrypt/live/example.com/privkey.pem 您的证书将于 2022-08-08 到期。要在将来获取新或修改版本的证书,只需再次使用 "certonly" 选项运行 certbot。要非交互式更新*所有*证书,请运行 "certbot renew" - 如果您喜欢 Certbot,请考虑通过以下方式支持我们的工作:向 ISRG / Let's Encrypt 捐款:https://letsencrypt.org/donate 向 EFF 捐款:https://eff.org/donate-le

您的证书已经下载、安装并加载完毕。尝试使用 https:// 重新加载您的网站,并留意您浏览器上的安全指示器。通常情况下,它应该显示网站已正确地进行了安全保护,可能会出现一个锁形图标。如果您使用 SSL Labs 服务器测试来测试您的服务器,它应该能够获得 A 级的评分。

我们最后来测试续订流程吧。

第五步 – 验证 Certbot 自动更新

Let’s Encrypt 的证书只有 90 天的有效期。这是为了鼓励用户自动化证书更新过程。我们安装的 certbot 软件包会为我们完成这个过程,它会添加一个 systemd 定时器,每天运行两次,自动更新任何距离到期日期不足 30 天的证书。

你可以使用 systemctl 查询计时器的状态。

  1. sudo systemctl status certbot.timer
输出
● certbot.timer - 每天运行 certbot 两次 已加载:已加载 (/lib/systemd/system/certbot.timer; 已启用; 厂商预设:已启用) 活动:活动(等待) since Mon 2022-08-08 19:05:35 UTC; 11s ago 触发器:Tue 2022-08-09 07:22:51 UTC; 12h left 触发:● certbot.service

为了测试续订过程,你可以使用 certbot 进行一次模拟运行。

  1. sudo certbot renew --dry-run

如果您没有发现错误,那就没问题了。当需要时,Certbot 将更新您的证书并重新加载 Nginx 以应用更改。如果自动更新过程失败,Let’s Encrypt 会向您指定的电子邮件发送消息,提醒您证书即将过期。

结论

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

bannerAds