2015-07-10 64 views
7

我正在构建一个使用REST API与Firebase进行对话的简单iOS应用程序。iOS 9 ATS和Firebase REST

从本质上讲,我使用NSURLSession.sharedSession().dataTaskWithRequest连接到

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

该应用程序在iOS版8.正常工作,我能够通过GET/PUT/PATCH/DELETE操作我的数据。但由于iOS的9中引入的ATS,我现在有HTTPS错误:

NSURLSession/NSURLConnection HTTP load failed

(kCFStreamErrorDomainSSL, CFNetwork SSLHandshake failed)

我深知在Info.plist的变通办法解决的。但是,我想利用iOS 9中的新安全功能。

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

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

PS:我测试了https://firebase.com和NSURLSession连接没有错误。我的应用程序也很简单,我不需要授权。

谢谢你的帮助。

+0

很难猜测的iOS是不满从错误。如果您找到了挖掘更多详细错误信息的方法,请发送电子邮件至[email protected],我们可以看看我们是否可以确定iOS不喜欢我们的SSL配置。 –

+0

谢谢。我将复制错误消息和电子邮件支持。 – User5103156

回答

13

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,苹果只允许以下开箱:

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 

设置NSThirdPartyExceptionRequiresForwardSecrecy国旗NO Info.plist中增加了以下额外的:

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密码,火力地堡将不得不禁止其服务器端的这开箱工作(除非开发商想先从较低层次的东西比的NSURLRequest乱搞,看到this SO post关于配置的详细信息SSL密码,但是你会花费更多的时间来做这件事,而不是增加几行Info.plist)。安全方面,我们提供相同版本的相同密码,只是不使用椭圆曲线版本(提供不错的性能改进,但排除某些浏览器[特别是移动浏览器])。有关DHE vs ECDHE的更多信息(以及其他一些不错的SSL背景w.r.t Forward Secrecy是here)。

对于它的价值,实时客户端不存在这个问题,所以我会强烈建议使用那些美好火力地堡体验:)

+2

感谢您的意见。我切换到了Firebase SDK。只是想提及XCode 7默认情况下将ENABLE_BITCODE设置为yes,并且会在Firebase SDK中引发错误。将其设置为NO将清除消息。当新的SDK出来时,你有没有时间框架? – User5103156

+0

@ User5103156我们会调查ENABLE_BITCODE以及我们是否可以将其设置在火力地堡SDK。感谢您的领导! –

+0

这解决了我的问题。万分感谢! –