iOS 8.4 CFNetwork SSLHandshake 失败 (-9850)

iOS 8.4 CFNetwork SSLHandshake failed (-9850)

我的 ssl 握手代码失败,因为我将 xcode 更新为 6.4(并将模拟器更新为 ios 8.4)。
错误是:CFNetwork SSLHandshake 失败(-9850)

同样的代码在 ios 8.3 模拟器上成功地执行了 ssl 握手(我也尝试了 ios 8.3 模拟器从 xcode 6.4 并且握手很好)。

这是配置并启动握手的代码段。我正在使用 swift.

self.socket.startTLS([kCFStreamSSLLevel:kCFStreamSocketSecurityLevelTLSv1,
        kCFStreamSSLValidatesCertificateChain:kCFBooleanFalse])

我整天都在试图弄清楚这个问题,但我什至无法找出错误代码 -9850 的含义。它没有与 SecureTransport.h 文件中的所有其他代码一起列出。

更新1:

我发现苹果引入了应用程序传输安全性,这意味着您可以声明要建立安全连接的域。无论如何,我尝试使用 ATS 但没有成功。 -9850 错误仍在制造问题。

更新 2 - 解决方案

正如 Michal 和 Steven 在他们的回答中所建议的那样,我开始怀疑主要问题出在服务器端,这最终是真的。
我与实施服务器的人交谈,在他生成长度为 2048 的新 ssl 证书后,所有问题都消失了。在此之前,它们是 512。
使用新证书,我这边的代码工作得很好。

当我收到 CFNetwork SSLHandshake failed -(*) 这是因为我的设备已连接到网络但未连接到互联网。

我认为这与coreTLS有关:

Description: coreTLS accepted short ephemeral Diffie-Hellman (DH) keys, as used in export-strength ephemeral DH cipher suites. This issue, also known as Logjam, allowed an attacker with a privileged network position to downgrade security to 512-bit DH if the server supported an export-strength ephemeral DH cipher suite. The issue was addressed by increasing the default minimum size allowed for DH ephemeral keys to 768 bits.

从你的代码中我可以看出,我猜你正在使用 GCDAsyncSocket。 10个月前更新过,肯定反映不了这个问题

-9850 出现在SecureTransport.h header 埋在iOS 9 SDK:

errSSLWeakPeerEphemeralDHKey = -9850,       /* weak ephemeral dh key  */

听起来 Michal 的方向是对的。对这个问题的更一般的搜索让我找到了 http://www.chromium.org/administrators/err_ssl_weak_server_ephemeral_dh_key:

As of Chrome 45, this error message is triggered if the SSL/TLS handshake attempts to use a public key, smaller than 1024 bits, for ephemeral Diffie-Hellman key agreement.

我并不是说 iOS 9 强加了与 Chrome 完全相同的要求,但我会开始查看服务器配置以及是否可以增加它用于的密钥大小SSL 握手。