如何在CentOS8上使用Let'sEncrypt保护Nginx

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 COVID-19 Relief Fund 作为 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 的 A 记录指向您服务器的公共 IP 地址。 带有 www.your_domain 的 A 记录指向您服务器的公共 IP 地址。

第 1 步 — 安装 Certbot Let's Encrypt 客户端

首先需要安装【X31X】【X35X】软件包。 以非 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

您将收到如下输出:

Outputpublic
  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 证书。

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

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

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

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

sudo certbot --nginx -d your_domain

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

sudo certbot --nginx

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

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

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

OutputIMPORTANT 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

输出将与此类似:

OutputSaving 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 进入插入模式并添加以下行:

crontab

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)' 将在一小时内为您的续订任务选择一个随机分钟。

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

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

结论

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

也可以查看官方【X32X】Let's Encrypt 博客【X54X】不定期的重要更新。