【问题标题】:Disable App Transport Security in Xcode 9.2?在 Xcode 9.2 中禁用应用程序传输安全性?
【发布时间】:2018-05-20 18:27:13
【问题描述】:

我无法在 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()

失败并显示错误消息

Error Domain=NSURLErrorDomain Code=-1200 “发生 SSL 错误,无法与服务器建立安全连接。” UserInfo={_kCFStreamErrorCodeKey=-9802, NSLocalizedRecoverySuggestion=您是否仍要连接到服务器?, NSUnderlyingError=0x60c00024afb0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" 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。

【问题讨论】:

  • 它在 11.x 模拟器中似乎无法正常工作。也许现在尝试在 iOS 10 模拟器上运行。不过,这肯定需要为其提交雷达。 forums.developer.apple.com/thread/93298
  • 刚刚看到您使用的是 .dev 域。正在 Twitter 上阅读有关 Google 现在对所有 .dev 流量强制执行 HTTPS 的 HSTS 预加载。有关详细信息,请参阅下面的答案。

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


【解决方案1】:

我最初并没有把它放在一起,但我认为正在发生的事情是,在 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 的服务器上导致错误。

【讨论】:

  • 是的,我认为你完全正确。我们也开始在 Safari 本地获取 HSTS 错误。似乎很多工程师都在打这个。(medium.engineering/use-a-dev-domain-not-anymore-95219778e6fd)
  • 是的,这就是我今天早上通过推特找到的文章。在我重新阅读您的帖子并意识到您在本地环境中使用 .dev 域之前,我最初没有将两者联系起来。很高兴这不是 iOS 11 / Xcode 9 的更广泛问题。
【解决方案2】:

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

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

单击该选项。一旦创建,它应该提示您更改 BOOL 值(默认应为“NO”)。在最右侧,您应该会看到一组向上和向下箭头。单击此按钮将 BOOL 更改为 yes。

【讨论】:

  • 它在哪里。单击信息选项卡。在“自定义 iOS 目标属性”下
猜你喜欢
  • 1970-01-01
  • 2016-04-09
  • 2017-09-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2017-02-28
相关资源
最近更新 更多