传输安全性阻止了明文HTTP

时间:2015-07-06 20:10:21

标签: ios xcode ios9 ios10 app-transport-security

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

  

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

Xcode

假设我的域名为example.com

28 个答案:

答案 0 :(得分:915)

使用:

Enter image description here

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

Plist configuration

答案 1 :(得分:812)

以下是视觉设置:

visual settings for NSAllowsArbitraryLoads in info.plist via Xcode GUI

答案 2 :(得分:701)

查看论坛帖子 Application Transport Security?

页面 Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11

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

<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文件,因此您可以将此代码或多或少地放在文件中的任何位置。

答案 3 :(得分:372)

如果您使用的是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>

答案 4 :(得分:315)

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

<div class="panel-group" id="accordion">
<div class="panel panel-default">
    <div class="panel-heading">
        <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> RC Cars</a>
        </h4>
    </div>
    <div id="collapseOne" class="panel-collapse collapse">
        <div class="panel-body">
            <ul>
            <li><h4 class="text-left"><a href="rc-electric-cars ">RC Electric Cars</a></h4></li>
            <li><h4 class="text-left"><a href="/">RC Petrol Cars</a></h4></li>
            <li><h4 class="text-left"><a href="/">RC Nitro Cars</a></h4></li>
            </ul>
        </div>
    </div>
</div>
<div class="panel panel-default">
    <div class="panel-heading">
        <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo"> RC Trucks</a>
        </h4>
    </div>
    <div id="collapseTwo" class="panel-collapse collapse">
        <div class="panel-body">
            <ul>
            <li><h4 class="text-left"><a href="rc-electric-cars ">RC Electric Trucks</a></h4></li>
            <li><h4 class="text-left"><a href="/">RC Petrol Trucks</a></h4></li>
            <li><h4 class="text-left"><a href="/">RC Nitro Trucks</a></h4></li>
            </ul>
        </div>
    </div>
</div>
<div class="panel panel-default">
    <div class="panel-heading">
        <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#accordion" href="#collapseThree"> RC Planes</a>
        </h4>
    </div>
    <div id="collapseThree" class="panel-collapse collapse">
        <div class="panel-body">
            <ul>
            <li><h4 class="text-left"><a href="rc-electric-cars ">RC Electric Planes</a></h4></li>
            <li><h4 class="text-left"><a href="/">RC Petrol Planes</a></h4></li>
            <li><h4 class="text-left"><a href="/">RC Nitro Planes</a></h4></li>
            </ul>
        </div>
    </div>
</div>

<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,因为它不允许所有不安全连接,但例外列表允许在没有HTTPS的情况下连接到某些域。< / p>

答案 5 :(得分:140)

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

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

这意味着(根据Apple's documentation):

  

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)并添加例外以仅允许我们知道的地址正常。

For interested readers

2018年更新:

Apple并不建议关闭此功能 - 更多信息可在207 session WWDC 2018中找到,其中包含有关安全性的更多内容

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

答案 6 :(得分:114)

对于那些想要了解 为什么 的更多背景信息的人,除了如何解决之外,请阅读以下内容。

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

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

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

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

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

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

要覆盖,您需要添加NSAppTransportSecurity&gt;您NSExceptionDomains的{​​{1}}字典属性。接下来,您将把您的Web服务的域添加到Info.plist字典。

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

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

  2. 在Project Navigator中找到NSExceptionDomains文件,然后单击“右键单击”并选择 Open As &gt; 源代码菜单选项。属性列表文件将显示在右侧窗格中。

  3. 将以下属性块放在主属性字典中(在第一个Info.plist下)。

  4. <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> 下添加另一个字典属性。

    要了解有关上述键的更多信息,请阅读this already mentioned technote

答案 7 :(得分:65)

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

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

    • 在最后一行添加+
    • 输入论坛名称:应用传输安全设置
    • 右键点击论坛,然后选择Add Row
    • 输入允许任意载入
    • 将右侧的值设置为

Example

答案 8 :(得分:25)

Apple Document 1

Apple Document 2

有两种解决方案:

解决方案1:

  1. Info.plist文件中添加一个包含密钥“NSAppTransportSecurity
  2. 的字典
  3. 使用键'Allow Arbitrary Loads'
  4. 在词典中添加另一个元素

    Plist结构应如下图所示。

    Solution 1

    解决方案2:

    1. Info.plist文件中添加一个包含密钥“NSAppTransportSecurity
    2. 的字典
    3. 使用键“NSExceptionDomains
    4. 在词典中添加另一个元素
    5. 使用NSDictionary类型的键'MyDomainName.com'添加元素
    6. 使用NSIncludesSubdomains类型的键“Boolean”添加元素,并将值设置为YES
    7. 使用NSTemporaryExceptionAllowsInsecureHTTPLoads类型的键“Boolean”添加元素,并将值设置为YES
    8. Plist结构应如下图所示。

      Solution 2

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

答案 9 :(得分:20)

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

  

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

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

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

答案 10 :(得分:14)

开发示例

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

Enter image description here

答案 11 :(得分:12)

转到您的Info.plist

  1. 右键单击空白区域,然后单击“添加行”
  2. 将密钥名称写为NSAppTransportSecurity,在其下
  3. 选择例外域,向此添加新项
  4. 记下您需要访问的域名
  5. 将域类型从字符串更改为字典,添加新项
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,它将是一个具有true值的布尔值。 Look at the picture to follow it correctly

答案 12 :(得分:11)

确定要使用的设置可以自动执行,如this technote中所述:

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

答案 13 :(得分:10)

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

Apple提供了一个出色的工具,可以准确地告诉您要使用的设置:在终端中输入

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

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

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

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

答案 14 :(得分: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>

第二,

<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>

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

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

这可能有点不安全,但我无法找到其他解决方案。

答案 15 :(得分:9)

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

示例:您已在Settings-&gt; Sharing下为您的机器命名为“MyAwesomeMacbook”;您的服务器(用于测试目的)在MyAwesomeMacbook.local:3000上运行,您的应用需要向http://MyAwesomeMacbook.local:3000/files发送请求...,您的plist需要指定“myawesomemacbook.local”作为异常域

-

您的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>

答案 16 :(得分:8)

在swift 4和xocde 10中将NSAllowsArbitraryLoads更改为Allow Arbitrary Loads。所以看起来像这样:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>

答案 17 :(得分:7)

使用:

PList Screenshot to understand better

在类型为字典的plist文件中添加新项 NSAppTransportSecurity ,然后在类型 NSAllowsArbitraryLoads >布尔,并设置bool值 YES 。这对我有用。

答案 18 :(得分:6)

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

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

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

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

复制粘贴上面的代码

 "</dict>
</plist>"

最后。

答案 19 :(得分:5)

Xcode 7.1更新,面临问题27.10.15:

Info.plist中的新值是&#34;应用程序传输安全设置&#34;。 从那里,这本词典应该包含:

  • 允许任意载入=是
  • 例外域(在此处插入您的http域)

答案 20 :(得分:3)

对于那些来到这里的人试图找出他们的WKWebView总是白色并且什么都不加载的原因(完全按照how do I get WKWebView to work in swift and for an macOS App所述):

如果上面的所有火箭科学都不适合你,请检查明显的:沙盒设置

sandbox settings]

对swift和cocoa不熟悉,但在编程方面经验丰富,我花了大约20个小时来找到这个解决方案。没有几十个时髦的iOS教程和苹果主题演讲 - 没有提到这个小复选框。

答案 21 :(得分:3)

如何解决?

enter image description here

请按照以下步骤进行修复。

enter image description here enter image description here enter image description here enter image description here enter image description here

答案 22 :(得分:2)

⚠️将Allow Arbitrary Loads设置为NO !!!

您必须始终将HTTPS用于网络。但是,如果您确实不能这样做,只需向info.plist

添加一个例外

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

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

Expception

答案 23 :(得分:1)

使用NSExceptionDomains可能无法同时应用效果,因为目标网站可能会通过js从外部域加载资源(例如http个文件)。可以通过将这些外部域添加到NSExceptionDomains来解决此问题。

要检查无法加载哪些资源,请尝试使用远程调试。这是一个教程:http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/

答案 24 :(得分:0)

对于Cordova,如果要将其添加到ios.json中,请执行以下操作:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

它应该在:

之内
"*-Info.plist": {
   "parents": {
   }
}

答案 25 :(得分:0)

默认情况下,iOS仅允许HTTPS API。由于HTTP不安全,因此您必须禁用应用程序传输安全性。有两种禁用ATS的方法:-

  

1。在项目info.plist中添加源代码,并在root标记中添加以下代码。

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

2。使用项目信息。

在左窗格上的项目上单击项目,选择项目作为目标并选择信息选项卡。您必须在以下结构中添加字典。

enter image description here

答案 26 :(得分:0)

** 终于到了!!!解决了应用传输安全**

  1. Follow the follow the screen shot. Do it in Targets info Section.

enter image description here

答案 27 :(得分:-3)

许多人都注意到,这是iOS 9.0附带的一个功能问题。他们添加了一个名为App Transport Security的东西,当我破坏我的应用程序时,我也很恼火。

您可以在.plist文件中的NSAppTransportSecurity字典下使用NSAllowsArbitraryLoads键将其绑定为YES,但最终您需要重新编写构成URL的代码以形成HTTPS://前缀。

Apple已在iOS 9.0中重写了NSUrlConnection类。您可以在 NSURLConnection 中阅读相关内容。

否则,在您有时间实施正确的解决方案之前,您可能必须退出iOS 9.0。