iOS11中使用的TLS和kCFStreamErrorCodeKey = -9800

时间:2017-12-06 07:48:30

标签: ios ssl ios11

我们有一个通过SSL连接到我们的Web服务器的应用程序。 大部分时间它工作正常,但有时应用程序发送的一些请求(我们使用URLSession加载请求)失败(在URLSession:task:didCompleteWithError :)中出现以下错误:

  

错误域= SyncCPConnectionErrorDomain代码= 12“(null)”   UserInfo = {ErrorMessageKey =错误域= NSURLErrorDomain代码= -1200   “发生了SSL错误,并与服务器建立了安全连接   无法制作。“UserInfo = { _kCFStreamErrorCodeKey = -9800 ,   NSLocalizedRecoverySuggestion =您想要连接到服务器吗?   呢?

我们开始调试问题(使用tcp dump)并看到以下内容:

有时候应用程序(在操作系统级别,我猜,因为我们无法对此进行控制)在SSL握手TLS 1.0中提供了最小和最大SSL版本,并且握手成功完成。

在其他连接中,应用程序提供TLS 1.0作为最低版本,TLS 1.2作为最高版本。然后,握手在版本TLS 1.2中成功结束。

我们看到有时在TLS 1.0中执行完全握手,而在TLS 1.2中执行恢复握手。

由于校验和算法在不同版本之间存在差异,因此客户端可能会感到困惑,或者至少不同意服务器的校验和定义。然后客户端(应用程序)关闭与“非法参数”致命警报的连接。我们假设此时我们在其中一个应用程序连接上收到-9800 SSL错误。

我们的服务器配置为更喜欢TLS 1.2,但它也支持旧的TLS版本(1.0)。

首先,我们在应用程序中配置了 App Transport Security (ATS): NSAllowsArbitraryLoads = true

我们删除了它并认为它会强制应用程序始终使用TLS 1.2,但它没有帮助。 我们知道Apple声称在iOS11中,应用程序应该只适用于TLS 1.2,但是我们看到这不是这里的情况 什么可以导致这种现象的想法?或者我们如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:0)

目前为此应用配置的ATS设置如何?具体来说,您对NSExceptionMinimumTLSVersionNSExceptionRequiresForwardSecrecy使用了什么价值?将NSExceptionMinimumTLSVersion设置为TLSv1.2将强制iOS客户端仅使用TLS 1.2连接,但不确定这是否真的可以解决您的问题。将NSExceptionRequiresForwardSecrecy设置为NO应该会打开更多可以被iOS接受的密码套件。

我相信iOS 11 sdk TLS实施中仍然存在漏洞,这些漏洞可能会导致我们无法控制的间歇性TLS握手失败。您现在最好的选择是至少重试一次或两次这些连接错误,然后在遇到SSL / TLS连接错误时完全失败并继续调查根本原因,因为它可能是您的某个服务器上安装的无效SSL证书或加载平衡器。也可能是服务器端提供TLS配置的无效/缺失密码套件,iOS不支持。