传输安全性阻止了明文HTTP

Jee*_*eef 1425 xcode ios ios9 app-transport-security ios10

info.plist根据以下错误消息,我需要在我的设置中启用HTTP模式?

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

Xcode中

假设我的域名是example.com.

Use*_*231 934

使用:

在此输入图像描述

您必须在.plist文件中的NSAppTransportSecurity字典下将NSAllowsArbitraryLoads键设置为YES.

Plist配置

  • 让它为人所知:**这是一个解决方法!**只要您通过HTTPS使用HTTP,就会打开用户设备的漏洞.当然,在许多情况下不太可能,但道德规划是最佳实践.只是说'... - 也为工作+1(用于测试目的) (154认同)
  • 这不是解决方案 - 这是一个黑客!要添加单个域"例外",请参阅以下答案:http://stackoverflow.com/a/32560433/1103584 (36认同)
  • 虽然众所周知这种解决方案很容易受到攻击,但它是我在**开发期间推荐的唯一**解决方案**.在开发期间必须输入每个确切的域都是愚蠢的(特别是如果您使用的是第三方Web服务). (17认同)
  • 为什么有这么多人反对这个解决方案?这肯定不是黑客!许多应用程序需要与实际的互联网进行通信,而安全协议并不总是在您的控制之下.例如,能够显示来自没有SSL证书的其他服务器的图像似乎非常合理. (9认同)
  • 这些密钥的名称现已更改为"允许任意加载"下的"应用程序传输安全设置" (5认同)
  • 这是一个错误的答案,因为它选择了问题的最低安全解决方案并单独提供,绝对没有上下文可以告知提问者选择此选项时需要考虑的含义,或者他们可能遇到的问题.由于已经有一个答案可以提供更安全的解决方案,但也包含了这个解决方案并提供了必要的警告,您的答案在发布之前完全没有必要和过时.这是一个糟糕的答案. (2认同)
  • KMLong和whyceewhite已经(并且在此答案的时候)已经给出了答案,其中包括此处包含的信息以及更安全的解决方案,在可能的情况下更好地使用,以及解释问题发生的原因首先,在选择如何解决它时需要考虑什么.另一方面,这个答案只是推动了一些易于复制粘贴的代码,而没有给任何人任何关于它可能带来什么后果的概念.任何认真制作好产品的人都应该关心他们正在做什么 (2认同)

Wil*_*iuk 823

以下是视觉设置:

通过Xcode GUI在info.plist中对NSAllowsArbitraryLoads进行可视化设置

  • 如果您直接打开Info.plist,只需添加**NSAppTransportSecurity**字典,然后在其中创建**NSAllowsArbitraryLoads**项目(请参阅下面的Umar Farooq编辑的答案). (24认同)
  • 这对我有用,而plist编辑没有 (10认同)
  • 我没有这个选择. (10认同)
  • 此选项不存在 - XCode 7.3.1 (4认同)
  • 同样在这里 - 例外域对我来说不适用于7.3. (3认同)
  • 来自@JoshPinter的信息为XCode 8工作. (3认同)
  • 右键单击"App Transport Security Settings",而不是"Bundle OS Type Code" (2认同)
  • 当您将域添加到`Exception Domains`时,您需要将其显示为:https://www.dropbox.com/s/3q32sx1h5t6hu20/Screenshot%202017-02-11%2001.49.49.png?dl = 0 (2认同)

KML*_*ong 710

请参阅论坛帖子Application Transport Security?.

此页面还在iOS 9和OSX 10.11中配置App Transport Security Exceptions.

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

<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>
Run Code Online (Sandbox Code Playgroud)

懒惰的选择是:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

注意:

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

  • iOS9 beta 3不适用于我.任何解决方案? (14认同)
  • 我仍然得到错误:设置了异常域并且NSAllowsArbitraryLoads为false.即使NSAllowsArbitraryLoads设置为true,也会显示错误.这里有其他人有这个问题吗? (5认同)
  • 截至2016年1月30日,Apple doc显示密钥不再包含临时字,例如:NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion请参阅https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference /Articles/CocoaKeys.html (3认同)
  • 似乎也没有在Beta 4中工作. (2认同)
  • @lmiguelvargasf在纯文本编辑器中打开您的info.plist (2认同)
  • 万一其他人因为对info.plist进行这些简单更改而无法正常工作..将更改添加到Project&gt; Target&gt; Info&gt; Custom iOS Target Properties (2认同)

Ani*_*mar 428

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

在此输入图像描述

<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>
Run Code Online (Sandbox Code Playgroud)

  • 为什么`NSAllowsArbitraryLoads`设置为"true"?你颠覆了ATS的目的.另请参阅[世界上最危险的代码:在非浏览器软件中验证SSL证书](http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html).您的软件刚刚列入清单. (27认同)
  • @jww这是这篇文章的目的.我需要连接到播放音频的网站还没有使用HTTPS,我不想等待. (5认同)
  • 这在iOS 10.0+或MacOS 10.12+中不起作用。实际上是说允许所有任意负载(提及的负载除外)(example.com)。因此,它将与期望的相反。NSAllowsArbirtraryLoads应该在此处设置为false。更多信息:[Apple文档](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW60) (4认同)

Sou*_*ter 325

这已经过测试,正在使用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>
Run Code Online (Sandbox Code Playgroud)

NSAllowsArbitraryLoads必须是false,因为它不允许所有不安全的连接,但例外列表允许连接到没有HTTPS的某些域.

  • 好吧,我添加了这个条目到我的info.plist,我仍然收到此错误 - "App Transport Security已阻止明文HTTP(http://)资源加载,因为它不安全.临时例外可以通过您的应用程序的信息配置.plist文件." (8认同)
  • 这应该标记为答案.测试并使用iOS 9 GM种子,允许特定域使用http而不采用"懒惰"方式并完全打开您的应用程序. (7认同)
  • 直到我意识到我在我的测试项目中将它放在错误的 info.plist 中才为我工作。确保你把它放在正确的位置! (3认同)
  • 如何将此添加到我的info.plist中? (2认同)
  • @RomanShapovalov如果必须使用IP地址,请尝试将.xip.io添加到IP地址的末尾,并将xip.io添加到NSExceptionDomains.见http://xip.io.我在开发时直接连接到IP(但不是发布),这对我很有帮助. (2认同)

Jul*_*ról 144

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

这意味着(根据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>
Run Code Online (Sandbox Code Playgroud)

禁止对所有页面进行任意调用,但是为了PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE允许该连接使用HTTP协议.

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

<key>NSIncludesSubdomains</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

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

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

感兴趣的读者

2018年更新:

Apple不建议将其关闭 - 更多信息可以在207会话WWDC 2018中找到,其中有更多关于安全性的解释

出于历史原因和发展阶段留下原始答案


why*_*ite 115

对于那些想要了解为什么会发生这种情况的更多背景的人,除了如何修复它之外,请阅读以下内容.

随着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字典中.

例如,如果我想绕过主机www.yourwebservicehost.com上的Web服务的App Transport Security行为,那么我将执行以下操作:

  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>
Run Code Online (Sandbox Code Playgroud)

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

要了解有关上述键的更多信息,请阅读此已提及的技术说明.


Vin*_*ent 67

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

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

    • 在最后一行添加+
    • 输入组的名称:App Transport Security Settings
    • 右键单击该组并选择 Add Row
    • 输入允许任意负载
    • 将右侧的值设置为YES

例


Jay*_*bey 25

Apple文档1

Apple Document 2

有两种解决方案:

解决方案1:

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

Plist 结构应如下图所示.

解决方案1

解决方案2:

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

Plist 结构应如下图所示.

解决方案2

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


Mal*_*hla 20

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

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

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

<key>NSAppTransportSecurity</key>
<dict>
     <key>NSAllowsArbitraryLoads</key><true/>
</dict>
Run Code Online (Sandbox Code Playgroud)


Seb*_*ian 14

开发实例

这是一个保持ATS完整(=安全)的plist的屏幕截图,但允许通过HTTP而不是HTTPS建立到localhost的连接.它适用于Xcode 7.1.1.

在此输入图像描述


小智 13

转到您的Info.plist

  1. 右键单击空白区域,然后单击"添加行"
  2. 将密钥名称写为NSAppTransportSecurity,在它下面
  3. 选择"例外域",向其中添加新项
  4. 记下需要访问的域名
  5. 将Domain类型从String更改为Dictionary,添加一个新Item
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,它将是一个具有真值的布尔值. 看图片正确地跟着它


eco*_*tax 11

确定要使用的设置可以自动执行,如本技术说明中所述:

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
Run Code Online (Sandbox Code Playgroud)


gna*_*729 11

根据Apple的说法,除非你有充分的理由这样做,否则一般禁用ATS会导致拒绝应用.即使这样,您也应该为可以安全访问的域添加例外.

Apple有一个很好的工具,可以准确地告诉您要使用的设置:在终端中输入

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
Run Code Online (Sandbox Code Playgroud)

并且nscurl将检查此请求是否失败,然后尝试各种设置并告诉您确切的通过哪个,以及做什么.例如,对于我访问的某些第三方URL,此命令告诉我该字典通过:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Run Code Online (Sandbox Code Playgroud)

要区分您自己的站点和不受控制的第三方站点,请使用密钥NSThirdPartyExceptionRequiresForwardSecrecy.


Obj*_*eTC 10

注意:plist中的异常域应为LOWER-CASE.

示例:您已在设置 - >共享下为您的机器命名为"MyAwesomeMacbook"; 您的服务器(用于测试目的)在MyAwesomeMacbook.local:3000上运行,您的应用需要向http://MyAwesomeMacbook.local:3000/files ... 发送请求,您的plist需要指定"myawesomemacbook".本地"作为例外域名.

-

您的info.plist将包含...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)


Far*_*ris 10

在swift 4和xocde 10中,将NSAllowsArbitraryLoads更改为Allow Arbitrary Loads。因此它将看起来像这样:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>
Run Code Online (Sandbox Code Playgroud)


小智 9

在2015-09-25(2015-09-18 Xcode更新后):

我使用了非惰性方法,但它没有用.以下是我的尝试.

第一,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

第二,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

最后,我使用了懒惰的方法:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Run Code Online (Sandbox Code Playgroud)

它可能有点不安全,但我找不到其他解决方案.


Tej*_*der 8

使用:

PList截图了解更好

在类型为Dictionary的plist文件中添加一个新项NSAppTransportSecurity,然后在Boolean类型的字典中添加子项NSAllowsArbitraryLoads,并设置bool值YES.这适合我.


Nai*_*hta 6

值得一提的是如何到达那里......

Info.plist是Main.storyboard或viewController.swift下面的文件之一.

当你第一次点击它时,它通常是一种表格格式,所以右键单击文件并"打开"为源代码,然后在下面添加代码,即:

 <key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
Run Code Online (Sandbox Code Playgroud)

复制粘贴上面的代码

 "</dict>
</plist>"
Run Code Online (Sandbox Code Playgroud)

这是最后的.


Mka*_*ork 5

Xcode 7.1的更新,面临问题27.10.15:

Info.plist中的新值是"App Transport Security Settings".从那里,这本词典应该包含:

  • 允许任意载荷=是
  • 异常域(在此处插入您的http域)


小智 5

对于那些来到这里试图找到 WKWebView 始终为白色并且不加载任何内容的原因的人(完全按照此处所述How do I get WKWebView to work in swift and for an macOS App):

\n\n

如果上述所有火箭科学对您不起作用,请检查明显的内容:沙箱设置

\n\n

沙箱设置]

\n\n

作为 swift 和 cocoa 的新手,但在编程方面非常有经验,我花了大约 20 个小时来找到这个解决方案。几十个时髦的 iOS 教程和苹果主题演讲 \xe2\x80\x93 都没有提到这个小复选框。

\n

  • 在目标的“功能”部分中没有看到该部分(Xcode 9.4.1) (2认同)

Kam*_*min 5

如何解决?

在此处输入图片说明

下面的步骤来修复它。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


Moj*_*ini 5

?? 不要使用不良做法!

许多答案(包括已接受的答案)都告诉您要使您的应用程序的网络通信完全不安全!通过设置Allow Arbitrary LoadsYes(或true)。这是网络请求最危险的设置!它用于测试和临时目的。

您可以在 WWDC18 中看到这位 Apple 工程师在此处清楚地说明了这一点,即使对于 Web 内容,您也正试图允许它们全部使用! 在此处输入图片说明


? 设置Allow Arbitrary LoadsNO!!!

您必须始终HTTPS用于您的网络内容。但如果你真的不能,只需添加一个例外info.plist

例如,如果您正在使用http://google.com并收到该错误,您必须将其更改为https://google.com(with s ),因为它支持完美。

但是,如果您不能以某种方式(并且您无法说服后端开发人员支持 SSL),请将这个不安全的域添加到info.plist(而不是使其可用于所有不安全的网络!

异常