iOS9 中的应用传输安全和 IP 地址

Posted

技术标签:

【中文标题】iOS9 中的应用传输安全和 IP 地址【英文标题】:App Transport Security and IP addresses in iOS9 【发布时间】:2015-09-03 10:00:15 【问题描述】:

我使用在我的开发盒上运行的本地服务器开发我的 ios 应用程序。在设备上进行测试时,我通过 IP 地址直接连接,该地址通过 HTTP 而不是 HTTPS(因此在开发过程中我不必处理自签名证书,无论如何设备都不喜欢)。

我认为这就足够了:

但是,如果不添加 NSAllowsArbitraryLoads = YES,也就是这样:

现在,我必须记住在滚动生产构建时删除它,而不是在开发过程中...arg。 NSExceptionDomains 是否应该与 IP 地址一起使用,如果不是,如果不启用 NSAllowsArbitraryLoads,我还能做些什么吗?

【问题讨论】:

【参考方案1】:

如果您的目标是 iOS 10+,只需设置 NSAllowsLocalNetworking 标志。

【讨论】:

【参考方案2】:

正如@PanxShaz 所说,您不能输入硬编码的 IP 地址,但您可以使用一种简单的解决方法:

    使用sudo 打开您的/etc/hosts 文件并为您的IP 地址添加一个新的本地域名。示例:

    192.168.99.100 docker-host.localhost

    然后刷新你的 DNS:

    dscacheutil -flushcache

    最后在您的应用传输安全异常中使用这个新的本地域。

【讨论】:

如果没有越狱,这在 iOS 上是不可能的。 @Avi 是的,这是可能的,因为这实际上是在你的 mac 上完成的。此处的目的是在开发时提供一种解决方法。 除非你的 iOS 设备使用你的 mac 作为 DNS,否则它不会工作。也许在模拟器上。【参考方案3】:

如果不启用NSAllowsArbitraryLoads,我还能做些什么吗?

一种解决方法是使用xip.io,如this Apple Developer Forums thread 中的QJeffR 所述(由his comment 中的David L 分享):

对(例如)10.0.1.8.xip.io 的 DNS 调用将解析为 10.0.1.8,从而允许使用域而不是 NSExceptionDomains 键的 IP 地址。

【讨论】:

这适用于那些需要(出于各种原因)连接到 IP 地址而不是域名或连接到 LAN IP 地址的用户。这也适用于 LAN 地址,但 iOS 必须有 Internet 连接才能访问 xip.io 服务。然后,您只需要在应用传输安全设置中允许“xip.io”和子域。 这不只是通过未知的 xip.io 服务器路由所有不安全的流量吗? DNS 调用不会路由流量,它们只是将域名与 IP 地址“映射”。【参考方案4】:

硬编码的 IP 地址在 iOS9 中不起作用。我也面临同样的问题。 尝试了可用解决方案的所有排列和组合。 最后,必须使用正确的域名。

所以,不。在 iOS9 中,您无法摆脱硬编码的 IP 地址。

【讨论】:

我遇到了这个链接:forums.developer.apple.com/thread/6205,关于允许 LAN 上的 IP 地址。很遗憾,目前没有解决方案,但已提交功能请求。 有没有人找到官方文档说明这一点?这是 Apple 的错误,还是有意为之? 这仅用于安全目的。 Apple 在 WWDC-2015 internetsociety.org/deploy360/blog/2015/06/… 中提到了这一点 IP 地址无法按照文档的规定工作,developer.apple.com/library/prerelease/ios/documentation/… 表 2 这个答案不正确。如果您禁用 ATS,与 IP 地址的连接就可以正常工作。

以上是关于iOS9 中的应用传输安全和 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

iOS9适配

换了IP地址,原来的SSL证书是否还能使用?

无法加载资源,因为应用传输安全策略需要使用安全连接

友盟分享适配iOS9

强制执行 iOS 应用程序传输安全性

网编复习