网站运维

SSL 证书过期:为什么你的站每年都要挂一次,怎么让它永不过期

客户打开你的网站,浏览器弹出全屏红色警告:「您的连接不是私密连接」「攻击者可能会试图窃取您的信息」。

对一个陌生访客来说,这个警告等于在说「这个网站有病毒」。外贸站尤其致命——海外客户对这类警告的敏感度比国内高得多,看到直接关掉,不会点「高级 → 继续访问」。

而最常见的原因,荒唐得让人无奈:免费证书三个月过期了,没人续。

一、为什么会过期

Let’s Encrypt 的免费证书有效期是 90 天。这不是它抠门,是它故意的——短有效期倒逼自动化,也降低证书被滥用的风险。

问题在于,很多人的证书是手动申请、手动部署的。三个月一到,到期,网站报错。然后慌慌张张去续,下次又忘。

常见翻车场景:

  • 宝塔面板自动续期任务没生效(最常见)
  • 证书换了,但 nginx 配置里还指向旧证书路径
  • 站点用了 CDN,只续了源站忘了 CDN,或反过来
  • 域名换了解析,验证方式(HTTP-01)失效,自动续期失败
  • 服务器上残留了旧的定时任务,和新任务打架

二、先诊断:你的证书现在什么状态

命令行看

echo | openssl s_client -connect 你的域名.com:443 -servername 你的域名.com 2>/dev/null | openssl x509 -noout -dates -subject

输出会显示 notBefore(生效日)和 notAfter(到期日)。

在线查(推荐,能查出配置问题)

用 SSL Labs(ssllabs.com/ssltest)跑一次完整检测。它不只查过期,还能查出:

  • 证书链不完整(安卓机型上会报错,电脑上却正常)
  • 是否支持老设备/老浏览器
  • 有没有不安全的协议还开着

三、宝塔面板:正确配置自动续期

宝塔的 Let’s Encrypt 是自带自动续期的,但它会静默失败。装完必须做下面这些检查。

1. 确认续期任务存在

面板 → 计划任务,看有没有一条「续签SSL证书」的任务,周期一般是每月或每 30 天。

没有就手动加一条:任务类型选「续签SSL证书」,执行周期选「每月」。

2. 验证方式:DNS 验证比文件验证靠谱

如果你的站点有任何一层反代(CDN、反向代理、负载均衡),文件验证(HTTP-01)大概率会失败——因为 Let’s Encrypt 的验证请求被挡在外面了。

这种情况改用 DNS 验证(DNS-01):面板里选 DNS 验证,填你的域名服务商 API(阿里云、腾讯云、Cloudflare 都支持),它会自动加 TXT 记录完成验证。

配一次,以后永久自动。

3. 续期后要重载 Web 服务

证书文件更新了,但 nginx 还读着内存里的旧证书——这是很多人「续期成功了但网站还是报错」的原因。

宝塔的续期任务一般会自动 reload。如果你是自己写的脚本,记得加:

nginx -s reload
# 或
/etc/init.d/nginx reload

四、CDN 是最大的坑

如果你的站用了 Cloudflare、又拍、阿里云 CDN,有两套证书:

  • CDN 到用户这一段(边缘证书)
  • CDN 到你的源服务器这一段(源站证书)

两边都要有效,缺一个都打不开。

Cloudflare 的情况

Cloudflare 的边缘证书是自动管理的,你不用管。但源站证书要你自己维护。建议直接用 Cloudflare 的 Origin CA 证书——有效期可以设 15 年,一次部署管很久。

另外注意 Cloudflare 的 SSL 模式:

  • Flexible(灵活):用户到 CF 是加密的,CF 到源站是明文。源站没证书也能访问,但数据是明文传输的,且容易造成重定向死循环
  • Full(完全):全程加密,源站需要有证书(自签名也行)
  • Full (strict)(严格):源站必须是有效证书 —— 推荐用这个

国内 CDN

阿里云、腾讯云 CDN 的证书需要在控制台单独上传。到期不会自动续(除非你配了自动同步)。建议设个日历提醒,或者直接把证书有效期设长一点。

五、让它彻底不用管:三层保险

第一层:自动续期(解决 95% 的情况)

前面配好的自动任务。

第二层:到期监控(防止自动续期悄悄失败)

自动续期不是 100% 可靠——域名解析改了、API 密钥过期了、面板出问题了,都会失败而且不会通知你。

所以必须有监控。免费方案:

  • UptimeRobot:免费版可以监控 HTTPS 证书到期,提前 30 天发邮件
  • Better Uptime / HetrixTools:也有免费额度
  • 自己写个脚本:每周检查一次到期时间,小于 14 天就推送到企业微信/钉钉

自己写的话,核心命令:

echo | openssl s_client -connect 域名:443 -servername 域名 2>/dev/null |
openssl x509 -noout -checkend 1209600   # 检查 14 天内是否过期,返回非0即告警

第三层:用长有效期证书(可选)

如果你不想折腾自动化,还有个笨办法:买一年期的付费证书。最便宜的 DV 证书一年几十块(国内云厂商经常有免费一年期 DV 证书)。

缺点是每年还是要手动换一次。但至少频率从「三个月」降到「一年」,忘的概率小很多。

如果是 Cloudflare 用户,Origin CA 证书能签 15 年,这个最省事。

六、证书过期之后怎么补救

已经挂了的话:

  1. 立刻重新申请证书(面板里点「申请」或「续签」)
  2. 确认 nginx 配置指向新证书路径
  3. nginx -t 检查配置,然后 nginx -s reload
  4. 如果用 CDN,同步更新 CDN 上的证书
  5. 清 CDN 缓存
  6. 用无痕窗口 + 手机 4G 各访问一次确认

一般 10 分钟内能恢复。真正损失的是这段时间的访客和信任,不是技术难度。

最后

SSL 证书过期是所有网站故障里最不值得发生的一种——它完全可预测、完全可自动化,损失却很大(尤其对正在投放广告的站)。

花 15 分钟配好自动续期 + 到期监控,这件事就从你的待办清单里永久消失了。

顺手提醒:域名本身也会过期,而且过期后果比证书严重得多(网站直接解析不到)。域名建议开启自动续费,并确保绑定的邮箱和手机号是你能收到的——很多域名过期是因为续费通知发到了废弃邮箱。