Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)

Posted

技术标签:

【中文标题】Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)【英文标题】:Xcode 7.3: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 【发布时间】:2016-03-30 05:17:14 【问题描述】:

我的项目在 Xcode 7.3 上运行。

当我只是发出 GET 请求时,我得到了错误作为标题和信息:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

错误信息:

此服务器的证书无效。您可能正在连接到一个伪装成“https://api.domain.com”的>服务器,这可能会使您的机密信息面临风险。

https://api.domain.com:9002

我搜索了解决方案,但没有一个有效。将这些添加到 info.plist

 <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>

或 (我目前的设置)

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>https://api.domain.com:9002</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>

我搜索过:

https://***.com/a/32912578/291240

https://***.com/a/36209583/291240

https://***.com/a/34999957/291240

【问题讨论】:

只发生在 GET 方法或所有请求调用中。 GET 和 POST 一样的错误。 参考this post 可能会有帮助。 【参考方案1】:

您的服务器使用的 SSL 证书无效,或者您的服务器根本不是 https。

请尝试使用 http:// 而不是 https:// 进行连接

PS:我无法在浏览器中打开此链接,https://api.domain.com:9002

但这可能是一个占位符,所以请试试这个。

但除此之外,还有一种方法可以忽略错误:

警告 - 这也会使您的代码容易受到中间人攻击,所以最好是在服务器上修复您的 SSL

将您的 NSURLConnection 委托设置为 self 并添加以下代码

    - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
  return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];


- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
  if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
    if ([trustedHosts containsObject:challenge.protectionSpace.host])
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

  [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];

对于 NSURLSESSION 检查这个答案,NSURLSession Delegate


更新

以上代码容易受到中间人攻击,

请检查此SSL Pinning for NSURLSession,以获得安全的方式。

【讨论】:

谢谢。这是https。但是ssl无效。我想逃离他们。但是您的方法似乎适用于 NSURLConnection,这对 ios 6 及更高版本有好处,我想使用 NSURLSession,对此有何帮助? 谢谢!有用!但另一个问题是,这只是为了开发,如果你提交,Apple会拒绝它吗? 是的,他们可能会。请检查此安全方法。 jonflanders.com/?p=1415。还更新了我的答案。

以上是关于Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7.3 中的设备状态无效

编辑 XIB 时 XCode 7.3 崩溃

在 Xcode 7.3 中使用 Cocoapods

Xcode 7.3 上传到 iTunesConnect(TestFlight 构建)失败

关于解决Xcode更新7.3之后插件不能用的问题

Xcode 7.3 添加和配置pch文件?