问题分析

近期系统出现了部分 IOS 进入 H5 页面很慢的情况,而 Android 进入却正常。

在排除调程序和网络的问题后,最终把问题定位到 SSL 证书上。要想了解整个问题所在,需要从 TLS 协议开始说起

TLS 握手流程如下图所示

问题就出在客户验证证书这里,这里验证证书是通过 在线证书状态协议(OCSP),进行验证的。OCSP 验证原理也比较简单,就是拿证书信息到证书颁发机构的 OCSP 服务器做校验。

由于我们使用的是国外机构颁发的证书,因此验证证书的服务器也在国外,由于国内网络环境受限的因素,验证服务器无法访问,从而导致整个网站的访问卡在了证书校验这一步,无法正常的完成 TLS 握手。

找到了原因解决的方法也就迎刃而解了,我们把站点证书换成了国内机构颁发的,成功的解决了问题。

问题验证

在苹果官网找到了如下说明,佐证了上述猜想

对 TLS 证书信任状态的评估依照既定的行业标准(如 RFC 5280 所列)执行,且整合了新出现的标准,如 RFC 6962(证书透明度)。在 iOS 11 或更高版本以及 macOS 10.13 或更高版本中,Apple 设备会随撤销及受限证书的当前列表来进行定期更新。该列表由 Apple 信任的每个内建根证书颁发机构及其从属的 CA 签发者所发布的证书撤销清单 (CRL) 聚合而成,列表还可能根据 Apple 的要求酌情包括其他限制。每当使用网络 API 函数进行安全连接时都会使用此信息。如果需要单独列出的 CA 撤销证书太多,信任评估可能需要在线证书状态响应 (OCSP),否则将无法通过信任评估。

其他一些症状

症状1

IOS 有的进入速度很快,有的进入很慢

出现上述问题的原因是:验证服务器一般都是通过 CDN 分发的,有可能部分 IP 未被限制

症状2

IOS 进入慢的用户,更换网络环境可以更快的进入。

运营商的限制策略不同,导致更换网络提供商后有可能解决问题。

一些疑问

问题出现的时候 Android 并未收到影响,一直进入速度都很快,如果说验证证书的服务器出现问题,为什么 Android 不受影响呢?

经过研究发现 Android 没有问题的原因是,Google不满意ocsp这个解决方案,所以所有 google 的产品,无论是 android 还是 chrome 都不进行 ocsp 检查。

ocsp 作用是检查证书状态,尤其是是否吊销,Google 认为检查证书状态并不能增加安全性,并且导致 https 请求时间变长,并且 ocsp 服务器本身也可能会出问题,这不是一个可靠的方案。Google 通过分发一个列表到本地来解决证书检查问题。当然有人提出争议说分发列表这个过程会因为升级服务器被屏蔽而失效,Google 认为如果能屏蔽我们的升级服务器,那么屏蔽 ocsp 服务器岂不是更容易?所以从 2012 年开始,Google 就逐步取消了 ocsp 检查。

进一步优化(OCSP Stapling)

OCSP Stapling 是通过服务器验证证书状态并缓存验证信息的方式来做证书校验,这样一来客户端就省去了调用 OCSP 验证服务器的请求使页面的访问更加的快速高效。

参考文献

TLS 安全性 - Apple 支持 (中国)