最尴尬的线上事故:证书过期
某天早上用户打开网站,浏览器红字警告「连接不安全」。查了一圈,不是被黑,是 SSL 证书悄悄过期了。尤其免费证书只有 90 天有效期,靠人工记日子迟早翻车。正确解法是:用 Let’s Encrypt 免费证书 + 自动化续期,从此忘掉它。
一、Let’s Encrypt 与 certbot 是什么
- Let’s Encrypt:免费、自动、开放的 CA,证书有效期 90 天。
- certbot:官方客户端,申请、部署、续期一条龙。
部署验证有两种方式:webroot(往网站目录放验证文件)和 standalone(临时起 80 端口)。生产推荐 webroot,不中断服务。
二、certbot 手动申请(通用方式)
# 安装(以 Ubuntu 为例)
sudo apt update && sudo apt install certbot
# 用 webroot 方式申请(需站点已能访问 80 端口)
sudo certbot certonly --webroot \
-w /www/wwwroot/fsdata.site \
-d fsdata.site -d www.fsdata.site
# 证书产出位置
# /etc/letsencrypt/live/fsdata.site/fullchain.pem
# /etc/letsencrypt/live/fsdata.site/privkey.pem
然后在 Nginx 里指向这两个文件即可启用 HTTPS。
三、宝塔面板用户:更省事
宝塔已内置 Let’s Encrypt 对接:
- 宝塔 → 网站 → 你的站点 → SSL
- 选 Let’s Encrypt → 勾选域名 → 点「申请」
- 勾选「强制 HTTPS」和「自动续期」
宝塔会自动用定时任务续期,基本不用管。但建议仍确认续期任务在跑(见下)。
四、自动化续期:核心一步
certbot 安装时会注册一个 systemd timer 或 cron,每天检查、到期前 30 天自动续。手动验证:
# 模拟续期(不真改证书,只测试流程)
sudo certbot renew --dry-run
# 看续期定时任务
systemctl list-timers | grep certbot
# 或
cat /etc/cron.d/certbot
只要 --dry-run 通过,真实续期就没问题。Nginx 需在续期后重载:certbot 的 deploy hook 或宝塔的 post-renewal 脚本里加 nginx -s reload。
五、常见坑
- 80 端口被占导致验证失败:webroot 方式要求 80 端口能访问验证路径,确认防火墙/其他服务没拦。
- 续期后 Nginx 没重载:证书更新了但站点还在用旧证书,需配置 reload hook。
- 泛域名证书:
*.example.com必须用 DNS 验证(--manual --preferred-challenges dns或对应插件),较复杂。 - 频率限制:同一域名证书申请有周限额,测试多用
--staging预发环境。
六、检查清单
- 证书已申请且在
/etc/letsencrypt/live/下 - Nginx 已配置 fullchain + privkey 并 reload
- certbot renew 定时任务存在(systemd timer / cron)
certbot renew --dry-run通过- 续期后自动 reload Nginx 已配置
小结
HTTPS 不是「配一次就完事」,而是「配一次、自动续、常检查」。Let’s Encrypt 把成本降到零,certbot/宝塔把续期自动化,你只需要在部署时顺手确认续期任务和 reload hook 到位。做到这几步,证书过期导致的红屏噩梦就和你无关了。




