题 传输安全性阻止了明文HTTP


我需要将什么设置放入我的设置中 info.plist 根据以下错误消息启用HTTP模式?

传输安全性阻止了明文HTTP(http://)资源   加载,因为它是不安全的。可以通过配置临时例外   你的应用程序的Info.plist文件。

Xcode

假设我的域名是 example.com


1283
2017-07-06 20:10


起源


stackoverflow.com/a/31629980/1803879 - Tom Howard
主持人备注:这个问题已有36个答案。在添加之前 另一个,请确保您的解决方案 新。 - Matt
请参阅本教程的原因: iosdevcenters.blogspot.in/2016/02/... - Kirit Modi
注意: 这里的解决方案建议您关闭ATS(Allow arbitary loads)。很快这将是不可能的 Apple将需要ATS  (原定于年底 - 截止日期已延长) - developer.apple.com/news/?id=12212016b - Jakub Truhlář
firebase.google.com/docs/admob/ios/app-transport-security - Alex1987


答案:


如果您使用的是Xcode 8.0和Swift 3.0或Swift 2.2甚至是Objective C:

Enter image description here

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

243
2017-10-28 07:06



如果(也)是文本格式会更好。 - Peter Mortensen
为什么是 NSAllowsArbitraryLoads 设置 true?你颠覆了ATS的目的。另见 世界上最危险的代码:在非浏览器软件中验证SSL证书。您的软件刚刚列入清单。 - jww
@jww这是这篇文章的目的。我需要连接到播放音频的网站还没有使用HTTPS,我不想等待。 - ThinkDigital


使用:

Enter image description here

你必须设置 NSAllowsArbitraryLoads 关键  下 NSAppTransportSecurity .plist文件中的字典。

Plist configuration


890
2017-08-04 10:42



让它知道: 这是一个解决方案! 无论何时通过HTTPS使用HTTP,您都会将用户的设备打开到漏洞中。当然,在许多情况下不太可能,但道德规划是最佳实践。只是说'... - 也为工作+1(用于测试目的) - Jacksonkr
这不是解决方案 - 这是一个黑客!要添加单个域“例外”,请参阅以下答案: stackoverflow.com/a/32560433/1103584 - DiscDev
虽然众所周知这种解决方案很容易受到攻击,但它却是 只要 解决方案我建议在期间 发展。在开发过程中必须输入每个确切的域都是愚蠢的(特别是如果您使用的是第三方Web服务)。 - reTs
这些密钥的名称现已更改为“允许任意加载”下的“应用程序传输安全设置” - vishal dharankar
为什么有这么多人反对这个解决方案?这绝对不是一个黑客!许多应用程序需要与实际的互联网进行通信,而安全协议并不总是在您的控制之下。例如,能够显示来自没有SSL证书的其他服务器的图像似乎非常合理。 - Oren


以下是视觉设置:

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI


789
2017-11-14 19:08



这对我有用,而plist编辑没有 - Ian Bell
我没有这个选择。 - User
如果您直接打开Info.plist,则可以添加 NSAppTransportSecurity 字典,然后创建 NSAllowsArbitraryLoads 其中的项目(见下文Umar Farooq编辑的答案)。 - Stoph
同样在这里 - 异常域对我来说不适用于7.3。 - RegularExpression
此选项不存在 - XCode 7.3.1 - jameshfisher


查看论坛帖子 应用运输安全?

还有页面 在iOS 9和OSX 10.11中配置App Transport Security例外

例如,您可以添加特定域,例如:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.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>

懒惰的选择是:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

注意:

info.plist 是一个XML文件,因此您可以将此代码或多或少地放在文件中的任何位置。


686
2017-07-06 20:19



iOS9 beta 3不适用于我。任何解决方案? - mursang
似乎也没有在Beta 4中工作。 - user2443329
@lmiguelvargasf在纯文本编辑器中打开您的info.plist - Dan Beaulieu
我仍然得到错误:设置了异常域并且NSAllowsArbitraryLoads为false。即使NSAllowsArbitraryLoads设置为true,也会显示错误。这里有其他人有这个问题吗? - klaevv
截至2016年1月30日,Apple doc显示密钥不再包含临时字,例如:NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion请参阅 developer.apple.com/library/prerelease/ios/documentation/... - Philippe Monnet


这已经过测试,正在开发iOS 9 GM种子 - 这是允许的配置 具体 域使用HTTP而不是HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoads 一定是 false,因为它不允许 所有 不安全的连接,但例外列表允许连接 一些 没有HTTPS的域名。


297
2017-09-14 08:36



这应该标记为答案。测试并使用iOS 9 GM种子,允许特定域使用http而不采用“懒惰”方式并完全打开您的应用程序。 - DiscDev
如何将此添加到我的info.plist? - JMStudios.jrichardson
这终于是问题的正确答案。谢谢。 - dpizzuto
好的,我添加了这个条目到我的info.plist,我仍然收到此错误 - “App Transport Security已阻止明文HTTP(http://)资源加载,因为它不安全。临时例外可以通过您的应用程序的信息配置.plist文件。“ - KMC
@RomanShapovalov如果必须使用IP地址,请尝试将.xip.io添加到IP地址的末尾,并将xip.io添加到NSExceptionDomains。看到 xip.io。我在开发时直接连接到IP(但不是发布),这对我很有用。 - tpankake


这是一个快速解决方法(但不建议)在plist中添加它:

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

这意味着(根据 Apple的文档):

NSAllowsArbitraryLoads
  一个布尔值,用于为NSExceptionDomains字典中未列出的任何域禁用App Transport Security。列出的域使用为该域指定的设置。

默认值NO需要所有连接的默认App Transport Security行为。

我真的推荐链接:

这有助于我理解原因和所有影响。

下面的XML(在文件Info.plist中)将:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

不允许对所有页面进行任意调用,但是 PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE 将允许该连接使用HTTP协议。

在上面的XML中,您可以添加:

<key>NSIncludesSubdomains</key>
<true/>

如果要为指定地址的子域允许不安全的连接。

最好的方法是阻止所有任意加载(设置为false)并添加异常以仅允许我们知道的地址正常。

感兴趣的读者


124
2017-09-01 12:10



NSAllowsArbitraryLoads 一定是 false - Sound Blaster
@SoundBlaster对于什么情况以及你在我的回答中看错了什么? - Julian Król
通过添加plist(NSAppTransportSecurity NSAllowsArbitraryLoads),除了一个Web服务之外,所有Web服务都正常工作,一个Web服务在iOS 9中返回内部服务器错误(500)但在iOS8或更高版本中正常工作 - amit gupta
@SoundBlaster做了一个改变,现在你不应该反对:) - Julian Król
很棒的解释,很棒的链接。这是一个明智的解决方案。 - LargeGlasses


对于那些想要更多背景的人 为什么 这种情况正在发生,除了如何解决之外,请阅读下文。

随着iOS 9的推出,为了提高应用和Web服务之间连接的安全性, 应用与其Web服务之间的安全连接必须遵循最佳做法。最佳实践行为由强制执行 App Transport Security 至:

  • 防止意外泄露,以及
  • 提供安全的默认行为。

如中所述 App Transport Security Technote,当与您的Web服务通信时,App Transport Security现在具有以下要求和行为:

  • 服务器必须至少支持传输层安全性(TLS)协议版本1.2。
  • 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表。)
  • 证书必须使用SHA256或更好的签名哈希算法进行签名,使用2048位或更高的RSA密钥或256位或   更大的椭圆曲线(ECC)键。
  • 无效的证书导致硬故障并且没有连接。

换句话说,您的Web服务请求应该:a。)使用 HTTPS 和b。)使用具有前向保密性的TLS v1.2加密。

但是,正如其他帖子中所提到的,您可以通过在中指定不安全的域来覆盖App Transport Security中的这种新行为 Info.plist 你的应用程序。


要覆盖,您需要添加 NSAppTransportSecurity > NSExceptionDomains 你的字典属性 Info.plist。接下来,您将添加您的Web服务的域名 NSExceptionDomains 字典。

例如,如果我想绕过主机上的Web服务的App Transport Security行为 www.yourwebservicehost.com 然后我会做以下事情:

  1. 在Xcode中打开您的应用程序。

  2. 找出 Info.plist 在Project Navigator中输入文件并单击“右键”并选择 打开为 > 源代码 菜单选项。属性列表文件将显示在右侧窗格中。

  3. 将以下属性块放在主属性字典中(在第一个下面) <dict>)。


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

如果您需要为其他域提供例外,那么您可以在下面添加另一个字典属性 NSExceptionDomains

要了解有关上述键的更多信息,请阅读 这个已经提到的技术说明


113
2017-09-21 17:56



这在我的两个应用程序中有效,但它不适用于第三个应用程序。有没有其他人遇到使用上述修复程序的情况仍然得到相同的错误消息? (是的,我更新了字典以使用我的API域,而不是代码中的域) - helloB
最好 ! Apple确认此解决方案使用 - YannickSteph
最佳答案,工作解决方案。 - Dustin Williams
这适用于Cordova / Phonegap / Ionic应用程序编辑文件 ./platforms/ios/<project>/<project>-Info.plist 同 NSAllowsArbitraryLoads=false 以及具有不同TLS / HTTP / HTTPS组合的服务的许多例外域。最初使用 NSAllowsArbitraryLoads=true 然后进行调整,通过反复试验对规则进行故障排除,以符合指南并提交批准。注意 config.xml  <access origin=.../> 语句部分填充此文件,但目前需要通过直接编辑或通过XCode进行调整以获取正确的详细信息。 - jimmont
也 <access origin="*"/> (在config.xml中)设置 NSAllowsArbitraryLoads=true (适用于Cordova / Phonegap /混合应用程序 - jimmont


我不喜欢直接编辑plist。您可以使用GUI轻松地将其添加到plist:

  • 单击左侧导航器中的Info.plist。
  • 现在更改主区域中的数据:

    • 在最后一行添加+
    • 输入组的名称: 应用传输安全设置
    • 右键单击该组并选择 Add Row
    • 输入 允许任意负载 
    • 将右侧的值设置为

Example


64
2017-11-06 08:06



谢谢。你节省了我的时间。 - beginners
这就是为什么我们都这样做! - Vincent
澄清一下:如果“允许任意加载”为“是”,并且存在“异常域”,则允许的加载仅限于“例外域”中的加载。那是对的吗?
如果我想发布应用程序,这是一种安全的方法吗? - Lamar
没有。 通过允许任意加载,您的应用可以自由连接到任何域。从安全角度来看,您应该控制和限制应用程序连接到哪个域/网站,以避免意外的网络使用。 - Raptor


Apple Document 1

Apple Document 2

有两种解决方案:

解决方案1: 

  1. Info.plist 文件添加一个带键的字典'NSAppTransportSecurity
  2. 使用键在字典中添加另一个元素 'Allow Arbitrary Loads'

Plist 结构应如下图所示。

Solution 1

解决方案2:

  1. Info.plist 文件添加一个带键的字典'NSAppTransportSecurity
  2. 使用键'在字典中添加另一个元素'NSExceptionDomains
  3. 使用键添加元素 'MyDomainName.com' 类型NSDictionary
  4. 添加带键的元素'NSIncludesSubdomains'的类型 Boolean和值设置为 YES
  5. 添加带键的元素'NSTemporaryExceptionAllowsInsecureHTTPLoads'的类型 Boolean和值设置为 YES

Plist 结构应如下图所示。

Solution 2

解决方案2是优选的,因为它仅允许选择的域,而解决方案1允许所有不安全的HTTP连接。


24
2018-03-10 11:29



为什么是 NSAllowsArbitraryLoads 设置 YES?你颠覆了ATS的目的。另见 世界上最危险的代码:在非浏览器软件中验证SSL证书。您的软件刚刚列入清单。 - jww


iOS 9.0或更高版本提供传输安全性。尝试在应用程序中调用WS时,可能会出现此警告:

Application Transport Security已阻止明文HTTP(http://)资源加载,因为它不安全。可以通过应用程序的Info.plist文件配置临时例外。

将以下内容添加到Info.plist将禁用ATS:

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

20
2017-09-18 17:36



NSAllowsArbitraryLoads必须为false,如果为true,则允许所有不安全的连接 - Thiago Arreguy
通过添加plist所有Web服务工作正常除了一个Web服务一个Web服务在iOS 9中返回内部服务器错误(500)但在iOS8或更高版本中正常工作 - amit gupta
在商店接受? - Slartibartfast
非常糟糕的建议;看到 世界上最危险的代码:在非浏览器软件中验证SSL证书。如果问题是否充满推荐的做事方式,“我也是”这样的答案是不需要的。 - jww


开发实例

这是一个plist的屏幕截图,它保持ATS完整(=安全),但允许连接 本地主机 可以通过 HTTP而不是HTTPS。它适用于Xcode 7.1.1。

Enter image description here


14
2017-11-30 08:49



是否有任何方法可以使localhost安全,即使用HTTPS,在react-native中,这样我们就不必使用默认值 NSExceptionAllowsInsecureHTTPLoads - YES 配置? - milkersarac