HTTPS 证书自动化管理实战:Certbot 配置与自动续期

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 配置是否完全生效:

  1. 浏览器访问:访问 https://www.example.com,地址栏显示锁形图标,无证书告警
  2. 证书有效性sudo certbot certificates 显示证书状态有效且到期时间正确(签发日 +90 天)
  3. 在线检测:使用 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 纳入月度巡检清单,确保自动续期链路长期健康。