![[教程] 如何为 Nginx/Apache 配置免费 Let's Encrypt SSL 证书 (Certbot 详解)](https://file.hostol.com/wp-content/uploads/2025/05/证书配置.png)
在这个隐私和安全日益重要的时代,如果你运营的网站还在用明文的 HTTP 协议,那地址栏旁边那个“不安全”的警告,是不是让你看着有点心慌慌?用户看到这个可能也会“用脚投票”,扭头就走。而且,搜索引擎(比如 Google)也早就明确表示,HTTPS 是影响排名的一个因素。所以,给网站启用 HTTPS 加密,从“可选配置”变成“基础标配”,已经是大势所趋。
“可是,搞 HTTPS 不是要花钱买 SSL 证书吗?还得自己手动配置,听说挺复杂的,我技术不太行啊……” 如果你有这样的顾虑,那么我要给你介绍两位“大救星”:
- Let’s Encrypt: 这是一个由非营利组织 ISRG 发起的免费、开放、自动化的证书颁发机构 (CA)。它提供的 SSL/TLS 证书是完全免费的,并且被所有主流浏览器信任。简直是我等“穷站长”和开发者的福音!
- Certbot: 这是由 EFF 开发和维护的一个客户端工具。它的作用就是自动化地与 Let’s Encrypt CA 进行交互,帮你完成域名验证、证书获取、以及(最厉害的是)自动配置你的 Web 服务器(如 Nginx 或 Apache)来使用这个证书,甚至还能帮你设置好证书的自动续期!有了它,申请和管理 Let’s Encrypt 证书的过程变得极其简单。
可以把 Let’s Encrypt 想象成一个免费发放“网站安全身份证”的机构,而 Certbot 就是一个超级智能、任劳任怨的“代办机器人”,你只需要告诉它你的域名和服务器类型,它就能帮你跑前跑后,把申请、配置、续期这些繁琐事儿全自动搞定!
这篇教程,我就带你手把手地在你的 Linux 服务器上安装和使用 Certbot,分别为最常见的两大 Web 服务器——Nginx 和 Apache——配置免费的 Let’s Encrypt SSL 证书。跟着步骤来,保证让你轻松给网站“上锁”!
准备工作:在开始之前你需要什么?
在召唤 Certbot 这个“机器人”之前,请确保你的服务器已经满足以下基本条件:
- 一台运行 Linux 的服务器:本教程主要以 Ubuntu 22.04 为例进行演示,但 Certbot 也支持 Debian, CentOS, Fedora 等其他主流发行版(具体安装命令可能略有不同)。
- 安装并运行了 Nginx 或 Apache:你需要已经安装好了 Nginx 或 Apache,并且已经配置了一个基本的虚拟主机(Server Block 或 VirtualHost),能够通过 HTTP (80 端口) 正常访问你的网站域名。
- 一个注册好的域名:你需要拥有一个域名(比如
yourdomain.com
),并且已经将这个域名(以及你想要一起加密的子域名,如www.yourdomain.com
)的 DNS 解析正确地指向了你这台服务器的公网 IP 地址。- 检查方法: 在你本地电脑或其他地方
ping yourdomain.com
,看看返回的 IP 地址是不是你服务器的 IP。 - 极其重要: 这是 Let’s Encrypt 验证你确实拥有该域名的关键一步(通常通过 HTTP-01 验证方式),如果 DNS 解析不对,Certbot 申请证书一定会失败!
- 检查方法: 在你本地电脑或其他地方
- 拥有服务器的
sudo
或root
权限:因为安装软件和修改 Web 服务器配置需要管理员权限。 - 可以通过 SSH 访问服务器:你需要能登录到服务器的命令行界面来执行命令。
确认以上条件都满足了?很好,我们可以开始召唤 Certbot 了!
第一步:安装 Certbot – 你的“证书申请机器人”
我们需要先把 Certbot 这个工具安装到服务器上。官方最推荐的安装方式是使用 Snap 包管理器,因为它能确保你使用的是最新版本的 Certbot,并且它自带所有依赖,能跨不同的 Linux 发行版保持一致性。
- 确保
snapd
已安装并更新: 大多数现代 Ubuntu 系统自带snapd
。对于其他系统,或者不确定的情况,可以执行相关安装和更新命令(具体命令请参考 Certbot 官网或你的发行版文档)。确保 snapd 核心是最新: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]sudo snap install core; sudo snap refresh core
- 安装 Certbot: 确保没有旧的通过 apt/yum 安装的 Certbot 存在(如有,先卸载)。然后通过 Snap 安装: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo snap install --classic certbot
- 创建 Certbot 命令的符号链接: 为了方便直接使用
certbot
命令: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]sudo ln -s /snap/bin/certbot /usr/bin/certbot
安装完成后,你可以运行 certbot --version
来检查是否安装成功以及查看版本号。
第二步:为 Nginx 获取并安装证书
如果你使用 Nginx,Certbot 的 Nginx 插件能帮你自动化大部分工作。
- 运行 Certbot 命令: 将
yourdomain.com
和www.yourdomain.com
替换成你自己的域名。用多个-d
参数指定所有需要包含的域名。 [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
--nginx
参数告诉 Certbot 使用 Nginx 插件。 - 根据提示进行交互: 首次运行会要求你输入邮箱(用于续期提醒)、同意服务条款、以及选择是否分享邮箱给 EFF。
- 等待验证和配置完成: Certbot 会自动进行 HTTP-01 验证(确保你的服务器 80 端口能被公网访问!),下载证书,并自动修改你的 Nginx 虚拟主机配置,添加 HTTPS 相关指令(
listen 443 ssl http2
,ssl_certificate
,ssl_certificate_key
等)并设置 HTTP 到 HTTPS 的跳转。 - 查看结果: 成功后会有祝贺信息,告知证书位置和有效期。
- 验证 Nginx 配置并测试:
- 检查配置语法:
sudo nginx -t
。 - 重载 Nginx(Certbot 通常会自动做):
sudo systemctl reload nginx
。 - 用浏览器访问
https://yourdomain.com
,检查地址栏的安全锁标志。 - (推荐)用 SSL Labs 工具全面检测 HTTPS 配置。
- 检查配置语法:
对于 Nginx 用户,过程通常非常顺畅。
第三步:为 Apache 获取并安装证书
如果你使用 Apache(服务名可能是 apache2
或 httpd
),过程类似,只需更换插件参数。
- 确保 Apache 的
mod_ssl
模块已启用: 检查并启用 SSL 模块,然后重启 Apache。 [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]# Debian/Ubuntu sudo a2enmod ssl sudo systemctl restart apache2 # CentOS/RHEL (通常通过安装 mod_ssl 包启用) # sudo yum install mod_ssl -y # sudo systemctl restart httpd
- 运行 Certbot 命令 (使用 Apache 插件): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
--apache
参数告诉 Certbot 使用 Apache 插件。 - 根据提示进行交互(同 Nginx)。
- 等待验证和配置完成: Certbot 会自动完成验证,下载证书,并修改 Apache 的虚拟主机配置文件,添加
SSLEngine on
,SSLCertificateFile
,SSLCertificateKeyFile
等指令,并设置 HTTP 到 HTTPS 跳转。 - 查看结果并测试:
- 检查配置语法:
sudo apachectl configtest
(或sudo httpd -t
)。 - 重载 Apache(Certbot 通常会自动做):
sudo systemctl reload apache2
(或httpd
)。 - 用浏览器访问
https://yourdomain.com
,检查安全锁和证书。 - 用 SSL Labs 进行测试。
- 检查配置语法:
使用 Apache 插件同样可以实现高度自动化。
第四步:理解证书文件与自动续期 – 让“通行证”永不过期
证书拿到手了,但事情还没完。你需要了解证书放在哪,以及如何让它一直有效。
- 证书文件在哪里? Certbot 通常将证书相关文件存放在
/etc/letsencrypt/live/yourdomain.com/
目录下(yourdomain.com
是你的主域名)。里面有几个关键文件(实际是符号链接):cert.pem
: 服务器证书。chain.pem
: 中间证书链。fullchain.pem
: 完整证书链(服务器配置通常用这个)。privkey.pem
: 证书私钥(极其重要,保密!)。
- 自动续期的“魔法”: Let’s Encrypt 证书有效期只有 90 天。但别担心,Certbot 最强大的地方在于它能**自动续期**!安装 Certbot 时,它通常会自动设置一个系统计划任务(systemd timer 或 cron job),每天运行两次检查证书有效期。当证书还剩 30 天或更少时,它会自动尝试续期,成功后还会自动帮你重载 Web 服务器配置。全程自动化,你几乎不用管!
- 如何测试自动续期是否正常工作? 你可以运行一个“模拟续期”命令来检查: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo certbot renew --dry-run
如果命令成功执行且没有报错,说明自动续期机制配置正常。 - 检查续期任务本身: 想确认那个定时任务确实在?可以这样检查: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 检查 systemd 定时器 sudo systemctl list-timers | grep certbot # 或者检查 cron 任务 # sudo ls -l /etc/cron.d/certbot
只要你首次配置成功,并且 Certbot 能正常运行,你的证书就能持续自动续期,HTTPS 永不掉线。
(可选) 获取通配符证书 (*.yourdomain.com) – 进阶操作
有时你希望一张证书能保护主域名及其下所有一级子域名(如 blog.
, shop.
, api.
等)。这就是通配符证书。
Let’s Encrypt 支持免费通配符证书,但它**只能通过 DNS-01 方式验证**,你需要证明你对域名的 DNS 解析有控制权。
如何获取?
- 手动模式 (不推荐,无法自动续期): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo certbot certonly --manual --preferred-challenges=dns -d yourdomain.com -d '*.yourdomain.com' --server https://acme-v02.api.letsencrypt.org/directory
执行后,Certbot 会要求你手动去你的 DNS 服务商那里添加指定的 TXT 记录。验证过程需要人工干预,且无法自动续期。 - 使用 DNS 插件 (推荐,可自动续期): Certbot 支持多种 DNS 服务商插件(如 Cloudflare, Route53, GoDaddy, 阿里云 DNS, DNSPod 等)。你需要先安装对应的插件,并配置好该 DNS 服务商的 API 访问凭证。 [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 示例:使用 Cloudflare 插件 (需要先安装 certbot-dns-cloudflare 插件并配置凭证文件) sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d yourdomain.com -d '*.yourdomain.com' --server https://acme-v02.api.letsencrypt.org/directory
这种方式可以实现通配符证书的全自动获取和续期。配置相对复杂,请参考 Certbot 官方文档和你 DNS 服务商插件的具体说明。
获取通配符证书后,你还需要手动配置 Nginx/Apache 来使用它。
结论:拥抱免费 HTTPS,让安全成为标配
怎么样?是不是发现给网站加上那把象征安全的“小锁头”,其实并没有想象中那么复杂和昂贵?
有了 Let’s Encrypt 提供的免费证书,再加上 Certbot 这个得力的“自动化助手”,无论是 Nginx 还是 Apache 用户,都可以非常轻松地为自己的网站启用 HTTPS 加密,并且享受自动续期的便利。这无疑是所有网站管理员和开发者的巨大福音。
现在,你已经掌握了使用 Certbot 为你的 Web 服务器配置 Let’s Encrypt 证书的核心步骤。不要再犹豫了,赶紧行动起来,让你和你的用户都能享受更安全的网络浏览体验吧!让 HTTPS 成为我们每一个网站的基础配置,这在 2025 年,理应如此。
还有疑问?常见问题解答 (FAQs)
- 问: 我的网站已经用了 Cloudflare 的免费 CDN,它提供的 SSL 证书和 Let’s Encrypt 有什么区别?我还需要在源服务器上配置 Let’s Encrypt 吗? 答: Cloudflare 提供的免费 SSL 通常是用于用户浏览器到 Cloudflare 边缘节点之间的加密(即“客户端到 CDN”段)。你还需要确保Cloudflare 边缘节点到你的源服务器之间的连接也是加密的,这样才能实现完整的端到端加密(Full SSL 或 Full (Strict) SSL 模式)。强烈建议你在源服务器上也配置一个有效的 SSL 证书(比如用 Certbot 获取的 Let’s Encrypt 证书),并在 Cloudflare 的 SSL/TLS 设置中选择 “Full (Strict)” 模式。这样可以确保整个通信链路都是安全的。只用 Cloudflare 的 Flexible SSL 模式(即源服务器是 HTTP)是不安全的。
- 问: 我可以直接为服务器的 IP 地址申请 Let’s Encrypt 证书吗? 答: 不可以。Let’s Encrypt 只为完全限定的域名 (FQDN) 颁发证书,不为裸 IP 地址颁发。因为 SSL/TLS 证书的核心作用之一是验证身份,而 IP 地址是可能变化的,无法作为稳定的身份标识。如果你想通过 HTTPS 访问你的服务器,你需要先拥有一个域名,并将该域名解析到你的服务器 IP 地址上,然后为这个域名申请证书。
- 问: 我有多台服务器提供同一个网站(比如做了负载均衡),可以使用同一张 Let’s Encrypt 证书吗?怎么管理? 答: 可以的。你可以在其中一台服务器上使用 Certbot 获取证书(包含所有需要保护的域名和子域名),然后将获取到的证书文件(位于
/etc/letsencrypt/live/yourdomain.com/
下的fullchain.pem
和privkey.pem
)安全地复制到其他所有需要使用该证书的服务器上,并配置它们的 Web 服务器指向这些文件。关键在于证书续期:你需要确保 Certbot 的自动续期任务只在其中一台服务器上运行,并且在该服务器成功续期证书后,有一个自动化的机制能将新的证书文件同步分发到其他所有服务器,并触发它们重载 Web 服务配置。这通常需要编写自定义脚本或使用配置管理工具 (Ansible 等) 来实现。 - 问: Certbot 的自动续期失败了怎么办?我怎么知道它失败了? 答: Certbot 在自动续期失败时,通常会尝试发送邮件通知到你当初设置的那个邮箱地址(所以填写真实有效邮箱很重要!)。你也可以手动运行
sudo certbot renew
来查看是否有证书即将过期或续期失败。如果续期失败,通常输出信息会包含失败的原因(比如域名验证失败、连接 Let’s Encrypt 服务器超时等)。你需要根据错误信息进行排查(比如检查 DNS 解析是否仍然正确?服务器防火墙是否阻止了 Let’s Encrypt 的验证请求?Certbot 版本是否过旧?)。修复问题后,再次手动运行sudo certbot renew
直到成功。同时,检查自动续期的计划任务(systemd timer 或 cron job)是否正常运行。 - 问: 如果我的域名不用了,或者服务器迁移了,如何处理之前申请的 Let’s Encrypt 证书?需要手动吊销吗? 答: Let’s Encrypt 证书只有 90 天有效期,并且是免费的。如果你不再使用某个域名或服务器,通常没有必要特意去吊销 (Revoke) 对应的证书。只要你停止了该域名的 DNS 解析,或者停止了服务器上的自动续期任务,证书到期后就会自然失效,不会产生任何费用或安全风险。吊销证书的操作通常只在私钥已经泄露或者证书被错误签发等极端安全情况下才需要进行(可以通过
sudo certbot revoke --cert-path /etc/letsencrypt/live/yourdomain.com/cert.pem
命令操作)。