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

Mar*_*cus 42 ssl https ios swift

我正在尝试将我的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()
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试访问sinatra网站时,我没有遇到任何麻烦,甚至可以使用正确的命令将JSON打印到控制台.但是,当我将URL设置到我的Rails网站时,我收到以下错误.

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

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

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

Ant*_*ine 42

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

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

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

-

更新:根据一些评论,上述解决方案不再有效.这是一个更新的解决方案.

  1. 转到您的Info.plist文件.
  2. 添加一行Type DictionaryKey App Transport Security Settings.
  3. 在此词典中,添加一行Type Boolean,Key Allow Arbitrary LoadsValue YES

-

否则你可以设置Domain Exceptions.这是怎么做的:

  1. 转到您的Info.plist文件.
  2. 添加一行Type DictionaryKey App Transport Security Settings.
  3. 添加一行Type DictionaryKey Exception Domains.
  4. 添加一行Type DictionaryKey The domain.
  5. 添加的两排 Boolean关键 NSExceptionAllowsInsecureHTTPLoadsNSIncludesSubdomains具有的价值YES.

链接

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

2015 WWDC会议711

iOS 9 HTTP连接错误 - StackOverflow

  • 这似乎在iOS模拟器中不起作用.你有它在模拟器中工作吗? (4认同)
  • 不仅仅是https,还必须是TLS 1.2. (3认同)

Bri*_*ian 20

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

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

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

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

  • 我的服务器使用的是_real_证书(而不是自签名),我仍然得到这个问题... (4认同)

小智 6

这是唯一适用于我的解决方案...在AppDelegate.m文件的末尾,插入代码:

@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Run Code Online (Sandbox Code Playgroud)

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