【问题标题】:How do I load an HTTP URL with App Transport Security enabled in iOS 9? [duplicate]如何在 iOS 9 中加载启用了 App Transport Security 的 HTTP URL? [复制]
【发布时间】:2015-08-24 06:08:31
【问题描述】:

所以,昨晚发布的 iOS 新 beta SDK 有“App Transport Security”,鼓励开发者使用 https 而不是 http。原则上,这是一个好主意,我已经在我们的暂存/生产环境中使用了 https。但是,当 iOS 应用程序连接到我在笔记本电脑上运行的 Web 服务时,我没有在本地开发环境中设置 https。

从今天早上的一些游戏来看,URL 加载系统似乎会决定使用 https 来代替,即使你给它一个 http URL。有谁知道如何禁用这种行为——即使只是针对特定的 URL?

【问题讨论】:

标签: ios url nsurl ios9 app-transport-security


【解决方案1】:

已关注this

我已经通过在 info.plist 中添加一些键来解决它。 我遵循的步骤是:

  1. 打开了我的项目info.plist 文件

  2. 添加了一个名为 NSAppTransportSecurity 的密钥作为 Dictionary

  3. 添加了一个名为NSAllowsArbitraryLoads 的子键为Boolean,并将其值设置为YES,如下图所示。

清理项目,现在一切都像以前一样运行良好。

参考Link

【讨论】:

  • 这在测试 SSL 证书不可用的应用时帮助了我很多。
  • 这在 2016 年 12 月之后将不再适用于 iOS 10。您的应用不得在 info.plist 中包含这些键,否则您的应用将被应用商店拒绝。
【解决方案2】:

请参阅 Apple 的 Info.plist reference 了解完整详情(感谢 @gnasher729)。

您可以在 Info.plist 中为特定域添加例外:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

每个例外域的所有键都是可选的。演讲者没有详细说明任何键,但我认为它们都相当明显。

(来源:WWDC 2015 session 703, “Privacy and Your App”,30:18)

如果您的应用有充分的理由这样做,您也可以使用单个密钥忽略所有应用传输安全限制:

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

如果您的应用没有充分的理由,您可能会面临被拒绝的风险:

将 NSAllowsArbitraryLoads 设置为 true 将允许它工作,但 Apple 非常清楚,他们打算拒绝无特定原因使用此标志的应用程序。我能想到的使用 NSAllowsArbitraryLoads 的主要原因是用户创建的内容(链接共享、自定义 Web 浏览器等)。在这种情况下,Apple 仍然希望您包含对您控制的 URL 强制执行 ATS 的例外。

如果您确实需要访问不通过 TLS 1.2 提供的特定 URL,则需要为这些域编写特定的例外,而不是使用 NSAllowsArbitraryLoads 设置为 yes。您可以在 NSURLSesssion WWDC 会话中找到更多信息。

请谨慎分享 NSAllowsArbitraryLoads 解决方案。这不是 Apple 推荐的修复方法。

——kcharwood(感谢@marco-tolman)

【讨论】:

  • 请注意,对于大多数这些键,CFNetwork.framework 使用的字符串与会话中显示的字符串不同,在 beta 1 中:NSTemporaryExceptionAllowsInsecureHTTPLoadsNSTemporaryExceptionMinimumTLSVersionNSTemporaryExceptionRequiresForwardSecrecyNSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoadsNSTemporaryThirdPartyExceptionMinimumTLSVersion , NSTemporaryThirdPartyExceptionRequiresForwardSecrecy
  • 有效的是NSIncludesSubdomainsNSTemporaryExceptionAllowsInsecureHTTPLoads&lt;true /&gt;
  • 这个答案中的信息对我不起作用。
  • 这在 2016 年 12 月之后将不再适用于 iOS 10。您的应用不得在 info.plist 中包含这些键,否则您的应用将被应用商店拒绝。
【解决方案3】:

这对我有用:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key><!-- your_remote_server.com / localhost --></key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    <!-- add more domain here -->
    </dict>
</dict>

我只是想添加这个来帮助别人并节省一些时间:

如果您使用的是:CFStreamCreatePairWithSocketToHost。确保您的 host 与您在 .plist 中的相同,或者如果您有单独的套接字域,只需将其添加到那里。

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);

希望这会有所帮助。干杯。 :)

【讨论】:

  • 这是允许异常域而不是向所有人开放的首选方式(即通过使用任意加载为是)。
【解决方案4】:

我已解决为 plist 文件。

  1. 添加一个 NSAppTransportSecurity : 字典。
  2. 将名为“NSAllowsArbitraryLoads”的子项添加为布尔值:是

【讨论】:

  • 这在 2016 年 12 月之后将不再适用于 iOS 10。您的应用不得在 info.plist 中包含这些键,否则您的应用将被应用商店拒绝。
  • 那么我们应该从 ios 10 做什么??
  • 你不能再使用HTTP了。如果您别无选择,请使用答案中的方法,NSExceptionDomains
  • @AbuzarAmin 你在哪里读到过这个?我在我的一个应用程序中使用了相同的方法,并且该应用程序运行良好。在 iOS 10 及更高版本上实现此目的的替代方法是什么?
  • @Suryakant 它是在 WWDC 视频中宣布的。如果您的应用在 App Store 上,那么当您将应用提交到 App Store 进行审核时就会产生问题。
【解决方案5】:

上面的配置对我不起作用。我尝试了很多组合键,这个很好用:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

【讨论】:

  • 这也适用于 Appcelerator 4.0.0.GA 和 xcode7
  • 我正在尝试让我的应用程序将 http 请求发送到位于 localhost:3000 的本地 Rails 服务器......那么我将为域添加什么?我试过“localhost”、“localhost:3000”、localhost:3000 等......有什么想法吗?提前感谢您的帮助!
  • @OOProg localhost:3000
  • @OOProg - 只是普通的旧本地主机对我有用。此外,您需要确保您的请求 url 是http://localhost:3000。没有前面的“http://”的 NSURLSession 数据任务到 localhost:3000 将不起作用。
  • 这在 2016 年 12 月之后将不再适用于 iOS 10。您的应用不得在 info.plist 中包含这些键,否则您的应用将被应用商店拒绝。
【解决方案6】:

如果您只想为本地开发服务器禁用应用程序传输策略,那么以下解决方案可以正常工作。当您无法设置 HTTPS 或设置 HTTPS 不切实际时(例如,在使用 Google App Engine 开发服务器时),它会很有用。

正如其他人所说,绝对不应该为生产应用关闭 ATP。

1) 使用不同的 plist 进行调试

复制您的 Plist 文件和 NSAllowsArbitraryLoads。使用此 Plist 进行调试。

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

2) 排除本地服务器

或者,您可以使用单个 plist 文件并排除特定服务器。但是,it doesn't look like you can exclude IP 4 addresses 因此您可能需要改用服务器名称(可在系统偏好设置 -> 共享中找到,或在本地 DNS 中配置)。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>

【讨论】:

  • 我强烈建议不要使用选项 1,因为它可能会隐藏会在您的生产应用程序中困扰您的问题(例如,如果您使用的是第三方非安全域)。
  • 感谢您的反馈,但就我个人而言,我真的不认为这值得投反对票。我并不是说这是推荐的解决方案。我只是提供一个不同的选择。显然,我建议排除特定域(如果 HTTPS 不可用),但 kcharwood 已经给出了答案。无论如何,我会把它留给你。只是想我会给出我的理由。
  • 明白。这似乎是初学者可能会搜索的问题类型,查看允许任意加载的建议,然后在不考虑任何后果的情况下进行操作。使用允许任意加载任何应用程序版本的解决方案,Apple 可以拒绝该应用程序。对不同的构建配置进行不同的设置可能会导致有人在开发过程中让应用程序正常工作,但存档的构建可能会被破坏。我无法删除我的反对票,但如果您编辑带有选项 1 的一些潜在缺陷的答案,我很乐意取消反对票。
【解决方案7】:

编译@adurdin 和@User 给出的答案

将以下内容添加到您的 info.plist 并将localhost.com 更改为您相应的域名,您也可以添加多个域:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

您的 info.plist 必须如下所示:

【讨论】:

  • “localhost”还是“localhost.com”?
  • localhost 必须可以工作,幸好 localhost.com 也可以工作,没有注意到谢谢,但请尝试 localhost
  • 这在 2016 年 12 月之后将不再适用于 iOS 10。您的应用不得在 info.plist 中包含这些键,否则您的应用将被应用商店拒绝。
  • 真的,请分享链接?
  • 看起来值是错误的,在大多数其他答案中,至少 AllowsInsecureHTTP 设置为 true。
【解决方案8】:

作为接受的答案提供了所需的信息,以及有关使用和disabling App Transport Security one can find more on this 的更多信息。

对于每个域的例外,将这些添加到 Info.plist

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

但如果我不知道我需要使用的所有不安全域怎么办? 在您的 Info.plist

中使用以下键
<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

For more detail you can get from this link.

【讨论】:

  • 提供简单设置示例的最佳答案。
  • 如果使用IP地址就不行。谁能帮我排除IP地址而不是域名?
  • 只是想说,输入的域名应该没有“http://”开头
  • 这会造成应用程序被拒绝的高风险因为苹果公司非常清楚,他们打算拒绝没有特定原因使用此标志的应用程序。使用 NSAllowsArbitraryLoads& 创建内容的主要原因(链接共享、自定义 Web 浏览器等)。在这种情况下,Apple 仍然希望您包含对您控制的 URL 强制执行 ATS 的异常。
  • 这在 2016 年 12 月之后将不再适用于 iOS 10。您的应用不得在 info.plist 中包含这些键,否则您的应用将被应用商店拒绝。
猜你喜欢
  • 2015-11-26
  • 2015-11-30
  • 2018-04-28
相关资源
最近更新 更多