上半年开始开发公司新产品 iOS 版的时候,遇到一个奇怪的问题,每次 NSURLSession 发起请求后都要延迟 7 秒左右才能连接上服务器,在客户端甚至抓包跟踪都找不出原因。但这种现象又会在一段时间后自动消失,然后又会在另一个设备上再次出现。之后就把怀疑对象转向了服务端的配置,但做了各种尝试后也依然没有头绪。
直到昨天因为试图解决另一个问题时,首科发了一小段 nginx 的配置给我,其中有一个 ssl_trusted_certificate 配置引起我好奇,去 google 搜了一下相关内容,从而了解到 OCSP。今天顺藤摸瓜继续研究,在一篇文章中查到 LetsEncrypt 提供的(旧的) OCSP 接口被 GFW 封了,所以身在国内的服务器无法连接而导致 ssl_stapling 无法开启,进而使得客户端会试图去连接 OCSP 以验证证书有效性——当然,也会无法连接而失败,可能在 iOS 设备上就是 6-7 秒左右的超时。
这样解释,一切就都说得通了。现有的解决办法,除了 hosts 中将被墙了的“ocsp.int-x3.letsencrypt.org” 域名作正确的 IP 解析——感觉不是很靠谱,如果官方 IP 地址变化了就又会问题重现。更好的办法就是重新申请 LetsEncrypt 新的证书(不是 renew)替代老证书。
近年做客户端开发比较多,这类问题如果不是有什么契机,真的是很难摸到头绪。幸好困扰了大半年后,在产品即将发布前夕,找到了原因,并且彻底解决了。
|