2017年,关于ATS设置,我们应该如何处理没有HTTPS的局域网请求?

In 2017, how should we handle LAN requests without HTTPS in respect to ATS settings?

据我了解,2017 年苹果将拒绝所有在 Info.plist 中启用 Allow Arbitrary Loads 的应用程序:

另请参阅:https://nabla-c0d3.github.io/blog/2016/08/14/ats-enforced-2017/

我们的应用程序正在控制用户家中的智能设备。这就是说,我们不是在与互联网交谈,而只是通过 HTTP 与 LAN 设备交谈。所有这些设备都不支持 HTTPS。我们应该如何配置这些 App Transport Security Settings 而不会让我们的应用程序被 Apple 拒绝?

编辑: Apple has delayed the SSL/ATS requirement to after 1/1/2017

澄清一下,Apple 将拒绝使用 ATS 例外的应用,以禁用 2016 年 12 月 31 日之后提交的应用的 ATS,除非有正当理由说明应用必须使用该例外。我们只是不知道 Apple 会接受什么理由。

所以不幸的是,在iOS 9 中没有很好的解决本地网络资源被ATS 阻塞的问题。据我所知,你有2 个选择。

  1. 继续支持iOS9,并增加全局ATS例外,希望你在12/31/2016之后提交你的app时,苹果能接受你的理由支持 iOS 9 并在禁用 ATS 的情况下访问本地网络资源。在 2017 年 1 月 1 日之前,很难知道 Apple 认为哪些类型的理由是合理的,但 Apple 明确表示将有一个流程来证明应用程序使用 ATS 例外。如果你走这条路,我会尝试在 1 月初对应用程序进行一个小的更新,ATS 异常仍然存在,看看你是否可以通过这个过程。

  2. 放弃对 iOS 9 的支持,删除一揽子 ATS 异常 (NSAllowArbitratyLoads),并使用 NSAllowsLocalNetworking 异常来关闭 ATS 保护仅在本地网络流量。 iOS9 不支持此功能,因此您只需要将新应用设置为 iOS10。基本上,只有 NSAllowsLocalNetworking plist 条目设置为 true 的 iOS9 设备上的本地流量将被 ATS 阻止。根据您的客户群,这可能是可行的。 iOS 9 位用户仍然可以在您的 iOS 10 版本发布之前获得该应用程序的最新版本。

编辑:

所以看起来 Apple 在 iOS 10 中使用了一些自定义行为来允许 iOS 10 上的应用程序更安全,同时允许在 iOS 9 中向后兼容。如果您在 info.plist 中包含 NSAllowsArbitraryLoadsNSAllowsLocalNetworking,iOS9 将只识别 NSAllowsArbitraryLoads 条目,并允许所有流量(来自安全观点,但适用于您的本地网络流量)。在 iOS 10 中,使用 NSAllowsLocalNetworking 将导致 iOS 10 忽略 NSAllowsArbitraryLoads 条目,这意味着您的应用程序将确保对非本地连接强制执行 ATS,但是允许本地连接通过。显然,您应该在 iOS 9 和 10 上测试您的应用程序,但如果您仍然需要支持 iOS 9,那么从安全的角度来看,这将是理想的选择。请务必注意,您仍然需要向 Apple 提供理由,但鉴于 Apple 将此功能用于处理这种情况,我愿意打赌向后兼容性将是一个可接受的理由。

来自 Apple 的 documentation

In iOS 10 and later, and macOS 10.12 and later, the value of this key is ignored if any of the following keys are present in your app’s Info.plist file:

NSAllowsArbitraryLoadsForMedia
NSAllowsArbitraryLoadsInWebContent
NSAllowsLocalNetworking