Let's Encrypt证书 iOS 慢

2,041 阅读2分钟

我一直使用 acmetool 来给域名进行签证, 这个工具确实方便配好后只要一条命令就可以搞定签证

acmetool want test.huabot.com

正常情况下是没有问题的。

我们有一个应用叫 小螃蟹(AppStore 可以搜这个名字下载),经常会出现网络请求很慢的情况。

我们在 nginx 输出的日志添加内部请求处理时间。

    log_format upstreaminfo
        '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" "$http_user_agent" '
        '$request_length $request_time [] [] $upstream_addr '
        '$upstream_response_length $upstream_response_time $upstream_status -'

通过日志我们知道服务器处理了 小螃蟹应用 首页请求总共 80 ms 左右。

但是小螃蟹应用上却等待了很久,超过了 5 s

这种情况只有在 iOS 上出现,用一段时间后又恢复正常。

我们怀疑是 DNS 解析的问题,把路由器的DNS 改为 114.114.114.114, 并没有解决问题。

我们猜测是应用性能的问题,经过分析 iOS CPU 使用率很低,性能不是问题。

我们 DEBUG iOS HTTP 请求库,发现 https 请求会停顿很久,而 http 马上就完成。

我们猜测可能证书有问题,然后在阿里云上买了个免费的证书,应用的速度恢复正常。

经过几周的运行测试,访问速度基本恢复正常,由此可以断定 acmetool 生成的证书iOS上有问题。

具体原因如下:

最近大陆用户反应Let's Encrypt证书的网站在苹果系统打开很慢,Safari,IOS SSL引起的超过20秒左右的延时。

经过验证,主要原因为LE证书的吊销状态检查域名(ocsp.int-x3.letsencrypt.org以及相关CName或Alias)在大陆受到劫持引起。苹果系统的浏览器打开SSL网站时将对证书的状态进行验证,当在验证证书状态时,请求了被劫持的Let's Encrypt证书状态检查(OCSP)的服务器,而该服务器为不可使用状态或有很长延时,从而导致打开网站延时。

由于证书状态检查由苹果的浏览器(UIWebView, WKWebView、Safari)发起,而Chrome在访问SSL网站时并不进行这一项检查,所以大部分用户在Chrome中访问正常,只有在苹果系统中访问出现延时。

参考:easy.zhetao.com/easy-https-…