我们有一个通过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,但是我们看到这不是这里的情况 什么可以导致这种现象的想法?或者我们如何解决这个问题?
感谢。
答案 0 :(得分:0)
目前为此应用配置的ATS设置如何?具体来说,您对NSExceptionMinimumTLSVersion
和NSExceptionRequiresForwardSecrecy
使用了什么价值?将NSExceptionMinimumTLSVersion
设置为TLSv1.2将强制iOS客户端仅使用TLS 1.2连接,但不确定这是否真的可以解决您的问题。将NSExceptionRequiresForwardSecrecy
设置为NO应该会打开更多可以被iOS接受的密码套件。
我相信iOS 11 sdk TLS实施中仍然存在漏洞,这些漏洞可能会导致我们无法控制的间歇性TLS握手失败。您现在最好的选择是至少重试一次或两次这些连接错误,然后在遇到SSL / TLS连接错误时完全失败并继续调查根本原因,因为它可能是您的某个服务器上安装的无效SSL证书或加载平衡器。也可能是服务器端提供TLS配置的无效/缺失密码套件,iOS不支持。