NSURLSession“HTTP加载失败kCFStreamErrorDomainSSL,-9813;自签名证书

我试图将我的iOS应用程序连接到当前在我的networking中的本地主机上运行的HTTPS Rails应用程序。 我可以从我的浏览器使用https://myIP:3000/display以及命令行中的curl请求访问该站点。 我试图从我的应用程序访问它使用:

 class FirstViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //let url = NSURL(string: "https://another/Sinatra/website/feed") let url = NSURL(string: "https://myIP:3000/display") let request = NSURLRequest(URL: url!) let task = NSURLSession.sharedSession().dataTaskWithURL(url!) task!.resume() } 

当我尝试访问sinatra网站时,我没有任何问题,甚至可以用正确的命令将JSON打印到控制台。 但是,当我设置url到我的Rails网站,我得到以下错误。

NSURLSession / NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)

另外,我可以告诉我的本地主机Rails应用程序(在另一台机器上)不是从iOS应用程序ping通的,而是从浏览器和curl命令ping通的。

任何想法如何解决这一问题?

如果我理解的很好,苹果现在希望开发者使用HTTPS和TLS 1.2进行networking通话。

临时的 ,你可以在你的“Info.plist”文件中join:

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

只要看看这个链接,它也可以帮助你: http : //ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

更新 :以下一些评论上述解决scheme不再工作。 这是一个更新的解决scheme。

  1. 转到您的Info.plist文件。
  2. 添加一行“ types Dictionary和“ 关键 App Transport Security Settings
  3. 在此字典中,添加一行Boolean Allow Arbitrary Loads YES

否则,您可以设置Domain Exceptions 。 这是怎么做的:

  1. 转到您的Info.plist文件。
  2. 添加一行“ types Dictionary和“ 关键 App Transport Security Settings
  3. 添加一行Type DictionaryKey Exception Domains
  4. 添加一行“ types Dictionary和“ 关键字 The domain
  5. 添加两行Boolean typesNSExceptionAllowsInsecureHTTPLoadsNSIncludesSubdomainsYES

链接

https://forums.developer.apple.com/message/5857#5857

2015年WWDC会议711

iOS 9 HTTP连接错误 – StackOverflow

这是一个信任问题。 使用自签名证书,SSL的身份validation组件不起作用。 仍然有可能build立一个安全的连接,以防止任何人窃听,但是应用程序无法确定谁在线的另一端。

我有一个类似的设置,并通过将我自签名的根CA添加到iPad可信证书来解决此问题。 这个根CA被用来签署我所有的其他开发证书。 然后,我只需要在使用SSL的任何地方添加这个单根证书。 如果您只是直接使用自签名证书,则可以添加该证书。

要将证书放到设备(或模拟器)上,我把文件放在我的networking服务器上。 然后只需在简单的HTTP中在Safari中打开它。 Settings应用程序应该打开并询问您是否要信任该证书。

当然,这是假定这仅仅是为了开发,而且你的生产系统有一个由知名权威机构签名的证书(即一个包含在操作系统根证书机构数据库中的证书)。 因为要求最终用户安装您的自签名证书不会飞。

(编辑 – 我误解为9814,过期证书。我不知道如何解决这个问题,但希望我的回应有助于指向正确的方向。)

看起来像一个不同于通常的“允许任意负载”问题的证书问题。

摘要摘自: Apple文档 – 附录A:通用服务器信任评估错误

NSOSStatusErrorDomain errSSLNoRootCert -9813

尝试改变会话variables,这个改变帮助我

 let config = URLSessionConfiguration.default let session = URLSession(configuration: config) 

这是我唯一的解决scheme…在AppDelegate.m文件的末尾插入代码:

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

感谢jc ivancevich文章http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/

修改info.plist也适用于我。

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

NSURLSession / NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9813)

在您的plist文件中添加一个新行。 在这里输入图像说明