- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们有一个应用程序通过 SSL 连接到我们的 Web 服务器。大多数时候它工作正常,但有时应用程序(我们使用 URLSession 加载请求)发送到服务器的一些请求失败(在 URLSession:task:didCompleteWithError:) 并出现以下错误:
Error Domain=SyncCPConnectionErrorDomain Code=12 "(null)" UserInfo={ErrorMessageKey=Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9800, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?
我们开始调试问题(使用 tcp 转储)并看到以下内容:
有时,应用程序(我猜是在操作系统级别,因为我们对此无法控制)在 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,但我们看到这里并非如此有什么想法会导致这种现象吗?或者我们如何解决这个问题?
谢谢。
最佳答案
您目前如何为此应用配置 ATS 设置?具体来说,您为 NSExceptionMinimumTLSVersion
和 NSExceptionRequiresForwardSecrecy
使用什么值?将 NSExceptionMinimumTLSVersion
设置为 TLSv1.2 将强制 iOS 客户端仅使用 TLS 1.2 连接,但不确定这是否真的能解决您的问题。将 NSExceptionRequiresForwardSecrecy
设置为 NO 应该会打开更多 iOS 可接受的密码套件。
我相信 iOS 11 sdk TLS 实现中仍然存在错误,这些错误可能导致我们可能无法控制的间歇性 TLS 握手失败。您现在最好的选择是在遇到 SSL/TLS 连接错误时在完全失败之前至少重试一次或两次这些连接错误,并继续调查根本原因,因为它可能是安装在您的其中一台服务器或负载上的无效 SSL 证书平衡器。对于在 iOS 不支持的服务器端提供的 TLS 配置,也可能是无效/缺少密码套件。
关于ios - iOS11 中使用的 TLS 和 kCFStreamErrorCodeKey=-9800,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669298/
我们有一个应用程序通过 SSL 连接到我们的 Web 服务器。大多数时候它工作正常,但有时应用程序(我们使用 URLSession 加载请求)发送到服务器的一些请求失败(在 URLSession:ta
我是一名优秀的程序员,十分优秀!