如何在Rocky Linux 9上使用Let’s Encrypt保护Nginx
介绍
让我们来谈谈”Let’s Encrypt”这个机构,它是一个证书授权机构(CA),提供了一种便捷的方式来获取和安装免费的TLS / SSL证书,从而在Web服务器上启用加密的HTTPS。它通过提供软件客户端“Certbot”来简化此过程,Certbot试图自动化需要的大部分(如果不是全部)步骤。目前,无论是在Apache还是Nginx上,获取和安装证书的整个过程都是完全自动化的。
在本教程中,您将使用Certbot为Rocky Linux 9上的Nginx获取免费的SSL证书,并设置证书自动更新。
这个教程将使用一个单独的Nginx服务器配置文件,而不是默认的文件。对于每个域名,你应该创建新的Nginx服务器块文件,因为它有助于避免常见的错误,并将默认文件保留为备用配置。
先决条件
为了跟随这个教程,你将需要以下物品:
- One Rocky Linux 9 server set up by following this initial server setup for Rocky Linux 9 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 Rocky Linux 9. 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
首先,您需要安装Certbot软件包。以非root用户的身份登录您的Rocky Linux 8主机:
- ssh sammy@your_server_ip
默认情况下,软件包管理器中无法找到Certbot软件包。您需要启用EPEL软件源才能安装Certbot。
要添加Rocky Linux 9的EPEL软件仓库,请运行以下命令:
- sudo dnf install epel-release
当被要求确认安装时,请输入并确定 y。
现在你有权限访问额外的软件库,安装所有所需的软件包。
- sudo dnf install certbot python3-certbot-nginx
这将安装Certbot本身,并且还会安装Certbot所需的Nginx插件,这个插件是运行该程序所必需的。
安装过程会询问您是否要导入 GPG 密钥。请确认导入以便完成安装。
既然你已经安装了Certbot,让我们运行它来获取证书吧。
第二步-确认Nginx的配置
为了能够自动配置SSL,Certbot需要在你的Nginx配置中找到正确的服务器块。具体而言,它通过寻找与你请求证书的域名相匹配的server_name指令来实现此功能。
如果你按照Nginx安装教程中的服务器块设置步骤操作,那么你应该在/etc/nginx/conf.d/example.com路径下拥有一个针对你的域名的服务器块,并且其中的server_name指令已经适当地设置好了。
要进行检查,请使用nano或您喜爱的文本编辑器打开您的域的配置文件。
- sudo nano /etc/nginx/conf.d/example.com
找到现有的server_name行。它应该是这样的:
...
server_name example.com www.example.com;
...
如果是这样,请退出编辑器,继续进行下一步。
如果它没有更新,请更新它以匹配。然后保存文件,退出编辑器,并验证配置编辑的语法。
- sudo nginx -t
如果出现错误,请重新打开服务器块文件,检查是否有任何拼写错误或缺少字符。一旦您的配置文件的语法正确,重新加载 Nginx以加载新的配置。
- sudo systemctl reload nginx
Certbot现在可以自动找到正确的服务器块并进行更新。
接下来,让我们更新防火墙以允许HTTPS流量。
第三步 — 更新防火墙规则
由于您的前提设置启用了firewalld,您需要调整防火墙设置以允许Nginx Web服务器上的外部连接。
运行以下命令来检查已启用的服务:
- sudo firewall-cmd –permanent –list-all
你将会收到类似这样的输出:
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
如果在服务列表中看不到http,请通过运行以下命令来启用它:
- sudo firewall-cmd –permanent –add-service=http
要允许HTTPS流量,请运行以下命令:
- sudo firewall-cmd –permanent –add-service=https
为了应用更改,您需要重新加载防火墙服务。
- sudo firewall-cmd –reload
既然你已经将服务器开放给https流量,那么现在你可以运行Certbot并获取证书了。
第四步 – 获取SSL证书
Certbot提供了多种通过插件获取SSL证书的方式。 Nginx插件将负责在必要时重新配置Nginx并重新加载配置。要使用此插件,请键入以下内容:
- sudo certbot –nginx -d example.com -d www.example.com
使用 –nginx 插件运行 certbot,并使用 -d 来指定需要证书有效的域名。
运行该命令时,系统会提示您输入电子邮件地址并同意使用条款。完成后,您应该会看到一条消息告诉您操作成功,并告知您的证书存储位置。
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain …
你的证书已经被下载、安装和加载完毕,你的Nginx配置现在将自动重定向所有的网页请求到https://。请重新载入你的网站并注意浏览器的安全指示器。通常情况下,它应该显示网站已经得到了适当的安全保护,通常以一个锁形状的图标表示。如果你使用SSL Labs服务器测试来测试你的服务器,它将会得到A级评分。
我们来测试续约流程,然后就结束吧。
第五步——验证Certbot自动更新
Let’s Encrypt证书的有效期为90天,但建议您每60天续订一次证书,以便留出错误的余地。Certbot Let’s Encrypt客户端具有一个续订命令,它会自动检查当前已安装的证书,并在离到期日不到30天时尝试续订。
您可以通过运行此命令来测试证书的自动更新功能。
- sudo certbot renew –dry-run
输出结果将会与此类似。
Saving debug log to /var/log/letsencrypt/letsencrypt.log – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – Processing /etc/letsencrypt/renewal/your_domain.conf – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification… Cleaning up challenges – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – ** DRY RUN: simulating ‘certbot renew’ close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) …
请注意,如果您创建了一个包含多个域名的捆绑证书,输出结果中只会显示基础域名,但续订将适用于该证书中包含的所有域名。
确保证书不会过时的实际方法是创建一个定时任务,定期执行自动更新命令。由于更新首先检查到期日期,并且只有在证书到期前不到30天时才执行更新,因此可以安全地创建每周甚至每天运行的定时任务。
编辑crontab以创建每天运行两次续约的新任务。要编辑根用户的crontab,请运行:
- sudo crontab -e
您的文本编辑器将打开默认的crontab,这是一个此时为空的文本文件。按下“i”键进入插入模式,在下面添加以下行:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
完成后,按ESC键退出插入模式,然后输入:wq并按ENTER键保存并退出文件。要了解更多关于文本编辑器Vi及其继任者Vim的信息,请查看我们的在云服务器上安装和使用Vim文本编辑器教程。
这将创建一个新的定时任务,在每天中午和午夜执行。python -c ‘import random; import time; time.sleep(random.random() * 3600)’ 将在每个小时内选择一个随机分钟来执行您的续订任务。
Certbot 的更新命令会检查系统中安装的所有证书,并更新那些距离到期不到三十天的证书。使用 –quiet 参数告诉 Certbot 不要输出信息或等待用户输入。
关于更新的更详细信息可在Certbot文档中找到。
结论
在本指南中,您安装了Let’s Encrypt客户端Certbot,并为您的域名下载了SSL证书,并设置了自动证书更新。如果您对Certbot的使用有任何疑问,您可以查看官方的Certbot文档。
您还可以时不时查看官方的Let’s Encrypt博客,以获取重要的更新信息。