Let's Encrypt 免费证书:Certbot 自动化续签
Let's Encrypt 免费证书完全指南:使用 Certbot 自动化部署与续签
为什么你需要 Let's Encrypt
网站从 HTTP 迁移到 HTTPS 早已不是可选项,而是必选项。浏览器会将未加密的站点标记为“不安全”,搜索引擎也会对 HTTPS 站点给予更好的排名。然而,传统 SSL/TLS 证书通常价格不菲且需要手动续期。Let's Encrypt 彻底改变了这一点——它提供完全免费、被所有主流浏览器信任的域名验证证书,并且鼓励自动化。
本教程将带你从零开始,使用官方推荐工具 Certbot 申请 Let's Encrypt 证书,并配置全自动续签,让你的 HTTPS 网站一劳永逸。
准备工作
在开始之前,请确保你已经具备以下条件:
- 一台拥有公网 IP 的服务器(本教程以 Ubuntu/Debian 为例,其他系统类似)。
- 一个已正确解析到该服务器的域名(例如
example.com)。 - 服务器开放了 80 (HTTP) 和 443 (HTTPS) 端口。
- 具有 sudo 权限的 SSH 登录账号。
注意:Let's Encrypt 证书的有效期仅为 90 天,因此自动化续签是整个流程中最关键的环节。
安装 Certbot
Certbot 是 Let's Encrypt 官方推荐的客户端,它能够自动完成证书申请、安装和续签。我们将通过官方维护的 snap 包安装,以获得最新版本和自动更新。
1. 安装 snapd
如果你的系统尚未安装 snapd,请先执行以下命令:
sudo apt update
sudo apt install snapd -y
确保 snapd 是最新版本:
sudo snap install core
sudo snap refresh core
2. 安装 Certbot
使用 snap 安装 Certbot:
sudo snap install --classic certbot
安装完成后,创建软链接以便在命令行直接使用 certbot:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
验证安装是否成功:
certbot --version
申请并安装证书
Certbot 会根据你的服务器环境自动选择最佳验证方式。最常用的是 webroot 方式(适用于已运行 Web 服务)和 standalone 方式(临时启动 Web 服务器)。这里我们以 nginx 插件为例,如果你的服务器使用 Apache,可以相应替换为 --apache。
1. 使用 Certbot Nginx 插件
Certbot 的 Nginx 插件可以自动修改 Nginx 配置文件,帮你完成证书安装和 HTTPS 跳转。
运行以下命令,将 example.com 和 www.example.com 替换为你的实际域名:
sudo certbot --nginx -d example.com -d www.example.com
交互式步骤说明:
- 输入你的电子邮箱,用于紧急通知和密钥丢失恢复(建议填写真实邮箱)。
- 同意服务条款。
- 选择是否将邮箱共享给 EFF(可选)。
- Certbot 会自动获取证书并修改 Nginx 配置,实现 HTTP 到 HTTPS 的重定向。
操作成功后,访问你的域名,你将看到 HTTPS 已生效,且浏览器地址栏会显示安全锁图标。
2. 手动验证方式(Webroot)
如果不想让 Certbot 修改服务器配置,或使用了其他 Web 服务器,可以使用 webroot 方式:
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
-w 参数指定网站的根目录,Certbot 会在该目录下创建一个临时验证文件,Let's Encrypt 服务器通过访问这个文件来验证域名控制权。
申请成功后,证书通常存放在 /etc/letsencrypt/live/你的域名/ 目录下,你需要手动配置 Web 服务器使用这些证书。
验证证书与配置
无论采用哪种方式申请,让我们检查一下证书链是否正确生成。
sudo certbot certificates
输出示例:
Found the following certs:
Certificate Name: example.com
Serial Number: 3b2e1d3a4a4d5b6c7d8e9f0a1b2c3d4e5f6
Key Type: RSA
Domains: example.com www.example.com
Expiry Date: 2025-06-15 13:33:09+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
重点关注 Expiry Date,剩余天数应接近 90 天。
Nginx 手动配置示例
如果你没有使用插件自动配置,以下是 Nginx HTTPS 最小配置参考(适用于 443 端口监听):
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# 你的网站配置
}
}
# HTTP 跳转 HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
执行 sudo nginx -t && sudo systemctl reload nginx 使其生效。
自动化续签:CentOS 的心脏
Let's Encrypt 证书只有 90 天有效期,手动续签是绝对不可接受的。Certbot 安装时就已在系统中设置了自动续签任务,我们只需验证它是否正常工作。
1. 检查自动续签定时器
Certbot 使用 systemd 定时器(或 cron)来管理续签。执行以下命令查看定时器状态:
sudo systemctl status certbot.timer
输出中应包含 Active: active (running) 和下一次触发的时间(通常是每日两次随机时间)。如果没有启动,手动启用并启动:
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
2. 模拟续签测试
为了确保续签流程无障碍,Certbot 提供了“干运行”模式,会模拟整个续签过程但不实际存储证书:
sudo certbot renew --dry-run
如果看到 Congratulations, all simulated renewals succeeded,说明一切配置正确,未来证书将静默自动更新。
3. 续签后的钩子操作
证书更新后,Web 服务器并不会自动加载新证书,因此需要重启或重载服务。Certbot 的默认配置已经包含了重载 Nginx 或 Apache 的钩子,可以检查 Certbot 的配置文件(通常在 /etc/letsencrypt/cli.ini 或 /etc/letsencrypt/renewal/ 目录下)。如果没有自动重载,你可以手动添加部署钩子。
例如,让 Certbot 在续签后重载 Nginx:
sudo certbot renew --deploy-hook "systemctl reload nginx"
该命令会将钩子持久化到当前 renewal 配置中。之后每次自动续签都会执行这个命令。
对于其他服务(如 HAProxy、Postfix 等),只需修改钩子中的服务重载命令即可。
4. 验证续签日志
自动续签的执行结果会写入日志文件,便于排查问题:
sudo tail -f /var/log/letsencrypt/letsencrypt.log
定期查看或配置监控报警(如证书到期时间小于 30 天时通知),可以让你的证书管理高枕无忧。
常见问题排查
问题:域名验证失败,提示连接超时
- 确认域名解析已生效,可使用
nslookup example.com验证。 - 检查防火墙是否允许 80 端口流入。
- 如果使用 CDN(如 Cloudflare),验证期间可能需要暂时暂停代理(开启 DNS Only 模式),验证完成后再开启。
问题:certbot 命令提示 “command not found”
- 软链接未创建,请重新执行
sudo ln -s /snap/bin/certbot /usr/bin/certbot。 - 或者使用绝对路径
/snap/bin/certbot执行。
问题:自动续签失败,邮件收到通知
- 手动执行
sudo certbot renew查看具体错误信息。 - 确认 webroot 路径正确且可写。
- 检查磁盘空间是否充足。
- 查看 Certbot 社区帮助文档或将错误日志输出到搜索引擎,通常有现成解决方案。
进阶技巧
通配符证书
Let's Encrypt 同样支持免费通配符证书(*.example.com),这需要使用 DNS 验证方式。Certbot 支持多种 DNS 插件(如 Cloudflare、阿里云、Route53 等),可以实现域名所有权的自动化验证,从而获得通配符证书。
示例(Cloudflare 插件):
sudo snap install certbot-dns-cloudflare
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/cloudflare.ini -d example.com -d '*.example.com'
需提前创建 API Token 并写入凭证文件。通配符证书同样支持自动续签。
证书更强大的安全配置
为了让 HTTPS 获得 A+ 评级,你可以在 Nginx 配置中加入 HSTS 头部和 OCSP Stapling:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
结语
你已成功为站点配置了免费的 HTTPS 证书,并建立了坚不可摧的自动续签机制。Let's Encrypt 让网络安全变得触手可及,而 Certbot 则让整个流程丝滑顺畅。当你下一次想起证书即将到期时,它早已在后台悄悄更新完成——这就是自动化的魅力。
现在,享受你永久免费的 HTTPS 吧。