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

标签 ios http https app-transport-security

据我所知,2017 年 Apple 将拒绝所有在 Info.plist 中启用了 Allow Arbitrary Loads 的应用:

ATS settings

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

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

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

最佳答案

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

很遗憾,在 iOS 9 中本地网络资源被 ATS 阻塞的问题没有很好的解决方案。据我所知,您有 2 个选择。

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

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

编辑:

所以看起来 Apple 在 iOS 10 中使用了一些自定义行为来让 iOS 10 上的应用程序更加安全,同时允许在 iOS 9 中向后兼容。如果你同时包含 NSAllowsArbitraryLoadsNSAllowsLocalNetworking 在您的 info.plist 中,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

关于ios - 2017年,关于ATS设置,我们应该如何处理没有HTTPS的局域网请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101931/

相关文章:

ios - 以编程方式从另一个应用程序打开一个应用程序

asp.net - 读取 HttpRequest.InputStream 后,第一个请求因 HTTP 400(错误请求)而失败

ios - 应用程序在 iOS 13 上崩溃,因为从 -traitCollection 返回 nil,这是不允许的

ios - 我的 url 不返回 nil,而是快速返回空字符串

java - Crawler4j 身份验证不起作用

http - 如何通过 Julia HTTP 访问 API

ssl - Python 'requests' [SSL : CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:590)

ssl - OpenShift + Istio 中的 mTLS(客户端证书)

java - 为什么 Post 方法不在 HTTPS/SSL 上的 Tomcat7 中加密 header

ios - 如何在屏幕上显示几秒钟的消息?