到期告警响了,隧道却还在转发流量,于是没人能就日期是否重要达成一致。重要,但未必发生在证书上印的那个瞬间。到期证书会阻止新的认证,也会阻止某些实现在长连接内部进行的重新校验。现有隧道是否在午夜断开,取决于协议、客户端以及服务端的重协商设置。请在到期之前安排续期,并用一次全新的登录去验证,而不是用早就建立好的会话。

先确认到底是哪一个证书到期

一次部署里通常有服务端叶子证书、客户端凭据、一个或多个中间证书以及一个信任锚,它们并不会同时到期。要读的是报错里点名的那个证书和它随附的证书链,而不是配置文件目录里的第一个文件。即使服务端叶子证书续得很干净,上层中间证书过期同样会失败。动手之前,先把每个文件的主体、签发者、not-after 和部署位置记下来。

信任锚通常是寿命最长的对象,也最不可能是原因。

为什么活着的会话能撑过到期日

认证发生在连接建立时,而某些协议还会在之后重新检查身份。OpenVPN 会按定时器对数据通道重新协商,因此一次拿着到期证书的重新协商会失败,哪怕隧道已经跑了好几个小时。从不重新校验的实现可以让已建立的会话越过到期日继续工作,这正是「还能用」不能当证据的原因。这两种行为都无法用来做计划。

把到期日当作新登录的截止时间,把会话寿命当作借来的时间。

先查时钟,再怪证书

有效期是拿本地时钟去判定的,所以一台时间不对的设备会把完全正常的证书报成有效期错误。客户端、服务端以及路径上的任何设备都要查。

开机就归零的时钟,能解释为什么故障只在断电之后出现。

通过签发它的机构完成续期

保持身份、预期用途和兼容的密钥配置。如果续期引入了新的签发者或固定证书,客户端需要的是协同的信任更新,而不是换一个服务端文件。签发和分发期间要保护私钥,因为续期并不会吊销已经泄露的旧密钥。重置密码不是续期,工单上怎么写都一样。

新的证书链要完整发布,因为缺少中间证书的叶子只是一半的续期,只在已经缓存过的机器上有效。

用一次新的登录来证明,并留好回滚

部署之后,从有代表性的客户端建立一条新的允许连接,并实际跑一遍应用。确认证书链按客户端预期下发,也确认任何吊销信息都能到达。留一条不依赖信任过期材料的回滚路径,这样你可以在不削弱校验的前提下回到先前的状态。确认替换件验证通过之后,再删掉旧文件。

已有会话仍可能反映更早的状态,所以它两边都证明不了。

当天我会用的顺序

先确认到期的对象和它所在的链,再确认时钟:

  • 是哪个证书到期,它属于哪条链。
  • 每个中间证书是否已部署并已发布。
  • 客户端与服务端时钟是否在合理误差内一致。
  • 从有代表性的客户端能否成功完成一次新登录。
  • 吊销信息是否可达。
  • 是否存在不削弱校验的回滚方案。

然后再续期、部署整条链、用新的登录测试,最后才做清理。有效期以及判定规则定义在 RFC 5280 里,只要监控盯的是真正会到期的对象,这个日期就不会是意外。

相关文章