Rocky Linux 9系统下Nginx配置Let’s Encrypt免费SSL证书完整教程
Let’s Encrypt与Certbot简介
Let’s Encrypt是一个免费的证书授权机构(CA),它提供了一种便捷的方式来获取和安装TLS/SSL证书,从而在Web服务器上启用加密的HTTPS连接。Let’s Encrypt通过提供名为”Certbot”的软件客户端来简化整个过程,Certbot能够自动化大部分(如果不是全部)必要步骤。目前,无论是在Apache还是Nginx服务器上,获取和安装证书的整个过程都已实现完全自动化。
在本教程中,您将学习如何使用Certbot为Rocky Linux 9上的Nginx获取免费的SSL证书,并设置证书自动续期功能。
本教程将使用单独的Nginx服务器配置文件,而非默认配置文件。为每个域名创建独立的Nginx服务器块文件是一种最佳实践,这有助于避免常见错误,同时保留默认文件作为备用配置。
准备工作
在开始本教程之前,请确保您已满足以下先决条件:
- 一台按照Rocky Linux 9初始服务器设置教程配置的Rocky Linux 9服务器,包括一个具有sudo权限的非root用户和已配置的防火墙。
- 一个已注册的域名。本教程将全程使用example.com作为示例。您可以从Namecheap购买域名,在Freenom获取免费域名,或使用您选择的任何域名注册商。
- 为您的服务器设置了以下DNS记录。如果您使用的是Silicon Cloud,请参阅我们的DNS文档了解如何添加这些记录的详细信息:
- 一条将example.com指向您服务器公网IP地址的A记录。
- 一条将www.example.com指向您服务器公网IP地址的A记录。
- 已按照如何在Rocky Linux 9上安装Nginx教程安装了Nginx。确保您已为您的域名创建了服务器块。本教程将使用/etc/nginx/sites-available/example.com作为示例路径。
第一步 — 安装Certbot
首先,您需要安装Certbot软件包。以非root用户的身份登录您的Rocky Linux 9服务器:
ssh sammy@your_server_ip
默认情况下,Certbot软件包在软件包管理器中不可用。您需要启用EPEL(Extra Packages for Enterprise Linux)软件源才能安装Certbot。
要添加Rocky Linux 9的EPEL软件仓库,请运行以下命令:
sudo dnf install epel-release
当系统要求确认安装时,请输入”y”并确认。
现在您可以访问额外的软件库,接下来安装所有必需的软件包:
sudo dnf install certbot python3-certbot-nginx
这将安装Certbot本身以及Certbot所需的Nginx插件,该插件是运行程序所必需的。
安装过程可能会询问您是否要导入GPG密钥。请确认导入以完成安装。
现在您已经成功安装了Certbot,接下来让我们运行它来获取SSL证书。
第二步 — 确认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:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
这是文章《如何在Rocky Linux 9上使用Let’s Encrypt保护Nginx》的第2部分(共3部分)。
内容片段:
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 来指定需要证书有效的域名。
运行该命令时,系统会提示您输入电子邮件地址并同意使用条款。完成后,您应该会看到一条消息告诉您操作成功,并告知您的证书存储位置。
成功接收证书。证书保存在:/etc/letsencrypt/live/your_domain/fullchain.pem 密钥保存在:/etc/letsencrypt/live/your_domain/privkey.pem 此证书将于2022-12-15过期。证书续订时这些文件将会更新。Certbot已经设置了一个计划任务,在后台自动续订此证书。正在部署证书 已成功为your_domain部署证书到/etc/nginx/conf.d/your_domain.conf 已成功为www.your_domain部署证书到/etc/nginx/conf.d/your_domain.conf 恭喜!您已成功在https://your_domain和https://www.your_domain上启用HTTPS…
你的证书已经被下载、安装和加载完毕,你的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博客,以获取重要的更新信息。