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

时间:2015-06-11 21:01:16

标签: ios swift ssl https

我正在尝试将我的iOS应用程序连接到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)

另外,我可以告诉我的localhost Rails应用程序(在另一台机器上)没有从iOS应用程序中删除,但是从浏览器和curl命令中进行了ping操作。

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

7 个答案:

答案 0 :(得分:42)

如果我理解得很好,Apple现在希望开发人员使用HTTPS和TLS 1.2进行网络呼叫。

临时,您可以在“Info.plist”文件中添加:

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

只需查看此链接,它也可以为您提供帮助:http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

-

更新:根据一些评论,上述解决方案已不再适用。这是一个更新的解决方案。

  1. 转到Info.plist文件。
  2. 添加一行类型 Dictionary App Transport Security Settings
  3. 在此词典中,添加一行类型 Boolean Allow Arbitrary Loads { {1}}
  4. <强> -

    否则您可以设置YES。这是怎么做的:

    1. 转到Domain Exceptions文件。
    2. 添加一行类型 Info.plist Dictionary
    3. 添加一行类型 App Transport Security Settings Dictionary
    4. 添加一行类型 Exception Domains Dictionary
    5. 添加两行 Type The domain Key Boolean&amp; NSExceptionAllowsInsecureHTTPLoads NSIncludesSubdomains
    6. <强>链接

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

      2015 WWDC Session 711

      iOS 9 HTTP Connection Error - StackOverflow

答案 1 :(得分:19)

这是一个信任问题。使用自签名证书时,SSL的身份验证组件不起作用。它仍然可以建立一个安全的连接,以便没有人在窃听,但应用程序无法确定谁在该行的另一端。

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

要将证书放到设备(或模拟器)上,我将文件放在我的Web服务器上。然后只需通过普通HTTP在Safari中打开它。应该打开“设置”应用,询问您是否要信任该证书。

当然,假设这只是用于开发,并且您的生产系统具有由知名权威机构签署的证书(即OS和根证书颁发机构数据库中包含的证书)。因为要求最终用户安装自签名证书不会飞。

答案 2 :(得分:6)

这是唯一适用于我的解决方案...在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/

答案 3 :(得分:1)

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

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

摘自:Apple Documentation - Appendix A: Common Server Trust Evaluation Errors

NSOSStatusErrorDomain errSSLNoRootCert -9813

答案 4 :(得分:1)

尝试更改会话变量,此更改可以帮助我

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

答案 5 :(得分:0)

修改info.plist也适用于我。

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

答案 6 :(得分:-4)

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

在plist文件中添加一个新行。enter image description here