如何在Debian 11上使用Let’s Encrypt保护Nginx
介绍
Let’s Encrypt是一个证书颁发机构(CA),提供了一种简便的方式来获得和安装免费的TLS/SSL证书,从而在Web服务器上启用加密的HTTPS。它通过提供一个软件客户端Certbot来简化该过程,试图自动化大部分(如果不是全部)所需的步骤。目前,在Apache和Nginx上获得和安装证书的整个过程都已完全自动化。
在本教程中,你将使用 Certbot 在 Debian 11 上为 Nginx 获取免费的 SSL 证书,并设置证书自动续期。
本教程将使用一个单独的Nginx服务器配置文件而不是默认的文件。我们推荐为每个域名创建新的Nginx服务器块文件,因为这有助于避免常见错误并将默认文件保留为备用配置。
先决条件
要跟随本教程,你需要的是:
- One Debian 11 server set up by following this initial server setup for Debian 11 tutorial, including a sudo-enabled non-root user and a firewall.
- A registered domain name. This tutorial will use example.com throughout. You can purchase a domain name from Namecheap, get one for free with Freenom, or use the domain registrar of your choice.
- Both of the following DNS records set up for your server. If you are using Silicon Cloud, please see our DNS documentation for details on how to add them.An A record with example.com pointing to your server’s public IP address.
An A record with www.example.com pointing to your server’s public IP address. - Nginx installed by following How To Install Nginx on Debian 11. Be sure that you have a server block for your domain. This tutorial will use /etc/nginx/sites-available/example.com as an example.
第一步 – 安装 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行。它应该是这样的:
...
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 流量发送到网络服务器。
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的完整配置文件,同时删除冗余的Nginx HTTP配置文件的允许。
- sudo ufw allow ‘Nginx Full’
- sudo ufw delete allow ‘Nginx HTTP’
你的现状应该是这样的:
- sudo ufw status
Status: active To Action From — —— —- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (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将会以一条信息告知您进程已成功结束,并指出您的证书存储位置。
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 2022-08-08. 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级的评分。
我们最后来测试续订流程吧。
第五步 – 验证Certbot自动更新
让我们加密的证书只有90天的有效期。这是为了鼓励用户自动化证书更新过程。我们安装的certbot软件包会为我们完成这个过程,它会添加一个systemd定时器,每天运行两次,自动更新任何距离到期日期不足30天的证书。
你可以使用systemctl查询计时器的状态。
- sudo systemctl status certbot.timer
● certbot.timer – Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2022-08-08 19:05:35 UTC; 11s ago Trigger: Tue 2022-08-09 07:22:51 UTC; 12h left Triggers: ● certbot.service
为了测试续订过程,你可以使用certbot进行一次模拟运行。
- sudo certbot renew –dry-run
如果您没有发现错误,那就没问题了。当需要时,Certbot将更新您的证书并重新加载Nginx以应用更改。如果自动更新过程失败,Let’s Encrypt会向您指定的电子邮件发送消息,提醒您证书即将过期。
结论 (jié
在这个教程中,您安装了 Let’s Encrypt 的客户端 certbot,并下载了您的域名的 SSL 证书,配置了 Nginx 使用这些证书,并设置了自动证书更新。如果您对使用 Certbot 有进一步的问题,官方文档是一个很好的起点。