HTTPS 已成为现代网站的标配,浏览器会对无 SSL 的 HTTP 网站显示「不安全」警告,影响访客信任感。Let's Encrypt 提供完全免费的 DV 证书,配合 Certbot 工具可以在几分钟内完成安装与自动续期。本文以搬瓦工 VPS + Nginx 为例,完整演示整个流程。

本文要点

  • Certbot 的安装方式(Snap 与 apt 两种)
  • 为已有 Nginx 站点一键签发 SSL 证书
  • 自动续期机制与手动触发测试
  • 证书相关文件的位置与含义
  • 签发失败的常见原因与排查

签发证书的前提条件

Let's Encrypt 通过 HTTP-01 挑战验证你对域名的控制权,需要满足以下条件:

  • 域名已通过 A 记录解析到 VPS 公网 IP
  • VPS 上 Nginx 已正常运行,80 端口对外可访问
  • 防火墙已放行 80 和 443 端口

先确认 80 端口可访问

签发前请用浏览器访问 http://你的域名 确认返回页面(哪怕是默认 Nginx 页也行),否则 Let's Encrypt 服务器无法完成验证,签发会失败。

安装 Certbot

方法一:通过 Snap 安装(推荐,保持最新版)

# Debian/Ubuntu
apt update && apt install -y snapd
snap install core && snap refresh core
snap install --classic certbot
ln -sf /snap/bin/certbot /usr/bin/certbot

方法二:通过 apt 直接安装

# Debian/Ubuntu
apt update && apt install -y certbot python3-certbot-nginx

# CentOS/AlmaLinux/Rocky(EPEL 源)
dnf install -y epel-release
dnf install -y certbot python3-certbot-nginx

签发证书

使用 --nginx 插件,Certbot 会自动读取 Nginx 配置、完成验证并修改配置加入 SSL:

certbot --nginx -d example.com -d www.example.com

# 按提示输入邮箱(用于到期提醒),同意协议
# 完成后 Certbot 会自动修改 Nginx 配置并 reload

签发成功标志

命令末尾出现 Congratulations! Your certificate and chain have been saved at ... 字样,说明证书已签发并配置完毕,立即可用 HTTPS 访问。

证书文件在哪里

文件路径用途
证书链/etc/letsencrypt/live/域名/fullchain.pemNginx ssl_certificate
私钥/etc/letsencrypt/live/域名/privkey.pemNginx ssl_certificate_key
证书本身/etc/letsencrypt/live/域名/cert.pem单独证书(一般不单独用)

自动续期

Let's Encrypt 证书有效期 90 天,Certbot 安装时会自动创建 systemd timer 或 cron 定时任务,每天检查并在到期前 30 天自动续期。验证自动续期是否正常:

# 查看 systemd timer 状态(Debian/Ubuntu)
systemctl status snap.certbot.renew.timer

# 模拟续期(不会真实修改证书)
certbot renew --dry-run

# 查看当前证书到期时间
certbot certificates

续期后需 reload Nginx

Certbot 续期后默认会执行 reload,通常无需手动操作。若发现续期成功但 Nginx 仍用旧证书,可检查 /etc/letsencrypt/renewal/域名.conf 里的 deploy hook 配置。

签发失败的常见原因

错误提示关键词可能原因解决方法
Connection refused / Timeout80 端口未开放或防火墙拦截检查防火墙规则,确认 80 可访问
DNS problem域名 A 记录未指向本机 IP确认解析已生效(dig @8.8.8.8 域名 A)
Too many certificates同一域名签发过多等待 7 天重置,或用 --force-renewal
Nginx config errorNginx 配置有误导致验证路由失败nginx -t 检查配置

小结

  • Certbot + Nginx 插件,一条命令完成签发与配置
  • 签发前确认 80 端口可访问、域名已正确解析
  • 自动续期已内置,用 --dry-run 测试是否正常
  • 证书 fullchain.pem + privkey.pem 是 Nginx 需要的两个文件

常见问题

证书 90 天到期后会自动续吗?

会。Certbot 安装时会创建定时任务,每天检查到期时间,到期前 30 天自动续期。用 certbot renew --dry-run 可测试自动续期流程是否正常。

一张证书能覆盖多个域名吗?

可以,用多个 -d 参数指定即可,如 certbot --nginx -d a.com -d b.com。Let's Encrypt 单次最多支持 100 个域名。

签发失败提示 too many certificates?

同一个注册域名每周最多签发 5 张证书,超出后需等待 7 天重置窗口,或添加新的子域名到已有证书。

Certbot 会修改我的 Nginx 配置吗?

使用 --nginx 插件时 Certbot 会自动在配置文件里添加 ssl_certificate 等指令并 reload。若不想自动修改,可用 --certonly 只获取证书,再手动写配置。