Cordova应用程序中的HTTP加载失败(kCFStreamErrorDomainSSL,-9813)

时间:2014-01-09 16:21:38

标签: jquery ios iphone xcode cordova

我使用Cordova 3.2和jquery mobile 1.3创建了一个iOS应用程序。我使用jquery ajax将请求发送到RESTfull服务以检索/更新信息。

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

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

这只发生在这台设备上,在另一台运行iOS 7的iPhone 4S上,它完全正常,就像我正在使用的所有其他测试设备一样。

我已经读过,这表明证书在某种程度上是无效的,在这种情况下,这可以被忽略,为什么会影响到一台设备?

任何人都可以建议为什么会发生这种情况以及可能会阻止它仅在我的某个设备上工作的设备有什么不同。感谢

5 个答案:

答案 0 :(得分:33)

我有一个类似的问题,但在我的情况下,所有设备都曾经发生这种情况,并且仅在使用https的ajax调用期间发生。

如果是这种情况,在appDelegate.m文件末尾添加以下代码可以缓解您的问题。

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

但我怀疑如果它在其他设备上工作,我给出的解决方案可能没有效果。但是试一试。

答案 1 :(得分:12)

如果它在某些设备而不是其他设备上运行,那么这些设备的证书验证参数会有所不同。以下是一些要注意的事项:

  1. 快乐的设备是否有一些根本证书,不满意的设备没有?特别是如果它们运行不同的iOS版本,它们也可能具有不同的可信证书列表。尝试转到设置>一般>关于并比较最底层的“Trust Store”的数字。查看更多信息here
  2. 您是否在过去的某个时间点在快乐的设备上手动接受了一些中间证书(用于签署此证书)?*
  3. 不愉快的设备上的日期/时间是否错误?如果将其设置为证书到期日期之后或证书颁发日期之前的时间,它将拒绝它。我总是用这个拍摄自己的脚!
  4. 如果您在不愉快的设备上的浏览器中访问您的终端URL,它会给您带来什么错误? (注意:显然你的服务器也会给你一些错误,因为你没有请求正确的标题和参数。我在谈论Safari本身 - 它应该提供一个更详细的信息,关于它(它认为)是什么证书有问题。)

    *编辑纠正我错误记录的内容:如果你转到Safari中的URL,你可以选择接受叶子证书,如果你尝试,你只能选择接受中间证书直接加载它们。

答案 2 :(得分:2)

Swift版Markivs answer(摘自here):

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

答案 3 :(得分:2)

Xcode 7.3 Swift 2.2

要实现这一点,我必须做三件事:

  1. 在课程结束后,我必须将Chris的答案^添加到AppDelegate.swift的底部
  2. 然后使用此答案https://stackoverflow.com/a/32701693修改Info.plist
  3. 确保为服务器设置域名而不是IP地址

答案 4 :(得分:1)

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

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