这个问题成功的吸引了我的注意。
起因:一个Flutter写的app在iOS上偶尔会发生了界面卡顿甚至冻结10多秒,但在Android正常。
开始这个问题没太引起重视,觉得是flutter的问题。但后来随着dart的issue里面报告的人逐渐多起来,看起来不是那么简单。不过非常令人迷惑的是这个现象只在iOS偶尔出现,Android从来不出现,这种不确定性使得重现和调试非常困难。
在issue里面发现报告的人大部分疑似是中国用户,之后发现有人提到更换了阿里云证书之后问题不再重现,这使得我们把问题方向放在https上。最终发现服务器的OCSP Stapling失效,造成了soft failure。之后的行为要看客户端实现,有的浏览器接受soft failure,不进行客户端检查,一切正常。但有一些客户端比如Safari会自己去检查了OCSP状态,从而造成界面无响应。检查nginx log发现ocsp.int-x3.letsencrypt.org请求超时,随后确认此域名遭到了DNS污染。
在服务器开启OCSP Stapling对于提升速度帮助很大。所以无论如何也是应该开启的。
但是仍然有两个问题没有解释:
- 为什么Android没问题,iOS有问题
- 为什么有时候可以重现,有时候不可以重现
为了回答这几个问题,顺便找一个解决方案,我顺着读了一圈代码和协议,从nginx到openssl,从tls到ocsp。最后终于能回答这两个问题了。