iOS 9 ATS和Firebase REST

时间:2015-07-10 15:58:08

标签: https firebase ios9

我正在构建一个使用REST API与Firebase对话的简单iOS应用。

基本上,我使用NSURLSession.sharedSession().dataTaskWithRequest连接到

  

https://myusername.firebaseio.com/Object.json

该应用程序在iOS 8中运行良好。我能够通过GET / PUT / PATCH / DELETE来操作我的数据。但是由于iOS 9引入了ATS,我现在有了https错误:

  

NSURLSession / NSURLConnection HTTP加载失败

     

(kCFStreamErrorDomainSSL,CFNetwork SSLHandshake失败)

我完全了解Info.plist中的解决方法。但是,我想在iOS 9中使用新的安全功能。

我检查了Firebase连接安全性(通过点击Chrome的绿色锁定按钮),它似乎与Apple的ATS要求兼容。

我的错误是因为我使用NSURLSession的方式吗?或者是因为Firebase安全设置?

PS:我测试https://firebase.com并且NSURLSession连接了精细的w / o错误。我的应用程序也很简单,我不需要auth。

感谢您的帮助。

1 个答案:

答案 0 :(得分:15)

TL; DR:它与Firebase服务器允许的SSL密码有关(ATS只需要开箱即用的ECDHE)。

如上所述,Info.plist中的解决方法是添加以下内容:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>firebaseio.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>

ATS docs中,Apple仅允许开箱即用:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

在Info.plist中将NSThirdPartyExceptionRequiresForwardSecrecy标记设置为NO会添加以下附加标记:

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA

我不同意他们将旗帜命名为“...... ExceptionRequiresForwardSecrecy”,因为从技术上讲DHE提供了完美的前向保密,它比同等的ECDHE版本慢。对我来说听起来应该有两个标志,一个是提前保密的例外,另一个只是说你握手时感觉很舒服。

从技术上讲,你也可以制作例外域<your-firebase-app>.firebaseio.com而没有NSIncludesSubdomains标志,但我想让它足够通用。

由于我们允许使用非ECDHE密码,因此Firebase必须禁止服务器端才能开箱即用(除非开发人员想要开始使用比NSURLRequest更低级别的内容,请参阅this SO post了解更多信息有关配置SSL密码的信息,但您将花费更多时间,而不是向Info.plist添加几行。

安全方面,我们提供相同版本的相同密码,只是不使用Elliptic Curves版本(它提供了不错的性能改进,但排除了某些浏览器[特别是移动浏览器])。关于DHE vs ECDHE的更多信息(以及其他一些不错的SSL背景,w.r.t Forward Secrecy是here)。

对于它的价值,实时客户端没有这个问题,所以我强烈建议使用它们来获得更好的Firebase体验:)