HTTPS 证书自动化管理是网站上线的基础运维工作,本文使用 Certbot 工具实现 Let’s Encrypt 免费证书的签发、Nginx 自动配置与定时自动续期,让 HTTPS 证书管理实现全流程自动化,彻底告别证书过期导致的网站安全告警。
适用场景
- 网站启用 HTTPS,希望使用免费证书降低成本的场景
- 多域名、多站点服务器需要集中管理证书的场景
- 希望证书到期自动续期,避免人工遗漏的场景
- 迁移到 HTTPS 后需要统一配置 HSTS、HTTP 跳转的场景
前置条件
- Linux 服务器(本教程以 Ubuntu 22.04 + Nginx 为例)
- 域名已解析到服务器 IP,且 80 端口可公网访问(签发验证需要)
- 服务器已安装 Nginx 并配置好站点
- 具备 root 或 sudo 权限
原理说明
Certbot 是 Let’s Encrypt 官方推荐的 ACME 客户端。ACME 协议的工作流程为:客户端向证书颁发机构(CA)发起证书申请 → CA 验证你对域名的控制权(HTTP-01 验证时在网站根目录放置临时验证文件,或 DNS-01 时添加 TXT 记录)→ 验证通过后签发证书 → Certbot 将证书安装到 Web 服务器并配置自动续期定时任务。Let’s Encrypt 证书有效期为 90 天,因此自动续期是 HTTPS 运维的关键环节。
操作步骤
1. 安装 Certbot 与 Nginx 插件
# 更新软件源并安装
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
# 验证安装
certbot --version
python3-certbot-nginx 插件可让 Certbot 自动修改 Nginx 配置并加载证书,省去手动编辑步骤。
2. 签发证书并自动配置 Nginx
# 签发证书(自动修改 Nginx 配置,启用 HTTPS 与 HTTP 跳转)
sudo certbot --nginx -d www.example.com -d example.com
交互过程会询问:接收订阅条款(A)、共享邮箱(可选)、以及是否将 HTTP 流量重定向到 HTTPS(选 2 推荐)。执行成功后 Certbot 会自动完成以下工作:签发证书、安装到 Nginx、修改站点配置开启 443 端口、配置 80→443 跳转。
签发成功后可通过以下命令查看证书信息:
# 查看证书列表与到期时间
sudo certbot certificates
3. 手动执行续期测试
# 模拟续期(不实际修改,仅测试)
sudo certbot renew --dry-run
输出包含 Congratulations, all simulated renewals succeeded 表示续期链路正常。Certbot 安装时会自动创建 systemd timer(每天执行两次检查),证书到期前 30 天内才会实际续期。
4. 验证自动续期定时任务
# 查看 systemd 定时器状态
sudo systemctl status certbot.timer
# 查看定时器执行时间
sudo systemctl list-timers | grep certbot
# 查看续期日志
sudo journalctl -u certbot.service --since today
若服务器未使用 systemd(如 CentOS 6),Certbot 会改用 /etc/cron.d/certbot 定时任务,用 crontab -l 检查即可。
5. 配置 HSTS 增强 HTTPS 安全
证书签发完成后,在 Nginx 的 443 server 块中追加 HSTS 头,强制浏览器仅通过 HTTPS 访问:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
# 追加 HSTS 响应头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 启用 TLS 1.2/1.3
ssl_protocols TLSv1.2 TLSv1.3;
}
配置完成后重载 Nginx:sudo nginx -t && sudo systemctl reload nginx。
配置验证
从三方面验证 HTTPS 配置是否完全生效:
- 浏览器访问:访问
https://www.example.com,地址栏显示锁形图标,无证书告警 - 证书有效性:
sudo certbot certificates显示证书状态有效且到期时间正确(签发日 +90 天) - 在线检测:使用 SSL Labs(ssllabs.com/ssltest)检测,评分达 A 以上说明配置无误
常见问题
FAQ 1:签发时提示 “Invalid response from http://…/.well-known/acme-challenge/…”?
说明 CA 无法通过 HTTP 访问你的验证文件。依次排查:一是确认域名解析已生效(dig 域名 或 nslookup);二是确认 80 端口放行且未做其他重定向(如强制跳转 HTTPS 会阻断验证,可临时关闭);三是确认 Nginx 站点根目录(root 指令)与实际文件路径一致,且 Certbot 有写入权限。
FAQ 2:证书到期没有自动续期怎么办?
先执行 sudo certbot renew --dry-run 定位问题。常见原因:一是定时器未运行(用 systemctl status certbot.timer 检查);二是续期验证时 80 端口被防火墙拦截;三是域名解析被修改导致验证失败。排查后手动执行 sudo certbot renew 补续期,并确认 systemd timer 处于 active (running) 状态。也可在服务器上配置邮件通知(续期日志写入 /var/log/letsencrypt),及时掌握续期结果。
总结
通过 Certbot 与 Let’s Encrypt 的组合,HTTPS 证书的签发、安装、续期可实现全流程自动化,90 天有效期的证书在 systemd 定时器保障下无需任何人工干预。配合 HSTS 与 TLS 1.2/1.3 配置,网站即可达到当前主流的 HTTPS 安全基线。建议将 certbot renew --dry-run 纳入月度巡检清单,确保自动续期链路长期健康。