作者选择了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
您将收到如下输出:
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 用来创建证书的基本域,因此您将传递顶级域名作为列表中的第一个,然后是任何其他子域或别名:
- 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
.
安装成功完成后,您将收到类似于以下内容的消息:
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
并添加以下行进入插入模式:
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)'
将为您的续订任务选择一小时内的随机分钟。
renew
Certbot的命令将检查系统上安装的所有证书,并更新任何设置为在 30 天内过期的证书。--quiet
告诉 Certbot 不要输出信息或等待用户输入。
有关续订的更多详细信息,请参阅Certbot 文档。
结论
在本指南中,您安装了 Let’s Encrypt 客户端 Certbot,为您的域下载了 SSL 证书,并设置了自动证书续订。如果您对使用 Certbot 有任何疑问,可以查看Certbot官方文档。
您还可以不时查看Let’s Encrypt官方博客以获取重要更新。