iOS 9上的NSURLSession/NSURLConnection HTTP加载失败

Tar*_*riq 136 ios afnetworking nsurlsession ios9 tls1.2

试图在iOS9上运行我现有的应用程序但在使用时出现故障AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.
Run Code Online (Sandbox Code Playgroud)

获取以下日志:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)
Run Code Online (Sandbox Code Playgroud)

更新: 我已为我的解决方案添加了多个更新: iOS 9上的NSURLSession/NSURLConnection HTTP加载失败

Tar*_*riq 240

找到解决方案

在iOS9中,ATS在网络呼叫期间实施最佳实践,包括使用HTTPS.

来自Apple文档:

ATS可防止意外泄露,提供安全的默认行为,并且易于采用.无论您是创建新应用程序还是更新现有应用程序,都应尽快采用ATS.如果您正在开发新应用,则应该专门使用HTTPS.如果您有现有应用,则应尽可能多地使用HTTPS,并创建一个计划,以便尽快迁移其余应用.

在beta 1中,目前无法在info.plist中定义此内容.解决方案是手动添加它:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Update1:这是一个临时解决方法,直到您准备好采用iOS9 ATS支持.

更新2:有关详细信息,请参阅以下链接:http: //ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3:如果您尝试连接到只有TLS 1.0的主机(YOURHOST.COM)

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

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

  • 请注意,您完全摆脱了应用程序传输安全性,因此一个主要的iOS 9功能刚刚从您的应用程序中消失.这是一个黑客,如果那个黑客会让你的ap被拒绝我也不会感到惊讶.更有可能允许将特定网站添加到此词典中. (10认同)
  • @ gnasher729,我理解它更好地支持TLS 1.2,而不仅仅是禁用ATS.但是,如果您依赖第三方API/Web服务,您可以做些什么.我不能强迫他们升级,所以我该怎么办? (8认同)
  • **请拜托,拜托,拜托,请** - 不要只是在你的plist上添加例外,继续"因为它有效".考虑用户数据的安全性并实施SSL和其他安全最佳实践. (7认同)
  • 这个答案中有一个微妙的错误:`NSTemporaryExceptionMinimumTLSVersion`必须是例如_TLSv1.0_而不是_1.0_,请参阅NSAppTransportSecurity [Exception domains词典键](https://developer.apple.com/library/prerelease/ios/documentation /General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW44) (7认同)
  • @StevenPeterson您只能逐个案例获取Apple逐个排除的整个应用程序。我认为,如果Apple祝福您的应用具有此功能,他们会指示您包括此密钥。期望苹果很少这样做。 (2认同)

Elo*_*han 54

如何在iOS9中处理SSL,一个解决方案是这样做:

正如苹果所说: 在此输入图像描述 在此输入图像描述

在此输入图像描述

除非您在应用的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>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</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,如果他们还没有这样做的话.这应该被视为临时解决方法.

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

有关更多信息,请转到iOS9AdaptationTips

  • SSL和TLS是HTTPS协议使用的不同加密层.因此,应该完全禁用SSL并使用TLS v1.2或更高版本.有关更多信息,我建议从以下资源开始:[SSL/TLS Security 2015 - 简化快速指南](http://versprite.com/og/ssl-tls-security-2015-a-simplified-quick-指南/) (4认同)
  • 我只在下面的示例中添加了运气,您将NSAllowsArbitraryLoads设置为true。我的服务器仅使用TLS v1.2,我仍然必须这样做才能使其正常工作。非常沮丧。 (2认同)

Ben*_*ger 40

Apple的应用程序传输安全技术支持非常方便 ; 它帮助我们找到了更安全的解决方案.

希望这会帮助别人.我们在连接到看似完全有效的Amazon S3 URL时遇到问题,TLSv12 HTTPS URL.事实证明,我们必须禁用NSExceptionRequiresForwardSecrecy以启用S3使用的另一些密码.

在我们的Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)


Dav*_*des 7

如果您在使用Amazon S3时出现此问题,请尝试将其粘贴到您的info.plist上作为顶级代码的直接子代

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置找到更多信息

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue

  • 上帝保佑你兄弟 (2认同)

Ash*_*iya 5

我从这里找到了解决方案 它为我工作。

对此进行检查,可能会对您有所帮助。

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