在Xcode 9.2中禁用App Transport Security?

时间:2017-12-06 19:01:50

标签: ios ssl app-transport-security xcode9.2

我无法在Xcode 9.2中禁用App Transport Security(ATS)。我一直(多年来)在针对我的本地服务器环境运行构建时禁用ATS,如下所示:

Transport security has blocked a cleartext HTTP

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

在Xcode 9.2中,一个简单的请求(在http模式下针对本地Rails应用程序运行):

let session = URLSession(configuration: .default)
let url = URL(string: "http://store.dev/api/products.json")!

let task = session.dataTask(with: url) { data, response, error in
    print(data)
    print(response)
    print(error)
}

task.resume()

失败并显示错误消息

  

错误域= NSURLErrorDomain代码= -1200&#34;发生SSL错误,无法建立与服务器的安全连接。&#34; UserInfo = {_ kCFStreamErrorCodeKey = -9802,NSLocalizedRecoverySuggestion =您是否还要连接到服务器?,NSUnderlyingError = 0x60c00024afb0 {错误域= kCFErrorDomainCFNetwork代码= -1200&#34;(null)&#34; UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0,_kCFNetworkCFStreamSSLErrorOriginalValue = -9802,_kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9802}},NSLocalizedDescription =发生SSL错误,无法建立与服务器的安全连接。,NSErrorFailingURLKey = https://store.dev/api/products.json, NSErrorFailingURLStringKey = https://store.dev/api/products.json,_ kCFStreamErrorDomainKey = 3}

这个完全相同的请求(同样的项目)在Xcode 9.1上取得了成功。

在这两种情况下,我都是针对iOS 11.1部署目标构建的。您可以看到Xcode正在将URL从http更改为https,这是我不想要的。

以下是在Xcode 9.1中有效但在9.2(https://github.com/chrismanderson/ats-sample)中失败的超级基础项目的链接。

我还尝试仅针对本地store.dev域禁用ATS,同样,它适用于Xcode 9.1但不适用于9.2。

2 个答案:

答案 0 :(得分:7)

我最初并没有将它整合在一起,但我认为正在发生的事情是,在iOS 11中,Apple支持HSTS。我认为支持HSTS预加载列表,最近与Google结合adding the .dev TLD to the HSTS preload list,可能会导致iOS试图强制您使用https,这是失败的(我错过了您尝试使用.dev本地域名用于测试,这实际上是关键元素)。

我认为您唯一的解决方案是将本地测试域更改为.dev域以外的域。如果你这样做,你应该能够连接,并且它不会试图强迫你在你的本地开发环境中使用https。

简而言之,Google已获得.dev顶级域名的权利,并且最近将其添加到HSTS预加载列表中,以强制与.dev域名进行的所有通信都是安全的。在支持HSTS预加载列表的设备上,这会导致所有流量通过HTTPS重定向,这将导致不支持HTTPS的服务器出错。

答案 1 :(得分:0)

在XCode屏幕左侧的导航器上,单击主项目文件,其中存储了所有文件和文件夹。单击“信息”选项卡。在&#34;自定义iOS目标属性&#34;下,您曾看到更改应用传输安全设置(ATS)的选项。它没有明确说明,但仍然可用。

当您将鼠标悬停在选项上时,您应该在一个小圆圈中看到+。点击它。 XCode将提示您创建一个&#34;应用程序类别&#34;。在出现的列表中,向上滚动并选择&#34;应用传输安全设置&#34;。

单击该选项。一旦创建它,​​它应该提示您更改BOOL值(默认值应为&#34; NO&#34;)。在最右边,你应该看到一组向上和向下箭头。单击此按钮将BOOL更改为yes。