如何在 CentOS 8 上使用 Let’s Encrypt 保护 Nginx

作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

Let’s Encrypt是一个证书颁发机构 (CA),为传输层安全 (TLS) 加密提供免费证书它通过提供软件客户端Certbot简化了证书的创建、验证、签名、安装和更新过程

在本教程中,您将在运行Nginx作为 Web 服务器的 CentOS 8 服务器上设置来自Let’s Encrypt的 TLS/SSL 证书此外,您将使用cron作业自动执行证书续订过程

先决条件

为了完成本指南,您需要:

  • 按照CentOS 8 初始服务器设置指南设置一台 CentOS 8 服务器,包括具有sudo特权的非 root 用户和防火墙。
  • Nginx 安装在 CentOS 8 服务器上,并配置了服务器块。您可以按照我们的教程如何在 CentOS 8 上安装 Nginx来了解如何进行设置
  • 完全注册的域名。本教程将your_domain始终用作示例。你可以购买一个域名Namecheap,免费获得一个在Freenom,或使用你选择的域名注册商。
  • 为您的服务器设置的以下两个 DNS 记录。您可以按照DigitalOcean DNS的介绍了解有关如何添加它们的详细信息。

    • your_domain指向您服务器的公共 IP 地址的 A 记录
    • 指向您服务器的公共 IP 地址的 A 记录www.your_domain

步骤 1 — 安装 Certbot Let’s Encrypt 客户端

首先,您需要安装certbot软件包。以非 root 用户身份登录 CentOS 8 机器:

  • ssh sammy@your_server_ip

certbot包是不是可以通过默认的包管理器。您需要启用EPEL存储库才能安装 Certbot。

要添加 CentOS 8 EPEL 存储库,请运行以下命令:

  • sudo dnf install epel-release

当要求确认安装时,键入并输入y

现在您可以访问额外的存储库,安装所有必需的包:

  • sudo dnf install certbot python3-certbot-nginx

这将安装 Certbot 本身和 Certbot 的 Nginx 插件,这是运行程序所需的。

安装过程会询问您是否导入 GPG 密钥。确认它以便安装可以完成。

您现在已经安装了 Let’s Encrypt 客户端,但在获取证书之前,您需要确保所有必需的端口都已打开。为此,您将在下一步中更新防火墙设置。

步骤 2 — 更新防火墙规则

由于您的先决条件设置启用了firewalld,您将需要调整防火墙设置以允许您的 Nginx Web 服务器上的外部连接。

要检查哪些服务已启用,请运行以下命令:

  • sudo firewall-cmd --permanent --list-all

您将收到如下输出:

Output
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 并获取您的证书。

第 3 步 – 获得证书

现在您可以为您的域申请 SSL 证书。

使用certbotLet’s Encrypt 客户端为 Nginx 生成 SSL 证书时,客户端将自动获取并安装对作为参数提供的域有效的新 SSL 证书。

如果要安装对多个域或子域有效的单个证书,可以将它们作为附加参数传递给命令。参数列表中的第一个域名将是Let’s Encrypt 用来创建证书基本域,因此您将传递顶级域名作为列表中的第一个,然后是任何其他子域或别名:

  • sudo certbot --nginx -d your_domain -d www.your_domain

certbot--nginx插件一起运行基本域将是your_domain. 要执行交互式安装并获取仅涵盖单个域的证书,请使用以下certbot命令运行命令:

  • sudo certbot --nginx -d your_domain

certbot实用程序还可以在证书请求过程中提示您输入域信息。要使用此功能,请在certbot没有任何域的情况下调用

  • sudo certbot --nginx

您将收到自定义证书选项的分步指南。Certbot 将要求您提供丢失密钥恢复和通知的电子邮件地址,并同意服务条款。如果您没有在命令行中指定您的域,Certbot 将查找server_name指令并为您提供找到的域名列表。如果您的服务器阻止文件没有使用server_name指令明确指定它们服务的域,Certbot 将要求您手动提供域名。

为了更好的安全性,Certbot 将自动配置将端口80上的所有流量重定向443.

安装成功完成后,您将收到类似于以下内容的消息:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2021-02-26. 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

生成的证书文件将在以您的基本域命名的子目录中提供/etc/letsencrypt/live

现在您已经完成了 Certbot 的使用,您可以检查您的 SSL 证书状态。通过在首选 Web 浏览器中打开以下链接来验证您的 SSL 证书的状态(不要忘记替换your_domain为您的基本域):

https://www.ssllabs.com/ssltest/analyze.html?d=your_domain

此站点包含来自SSL Labs的 SSL 测试,该测试将自动启动。在撰写本文时,默认设置评级A。

您现在可以使用https前缀访问您的网站但是,您必须定期更新证书以保持此设置正常工作。在下一步中,您将自动执行此续订过程。

第 4 步 — 设置自动续订

Let’s Encrypt 证书的有效期为 90 天,但建议您每 60 天更新一次证书以允许存在一定的误差。Certbot Let’s Encrypt 客户端有一个renew命令,可以自动检查当前安装的证书,并在距离到期日期不到 30 天时尝试更新它们。

您可以通过运行以下命令来测试证书的自动续订:

  • sudo certbot renew --dry-run

输出将类似于:

Output
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) ...

请注意,如果您创建了具有多个域的捆绑证书,则输出中只会显示基本域名,但续订将适用于该证书中包含的所有域。

确保您的证书不会过时的一种实用方法是创建一个cron作业,作业将定期为您执行自动更新命令。由于续订首先会检查到期日期,并且仅在距离到期日期不到 30 天时才执行续订,因此创建每周甚至每天运行的 cron 作业是安全的。

编辑 crontab 以创建一个新作业,该作业将每天运行两次更新。要为 root 用户编辑 crontab,请运行:

  • sudo crontab -e

您的文本编辑器将打开默认的 crontab,此时它是一个空文本文件。通过按下i并添加以下行进入插入模式

定时任务表
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

完成后,按ESC退出插入模式,然后按:wqENTER保存并退出文件。要了解有关文本编辑器 Vi 及其后续 Vim 的更多信息,请查看我们的在云服务器上安装和使用 Vim 文本编辑器教程。

这将创建一个新的 cron 作业,该作业将在每天中午和午夜执行。python -c 'import random; import time; time.sleep(random.random() * 3600)'将为您的续订任务选择一小时内的随机分钟。

renewCertbot命令将检查系统上安装的所有证书,并更新任何设置为在 30 天内过期的证书。--quiet告诉 Certbot 不要输出信息或等待用户输入。

有关续订的更多详细信息,请参阅Certbot 文档

结论

在本指南中,您安装了 Let’s Encrypt 客户端 Certbot,为您的域下载了 SSL 证书,并设置了自动证书续订。如果您对使用 Certbot 有任何疑问,可以查看Certbot官方文档

您还可以不时查看Let’s Encrypt官方博客以获取重要更新。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁