记一次由阿里云更新SSL证书而引发的一系列惨案
记一次由阿里云更新SSL证书而引发的一系列惨案
1、业务背景
现有某家博会项目,在一个风和日丽的白天,突然收到了阿里云的短信:证书快到期了。好吧,说干就干,准备按照之前的一贯流程进行操作(创建 -> 申请 -> 下载 -> 上传替换...)。诶等等,正当域名申请完准备下载时,无意间发现,这里有个“部署”按钮:

好厉害的样子,点进去看看(省略 N 步):

哦嚯嚯,貌似可以直接上传到 ECS 啊,不用再自己下载,再上传到服务器替换,阿里牛逼!经过一番骚操作,很快完工了,浏览器访问的小绿锁也是最新时间了,我天真的以为事情就此结束了。
2、问题现象
隔了一周左右,又是一个无意间,发现线上已稳定运行一年的小程序突然打不开了(首页一片空白),且只有手机上打不开,微信 PC 端还是可以正常打开的。
3、排查过程
我心想这玩意也没人动过,难不成微信又升级搞出什么幺蛾子了?连忙打开了微信开发工具,在工具里面跑了一下,发现还是正常的,what fu... 然后又用真机调试,发现问题复现了:

接着根据错误文件及行数去看了一眼,发现有一个 reject 没有定义就调用了(应该是我们的前端童鞋复制方法的时候忘了删了):

终于让我逮到你了小兔崽子,果断把这行删除,我又自信满满的编译后重试,发现又特么一个别的错误:

毁灭吧,爷累了!又经过了一番度娘,不是,谷勾,已确定这是由于 Android 11 已对文件系统改版的锅,导致真机调试无法访问权限外的文件。解决方案:切换成真机调试 1.0 即可。
再次重试,心想这次总该可以了吧……日内瓦退钱,发现还是不行,连接口都没有请求,看来上两个问题都与故事主线无关啊。又仔细的研究了一番 JS 代码,只有请求失败才会走 fail 回调,干脆把回调的信息打出来看看,不看不知道,一看也没吓一跳:
{
"errno": 600001,
"errMsg": "request:fail -2:net::ERR_FAILED"
}又谷勾了一番,突然发现这个回答:
https://blog.csdn.net/qq_35593448/article/details/123501978
哦法克,HTTPS 证书映入眼帘,回头看了眼微信后台错误统计:8 月 23 开始的,再看看我更新证书的时间,时间赶得是不是有点巧?不过话说回来,中间证书是什么鬼?excuse me?一年前我也没有配什么中间证书啊。又利用网站(https://csr.chinassl.net/ssl-checker.html)检测了一下:

看来是证书的问题实锤了,准备按照手工的方式下载上传替换再来一遍,诶,不如直接看看下载的内容和阿里云上传的内容有没有什么不同吧。
卧槽,阿里云上传的是这样的:
-----BEGIN CERTIFICATE-----
···
-----END CERTIFICATE-----而自己下载的是这样的:
-----BEGIN CERTIFICATE-----
···
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
···
-----END CERTIFICATE-----日内瓦退钱,还带这样挖坑的啊,我还纳闷呢为什么手动下载需要选是 Apache 还是 Nginx,而直接部署却没有……至此,该案算是侦破了,目前死者情绪稳定。
4、定位原因
直接原因是由于阿里云部署的证书内容不完整导致的,根本原因是自己偷懒。
5、解决方案
重新下载证书替换掉,问题即解决。
6、总结经验
- 注意观察细节,如果及时发现巧合,或许思路会尽早的指向真相。
- 排查问题的过程中一定要耐心,保护案发现场。
- 禁止偷懒。

