CFNetwork SSLHandshake iOS 9失败

use*_*837 207 ssl nsurlconnection ios ios9

有iOS 9 beta 1的人有这个问题吗?

我使用标准NSURLConnection连接到web服务,一旦调用webservice我就得到以下错误.这目前在iOS 8.3中有效

可能的beta bug?任何想法或想法都会很棒!我知道它在iOS 9开发的早期阶段

这是完整的错误:

CFNetwork SSLHandshake失败(-9824)NSURLSession/NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9824)

 NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mywebserviceurl"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                                  returningResponse:&response
                                                              error:&error];
Run Code Online (Sandbox Code Playgroud)

Ste*_*son 310

除非您在应用的Info.plist文件中指定例外域,否则iOS 9和OSX 10.11需要TLSv1.2 SSL用于您计划从中请求数据的所有主机.

Info.plist配置的语法如下所示:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序(例如第三方Web浏览器)需要连接到任意主机,您可以像这样配置它:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

如果您不得不这样做,最好更新您的服务器以使用TLSv1.2和SSL,如果他们还没有这样做的话.这应该被视为临时解决方法.

截至今天,预发布文档没有以任何特定方式提及任何这些配置选项.一旦完成,我将更新答案以链接到相关文档.

  • 很抱歉长时间聊天,但我想出来我需要禁用<key> NSTemporaryExceptionRequiresForwardSecrecy </ key> <false /> (27认同)
  • @StevenPeterson嘿steve我似乎无法让例外域示例工作,你有任何想法的机会,我只是复制并粘贴到.plist更改TLSv1.1到TLSv1.0和域到我们的域没有https: //等 (2认同)
  • @RashmiRanjanmallick NSTemporaryExceptionMinimumTLSVersion用于告诉ATS您正在使用非1.2服务器.例如,如果您尝试连接到使用TLS 1.0的主机,请使用此选项.您还必须将NSTemporaryExceptionRequiresForwardSecrecy设置为false,如上面指出的user3099837. (2认同)
  • http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ - 这是答案来源的博客. (2认同)

Wom*_*ble 65

在iOS 10+中,TLS字符串必须是"TLSv1.0"形式.它不能只是"1.0".(叹)


其他Answers的以下组合有效.

假设您正在尝试连接到仅具有TLS 1.0的主机(YOUR_HOST.COM).

将这些添加到您应用的Info.plist中

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_HOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

  • 似乎添加"NSTemporaryExceptionRequiresForwardSecrecy"为我做了诀窍,谢谢! (9认同)
  • 这个版本在iOS9.1上对我不起作用 - 我需要在其他一个答案中使用TLSVersion字符串格式<key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string> (2认同)

onm*_*133 33

有关详细信息,请参阅iOS 9和OSX 10.11中的App Transport Security Exceptions

奇怪的是,您会注意到连接尝试将http协议更改为https,以防止您的代码中出现意外错误配置URL的错误.在某些情况下,这可能确实有效,但它也令人困惑.

航运的应用程序使用App交通运输安全介绍了一些很好的调试技巧

ATS失败

大多数ATS故障将作为CFErrors出现,并带有-9800系列中的代码.这些在Security/SecureTransport.h标头中定义

2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
Run Code Online (Sandbox Code Playgroud)

CFNETWORK_DIAGNOSTICS

将环境变量CFNETWORK_DIAGNOSTICS设置为1,以便在控制台上获取有关失败的更多信息

nscurl

该工具将运行几种不同的ATS异常组合,在每个ATS配置下尝试与给定主机的安全连接并报告结果.

nscurl --ats-diagnostics https://example.com
Run Code Online (Sandbox Code Playgroud)