手机响的时候是 2 点 11 分,告警短信比用户电话早了四分钟。屏幕上就一行:某客户站 TLS handshake 失败。
现场
爬起来开笔记本,ssh 上去第一件事看证书:
openssl s_client -connect 域名:443 2>/dev/null | openssl x509 -noout -dates
有效期到 2 点 07 分。刚过四分钟。
浏览器那边已经全红了,客户群里有两条消息,都是值班的运营发的,问是不是被黑了。我们回了一句「证书到期,在处理」,先把话接住。
续期邮件去哪了
证书是两年前装的,当时填的续期通知邮箱是那位同事的,人早离职了,邮箱还在但没人看。续期提醒一共发过 3 次,30 天、7 天、1 天,全躺在那儿。
这事跟 2017 年那次几乎一模一样,只是那次我们还没把收件人写进配置文件。
换证书那 20 分钟
新证书其实早就签好了,在另一个同事的下载目录里,只是没人装。scp 传上去,拼证书链,重启。
踩了两个小坑。一是证书链顺序,站点证书在前、中间证书在后,拼反了安卓机又报不受信任,改过来才好。二是 reload 之后用 curl 测还是旧证书,以为是配置没生效,其实是长连接还占着,等了 30 秒再测就对了。
全部弄完 2 点 31 分。
后来
第二天做了三件事。所有在跑的证书导进一张表,字段就四个:域名、到期日、存放路径、负责人。写了个脚本每天跑一次,到期前 30 天、7 天、1 天各发一次告警,收件人从配置文件读一个组别名,不写具体人名,人员变动改一处就行。
还有一条:证书文件统一放 /etc/ssl/站点域名/ 下面,别留在个人目录。那次如果证书在下载目录里找不着,20 分钟就不止 20 分钟了。
那年年底我们把这张表接到了每月的运维检查单上。不为别的,凌晨两点爬起来这件事,一次就够了。

