我正在构建一个使用REST API与Firebase对话的简单iOS应用。
基本上,我使用NSURLSession.sharedSession().dataTaskWithRequest
连接到
该应用程序在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。
感谢您的帮助。
答案 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体验:)