1 月 5 日凌晨,还在打排位的人突然发现登不进去了。

《英雄联盟》国服在没有任何公告的情况下进了维护,客户端弹的是「会话出现意外错误」,有人甚至看到「账号不存在」。这一停就是大约 10 个小时,相关话题冲上热搜,社区里一度传出「游戏要停服」的说法。官方先说是「临时停机维护」,没给开服时间,直到当天 15 点左右才恢复。

一个很反常的旁证

最先被人注意到的是一个挺土的现象:把电脑的系统时间改回 1 月 4 日,就能连上服务器进游戏。

时间往回调一天就能进——这个现象几乎把矛头都指向了同一个东西:服务器的 SSL 证书过期了。证书是证明「你是你」的那张数字凭证,客户端要和服务器建立加密连接,得先验一遍这张证。证书一过期,验证直接失败,连接就建不起来。这次挂的不是某个接口,而是「登录」这条链路从第一跳就断了,所以才会全服一起瘫。

事后多家媒体和玩家社区都把原因指向同一个方向:运维那边没有及时给服务器的 SSL 证书续期。至于网上传得很凶的「官方干脆把证书续到了 2125 年」,后来有媒体去问腾讯客服,客服的原话是「建议不要听信网络谣言」——所以这条当段子看就行,别当事实引用。

为什么一张证书能掀翻一整个业务

不少人对证书的默认印象是「配好一次就不用管」,但它其实是个会到期的东西,而且到期那天是硬失效:不看服务器扛不扛得住、不看你是不是在做活动,到点就失效。

类似的事并不只这一次。就在《英雄联盟》出事前后,罗技的 Options+ 也栽在签名证书过期上——macOS 上一大批罗技鼠标直接失灵,因为用来给程序签名的那张证书过期了,系统不再信任这个程序。

而且这种事只会变得更频繁。CA/Browser 论坛已经把证书的最长有效期从原来的 398 天一路往下压,按计划要压到 47 天(2029 年落地)。有效期越短,意味着续期这件事从「一年想起来一次」变成「每个月都得有人管」,「过期」的概率自然水涨船高。

这类事故真正暴露的,是监控的盲区

证书过期本身不复杂,难的是「有人知道它快过期了」。硬盘、CPU、内存满了会告警,端口不通会告警,可一张证书还剩几天到期,往往没人盯。等出事的时候,报警的不是监控,是用户。

几个不算新鲜的提醒:

  • 把域名、证书、到期时间列成一张清单,谁负责、什么时候续,写清楚;
  • 到期前自动告警,别只靠日历提醒某一个人;
  • 能用 ACME 自动续期就上自动续期,把「记得续」变成「不用记得」;
  • 续完别只看命令返回成功,回读一下线上实际生效的那张证书和有效期。

证书这一环我们自己也不是没栽过跟头——之前给站点申请证书时就被一个 curl: undefined symbol 卡了大半天(那次是两个 libcurl 在抢位置)。跟这次同一个道理:都是把一件「配好就不管」的东西,重新当成一个会失效的东西来对待。

顺带一提,同类「一行配置写错、整台服务掉」的事故我们也复盘过(磁盘挂载掉了,最后查到是一行 fstab 写错了盘名)。运维里真正难防的,从来不是难的问题,是那些被默认「不会变」的东西。

事后媒体对那次停服的复盘,基本都绕回了同一句话:证书不是设一次就完事的。

SSL.png