HTTP加载失败(kCFStreamErrorDomainSSL,-9813)在cordova应用程序

我使用Cordova 3.2和jquery mobile 1.3创build了一个iOS应用程序。 我使用jQuery的Ajax发送请求到RESTfull服务来检索/更新信息。

我有许多testing设备,各种iPhone,各种不同的iOS版本。 在运行iOS 7的iPhone 4S上,当发送任何ajax请求时,我收到以下错误:

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) 

这只会发生在这个设备上,在另一个iPhone 4S,也运行iOS 7,它工作得很好,因为它在我使用的所有其他testing设备上。

我读过,这表明证书是无效的,在这种情况下,这可以忽略,为什么会影响一个设备?

任何人都可以build议为什么这可能会发生,什么可能是不同的设备,将阻止它只能在我的设备之一工作。 谢谢

如果它在某些设备上工作,而不是在其他设备上工作,则这些设备的证书validation参数会有所不同。 这里有一些事情要看:

  1. 快乐的设备是否有一些不愉快的设备没有的根证书? 特别是如果他们运行不同的iOS版本,他们也可能有不同的可信证书列表。 尝试去设置>常规>关于和比较“信任存储”在最底部的数字。 在这里看到更多信息。
  2. 在过去的某个时间,您是否在手机上手动接受了一些中级证书(用于签署此证书)?
  3. 不愉快的设备上的date/时间是否错误? 如果它设置在证书到期date之后或证书颁发date之前的时间,它将拒绝它。 我一直在用这个脚射我自己!

如果您在不愉快的设备上的浏览器中访问您的端点URL,它会给您带来什么样的错误? (注意:显然你的服务器也会给你一些错误,因为你没有用正确的头文件和params来请求,但是我正在谈论Safari本身 – 它应该给出一个更详细的信息,错误的证书。)

*编辑纠正我误解的东西:如果您在Safari中访问URL,则无法select接受叶证书,如果您尝试直接加载,则只能select接受中间证书。

我有一个类似的问题,但在我的情况下,所有这些曾经发生的设备,只有在与https的ajax呼叫。

如果这是你的情况,在appDelegate.m文件的末尾添加下面的代码将缓解你的问题。

 @implementation NSURLRequest(DataController) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host { return YES; } @end 

但是我怀疑,如果在其他设备上工作,我提供的解决scheme可能不会有效。 但是请试一试。

Swift版Markivs的答案 (从这里取):

 extension NSURLRequest { static func allowsAnyHTTPSCertificateForHost(host: String) -> Bool { return true } } 

Xcode 7.3 Swift 2.2

要做到这一点,我必须做3件事情:

  1. 我不得不把Chris的答案添加到AppDelegate.swift的底部
  2. 然后修改Info.plist使用这个答案https://stackoverflow.com/a/32701693
    • 您可以在Apple Developer获得更多信息
  3. 确保您为服务器设置了一个域名,而不是一个IP地址

在模拟器中运行应用程序时遇到了同样的问题,原因是模拟器中没有可信任的证书。

只需将您的.cer文件拖放到正在运行的Simulator窗口中。 您将看到Safari闪烁,然后显示证书(或证书颁发机构)的导入对话框…