如何在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
退出插入模式,然后按 :wq
和 ENTER
保存并退出文件。 要了解有关文本编辑器 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】不定期的重要更新。