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插件。
- 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或您最喜欢的文本编辑器打开您的域名配置文件。
- sudo nano /etc/nginx/sites-available/example.com
寻找现有的server_name行。它应该是这样的:
example.com的配置文件位于/etc/nginx/sites-available目录下。
...server_name example.com www.example.com;...
如果是这种情况,就退出编辑器,继续下一步操作。
如果它没有匹配,请更新以使其匹配。然后保存文件,退出编辑器,并验证您的配置编辑的语法。
- sudo nginx -t
如果你遇到错误,重新打开服务器配置文件并检查是否有任何拼写错误或遗漏的字符。一旦你的配置文件语法正确,重新加载Nginx以加载新的配置。
- sudo systemctl reload nginx
Certbot现在可以自动找到正确的服务器块并更新它。
接下来,我们来更新防火墙,允许HTTPS流量通过。
第三步——允许防火墙通过HTTPS
如果您已经启用了ufw防火墙,正如先决指南所推荐的,您需要调整设置以允许HTTPS流量。幸运的是,Nginx在安装时会向ufw注册几个配置文件。
通过输入以下命令可以看到当前设置。
- sudo ufw status
可能会看起来像这样,意味着仅允许将HTTP流量发送到网络服务器。
状态:活动
到 动作 来自
-- ------ ----
OpenSSH 允许 任何地方
Nginx HTTP 允许 任何地方
OpenSSH (v6) 允许 任何地方 (v6)
Nginx HTTP (v6) 允许 任何地方 (v6)
为了进一步允许HTTPS流量通过,允许Nginx的完整配置文件,同时删除冗余的Nginx HTTP配置文件的允许。
- sudo ufw allow ‘Nginx Full’
- sudo ufw delete allow ‘Nginx HTTP’
你的现状应该是这样的:
- sudo ufw status
状态:活动 目标 动作 来源 -- ------ ---- OpenSSH 允许 任何地方 Nginx Full 允许 任何地方 OpenSSH (v6) 允许 任何地方 (v6) Nginx Full (v6) 允许 任何地方 (v6)
接下来,让我们运行 Certbot 并获取我们的证书。
第四步 — 获得一个SSL证书
Certbot 提供了多种通过插件获取 SSL 证书的方式。Nginx 插件会在必要时负责重新配置 Nginx 并重新加载配置文件。要使用该插件,请输入以下内容:
- 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 查询计时器的状态。
- 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 进行一次模拟运行。
- sudo certbot renew --dry-run
如果您没有发现错误,那就没问题了。当需要时,Certbot 将更新您的证书并重新加载 Nginx 以应用更改。如果自动更新过程失败,Let’s Encrypt 会向您指定的电子邮件发送消息,提醒您证书即将过期。
结论
在这个教程中,您安装了 Let’s Encrypt 的客户端 certbot,并下载了您的域名的 SSL 证书,配置了 Nginx 使用这些证书,并设置了自动证书更新。如果您对使用 Certbot 有进一步的问题,官方文档是一个很好的起点。