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

时间:2016-03-30 05:17:15

标签: ios xcode

我的项目在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>

OR (我目前的设定)

<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://stackoverflow.com/a/32912578/291240

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

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

1 个答案:

答案 0 :(得分:1)

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

请尝试使用http://而不是https://

进行连接

PS:我无法在浏览器https://api.domain.com:9002

中打开此链接

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

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

警告 - 这也会使您的代码容易受到MitM攻击,因此最好是在服务器上修复您的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];
}

FOR NSURLSESSION查看此答案,NSURLSession Delegate

<强>更新

以上代码容易受到MitM攻击,

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