如何在CentOS8上使用Let'sEncrypt保护Apache
介绍
Let's Encrypt 是一个证书颁发机构 (CA),它有助于获取和安装免费的 TLS/SSL 证书,从而在 Web 服务器上启用加密的 HTTPS。 它通过与 Certbot 等客户端合作来自动化必要的步骤,从而简化了流程。
在本教程中,您将使用 Certbot 在 CentOS 8 上的 Apache Web 服务器上设置 TLS/SSL 证书。 此外,您将使用 cron 作业自动执行证书更新过程,您可以通过阅读 如何使用 Cron 在 CentOS 8 上自动执行任务来了解更多信息。
先决条件
为了完成本指南,您需要:
- 一台 CentOS 8 服务器,具有非 root 启用 sudo 的用户和基本的
firewalld
防火墙,按照 CentOS 8 初始服务器设置指南 设置。 - Apache 安装在为您的域配置了虚拟主机的服务器上。 您可以按照我们的教程 如何在 CentOS 8 上安装 Apache Web 服务器来学习如何设置它。 确保为您的域设置了 虚拟主机 。 本教程将以
/etc/httpd/sites-available/example.com.conf
为例。 - 您应该拥有或控制您希望使用证书的注册域名。 如果您还没有注册域名,您可以在 Namecheap 上购买一个,在 Freenom 上免费获得一个,或者使用您选择的域名注册商。
- DNS A 记录 将您的域指向您服务器的公共 IP 地址。 如果您通过 DigitalOcean 托管您的域,您可以参考 DigitalOcean DNS 文档 了解如何使用 DigitalOcean 平台添加这些记录的详细信息。 DNS
A
记录是必需的,因为 Let's Encrypt 如何验证您拥有它为其颁发证书的域。 例如,如果您想获得example.com
的证书,则该域必须解析到您的服务器,验证过程才能正常工作。 我们的设置将使用example.com
和www.example.com
作为域名,这两个域名都需要有效的 DNS 记录。
完成所有这些先决条件后,继续安装 Certbot 客户端软件。
第 1 步 — 安装 Certbot Let's Encrypt 客户端
要使用 Let's Encrypt 获取 SSL 证书,您首先需要安装 Certbot 和 mod_ssl,这是一个支持 SSLv3 加密的 Apache 模块。
默认情况下,certbot
包无法通过包管理器获得。 您需要启用 EPEL 存储库来安装 Certbot。
要添加 CentOS 8 EPEL 存储库,请运行以下命令:
sudo dnf install epel-release
现在您可以访问存储库,安装所有必需的包:
sudo dnf install certbot python3-certbot-apache mod_ssl
安装这些服务后,您现在可以运行 Certbot 并获取您的证书。
第 2 步 — 获得证书
现在 Certbot 已安装,您可以使用它为您的域请求 SSL 证书。
使用 certbot
Let's Encrypt 客户端为 Apache 生成 SSL 证书可自动执行该过程中的许多步骤。 客户端将自动获取并安装对您作为参数提供的域有效的新 SSL 证书。
要执行交互式安装并获取仅涵盖单个域的证书,请使用以下命令运行 certbot
命令:
sudo certbot --apache -d example.com
这将使用 --apache
插件运行 certbot
并使用 -d
标志指定要为其配置证书的域。
如果要安装对多个域或子域有效的单个证书,可以将它们作为附加参数传递给命令,用 -d
标志标记每个新域或子域。 参数列表中的第一个域名将是 Let's Encrypt 用来创建证书的 base 域。 出于这个原因,将基本域名作为列表中的第一个传递,然后是任何其他子域或别名:
sudo certbot --apache -d example.com -d www.example.com
此示例中的基域是 example.com
。
certbot
实用程序还可以提示您根据现有的 Apache 配置选择域。 要使用此功能,请在不指定任何域的情况下调用 certbot
:
sudo certbot --apache
该程序将为您提供自定义证书选项的分步指南。 它将要求您提供丢失密钥恢复和通知的电子邮件地址,然后提示您同意服务条款。 如果您没有在命令行上指定域,系统也会提示您输入。 如果您的虚拟主机文件没有使用 ServerName
指令明确指定它们服务的域,您将被要求选择虚拟主机文件。
安装成功完成后,您将看到类似以下的消息:
OutputIMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-09-24. 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" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - 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
目录中以您的基本域命名的子目录中可用。
现在您的证书已下载、安装和加载,您可以检查 SSL 证书状态以确保一切正常。
第 3 步 — 测试证书和 SSL 配置
此时,您可以使用云安全公司 Qualys 的 SSL Server Test 确保 Certbot 正确创建了您的 SSL 证书。
在您首选的 Web 浏览器中打开以下链接,将 example.com
替换为您的域:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
您将登陆一个页面,该页面会立即开始测试与您的服务器的 SSL 连接:
测试开始运行后,可能需要几分钟才能完成。 测试状态将在您的浏览器中更新。
测试完成后,页面将显示一个字母等级,用于评估服务器配置的安全性和质量。 在撰写本文时,默认设置将给出 A 评级:
有关 SSL Labs 如何确定这些等级的更多信息,请查看 SSL Labs 分级帖子 ,其中详细介绍了 2018 年 1 月对分级方案所做的更新。
尝试使用 https://
重新加载您的网站,并注意浏览器的安全指示器。 它现在将表明该站点已得到适当保护,通常带有一个锁定图标。
安装并验证您的 SSL 证书后,下一步是为您的证书设置自动续订以保持您的证书有效。
第 4 步 — 设置自动续订
Let's Encrypt 证书的有效期为 90 天,但建议您每天检查两次是否续订,以防出现吊销或其他问题。 因此,自动化此过程是最佳实践。
首先,让我们检查一下您将用于更新证书的命令。 certbot
Let's Encrypt 客户端有一个 renew
命令,该命令会自动检查当前安装的证书,并在距离到期日期不到 30 天时尝试更新它们。 通过使用 --dry-run
选项,您可以运行此任务的模拟来测试 renew
的工作原理:
sudo certbot renew --dry-run
输出应与此类似:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator apache, Installer apache Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org Renewing an existing certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for www.example.com Waiting for verification... Cleaning up challenges Resetting dropped connection: acme-staging-v02.api.letsencrypt.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of apache server; fullchain is /etc/letsencrypt/live/example.com/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/example.com/fullchain.pem (success) ...
请注意,如果您创建了包含多个域的捆绑证书,则输出中将仅显示基本域名,但续订将对该证书中包含的所有域有效。
确保您的证书不会过时的一种实用方法是创建一个 cron 作业,它将定期为您执行自动更新命令。
官方 Certbot 文档 建议每天运行两次 cron
。 这将确保在 Let's Encrypt 发起证书吊销的情况下,Certbot 更新您的证书不会超过半天。 文档建议使用以下命令将适当的 cron
作业添加到 /etc/crontab
crontab 文件:
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
这将创建一个新的 cron 作业,该作业将在每天中午和午夜执行 (0 0,12 * * *
)。 然后它将运行简短的 python3
脚本,该脚本会在 0 到 60 分钟之间的随机时间段内暂停。 建议这样做是为了减少 Let's Encrypt 服务器的负载。
python脚本退出后,将运行实际的certbot renew
命令。
有关如何创建和安排 cron 作业的更多信息,您可以查看我们的 如何在 CentOS 8 上使用 Cron 自动执行任务指南。 有关续订的更多详细信息,请参阅 Certbot 文档。
结论
在本指南中,您安装了 Let's Encrypt Certbot 客户端,为您的域下载了 SSL 证书,并设置了自动证书续订。 如果您对使用 Certbot 有任何疑问,可以查看官方 Certbot 文档。 我们还建议您不时查看官方 Let's Encrypt 博客 以获取重要更新。