如何在Debian 11上用Let's Encrypt保护Nginx?

1,386 阅读6分钟

简介

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

在本教程中,你将使用Certbot为Debian 11上的Nginx获得一个免费的SSL证书,并设置证书的自动更新。

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

前提条件

要学习本教程,你将需要。

  • 一台按照本教程初步设置的Debian 11服务器,包括一个支持sudo的非root用户和一个防火墙。

  • 一个注册的域名。本教程将全程使用example.com 。你可以从Namecheap购买一个域名,通过Freenom免费获得一个,或者使用你选择的域名注册商。

  • 为你的服务器设置好以下两个DNS记录。

    • 一个A记录 example.com指向你的服务器的公共IP地址。
    • 一条A记录 www.example.com指向你的服务器的公共IP地址。
  • 按照How To Install Nginx on Debian 11安装Nginx。请确保你的域名有一个服务器块。本教程将以 /etc/nginx/sites-available/example.com作为例子。

第1步 - 安装Certbot

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

apt 安装Certbot和它的Nginx插件。

sudo apt install certbot python3-certbot-nginx

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

第2步 - 确认Nginx的配置

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

如果你按照Nginx安装教程中的服务器块设置步骤,你应该为你的域名建立一个服务器块,地址是 /etc/nginx/sites-available/example.com``server_name ,并且已经适当地设置了指令。

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

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

找到现有的server_name 行。它应该看起来像这样。

/etc/nginx/sites-available/example.com

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

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

如果没有,就更新它以符合要求。然后保存文件,退出你的编辑器,并验证你的配置编辑的语法。

sudo nginx -t

如果你得到一个错误,重新打开服务器块文件,检查是否有错别字或丢失的字符。一旦你的配置文件的语法正确,重新加载Nginx以加载新的配置。

sudo systemctl reload nginx

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

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

第3步 - 允许HTTPS通过防火墙

如果你启用了ufw 防火墙,正如先决条件指南所建议的那样,你需要调整设置以允许HTTPS流量。幸运的是,Nginx在安装时向ufw 注册了一些配置文件。

你可以通过输入来查看当前的设置。

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完整配置文件,删除多余的Nginx HTTP配置文件。

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

现在你的状态应该是这样的。

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并在必要时重新加载配置。要使用这个插件,请输入以下内容。

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

这与--nginx 插件一起运行certbot ,使用-d 来指定我们希望证书有效的域名。

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

配置将被更新,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 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实验室的服务器测试来测试你的服务器,它将获得A级。

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

第5步--验证Certbot自动续费

Let's Encrypt的证书有效期只有九十天。这是为了鼓励用户自动完成证书更新过程。我们安装的certbot 软件包为我们解决了这个问题,它添加了一个 systemd 定时器,每天运行两次,自动更新任何即将过期的证书。

你可以通过systemctl 查询定时器的状态。

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 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会向你指定的邮箱发送一条信息,警告你证书即将过期。

总结

在本教程中,你安装了Let's Encrypt客户端certbot ,为你的域名下载了SSL证书,配置了Nginx来使用这些证书,并设置了自动更新证书。