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,请通过运行以下命令来启用它:

  1. sudo firewall-cmd –permanent –add-service=http

 

要允许HTTPS流量,请运行以下命令:

  1. sudo firewall-cmd –permanent –add-service=https

 

为了应用更改,您需要重新加载防火墙服务。

  1. sudo firewall-cmd –reload

 

既然你已经将服务器开放给https流量,那么现在你可以运行Certbot并获取证书了。

第四步 – 获取SSL证书

Certbot提供了多种通过插件获取SSL证书的方式。Nginx插件将负责在必要时重新配置Nginx并重新加载配置。要使用此插件,请键入以下内容:

  1. 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天时尝试续订。

您可以通过运行此命令来测试证书的自动更新功能。

  1. 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,请运行:

  1. 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博客,以获取重要的更新信息。

bannerAds