传输安全已阻止明文 HTTP

Transport security has blocked a cleartext HTTP

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

Transport security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

假设我的域名是example.com

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

使用 NSAppTransportSecurity:

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

这是一个快速的解决方法(但不推荐)将其添加到 plist 中:

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

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

NSAllowsArbitraryLoads
A Boolean value used to disable App Transport Security for any domains not listed in the NSExceptionDomains dictionary. Listed domains use the settings specified for that domain.

The default value of NO requires the default App Transport Security behaviour for all connections.

我真的推荐链接:

这有助于我理解原因和所有含义。

下面的 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 中找到更多信息,其中有更多关于安全性的解释

由于历史原因和发展阶段,留下原来的答案

这已经过测试并正在 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,因为它不允许 all 不安全连接,但例外列表允许连接到 some 没有 HTTPS 的域。

这是视觉上的:

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

Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

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

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

使用:

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

对于那些想要了解更多关于 为什么会发生这种情况的背景,以及如何修复它的人,请阅读下面。

随着 iOS9 的引入,为了提高应用程序和网络服务之间连接的安全性,应用程序与其网络服务之间的安全连接必须遵循最佳实践.最佳实践行为由 App Transport Security 强制执行到:

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

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

  • The server must support at least Transport Layer Security (TLS) protocol version 1.2.
  • Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
  • Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key.
  • Invalid certificates result in a hard failure and no connection.

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

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


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

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

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

  2. 在 Project Navigator 中找到 Info.plist 文件,然后 "right-mouse" 单击它并选择 Open As > 源代码 菜单选项。 属性 列表文件将出现在右窗格中。

  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.

下添加另一个字典 属性

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

2015 年 9 月 25 日(在 2015 年 9 月 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>

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

正如许多人所指出的,这是 iOS 9.0 附带的一个功能问题。他们添加了一个名为 App Transport Security 的东西,当它破坏了我的应用程序时我也很生气。

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

Apple 在 iOS 9.0 中重写了 NSUrlConnection class。您可以在 NSURLConnection.

中阅读相关信息

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

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

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

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

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

第一次点击时,通常是table格式,所以右键点击文件和'open as'源代码,然后在最后添加下面的代码,即:

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

复制粘贴上面的代码

 "</dict>
</plist>"

在最后。

更新 Xcode 7.1,面临问题 27.10.15:

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

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

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

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

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

以下是直观的设置:

开发实例

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

有两种解决方法:

解决方案 1:

  1. Info.plist 文件中添加一个字典,关键字为“NSAppTransportSecurity
  2. 在字典中添加另一个元素 'Allow Arbitrary Loads'

Plist 结构应如下图所示。

解决方案 2:

  1. Info.plist 文件中添加一个字典,关键字为“NSAppTransportSecurity
  2. 在字典中添加另一个元素,键为“NSExceptionDomains
  3. 添加键 'MyDomainName.com' 类型为 NSDictionary
  4. 的元素
  5. 添加具有 Boolean 类型键“NSIncludesSubdomains”且值设置为 YES
  6. 的元素
  7. 添加具有 Boolean 类型键“NSTemporaryExceptionAllowsInsecureHTTPLoads”且值设置为 YES
  8. 的元素

Plist 结构应如下图所示。

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

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

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

它应该在里面:

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

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

A​​pple 有一个出色的工具,可以准确告诉您要使用的设置:在终端中,输入

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

nscurl 会检查这个请求是否失败,然后尝试各种设置并告诉你到底哪个通过了,要做什么。比如我访问的某个第三方URL,这个命令告诉我这个字典通过:

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

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

注意:您的 plist 中的异常域应该是小写的。

示例:您在设置->共享下将您的机器命名为 "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>

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

如果你想允许到任何网站的 HTTP 连接,你可以使用这个键:

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

如果您知道要连接到哪些域,请添加:

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

转到您的 Info.plist

  1. 右键单击空白 space 并单击添加行
  2. 将密钥名称写为 NSAppTransportSecurity,在它下面
  3. Select 异常域,向其中添加一个新项目
  4. 写下您需要访问的域名
  5. 将域类型从字符串更改为字典,添加一个新项目
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个具有真值的布尔值。

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

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

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

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

我是 swift 和 cocoa 的新手,但在编程方面经验丰富,我花了大约 20 个小时才找到这个解决方案。 None 数十个嬉皮士-iOS-教程或 apple 主题演讲 – 没有提到这个小复选框。

在 swift 4 和 xcode 10 中,将 NSAllowsArbitraryLoads 更改为允许任意加载。所以它看起来像这样:

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

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

1. Adding source code in project info.plist and add the following code in root tag.

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

2. Using project info.

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

How to fix it?

Below steps to fix it.

⛔️不要用不好的做法!

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

您可以看到这位 Apple 工程师在 here in WWDC18 中清楚地说明了这一点,即使对于 Web 内容也是如此,而您正在尝试允许所有内容!


✅ 将 Allow Arbitrary Loads 设置为 NO !!!

您必须始终使用 HTTPS 进行网络连接。但是,如果你真的不能,只需在 info.plist

中添加一个例外

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

但是如果你不能以某种方式(并且你不能说服后端开发人员支持 SSL),请将这个 unsecured 域添加到 info.plist(而不是使其可用于 ALL UNSECURE NET!)

** 终于!!!已解决的应用程序传输安全性 **

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

Swift 5中我们有两种方法来克服这个问题。我们需要在 info.plist

中添加 NSAppTransportSecurity

我给出info.plist源码和图片供参考

第一个是在 info.plist.

中添加 NSAppTransportSecurity -> NSAllowsArbitraryLoads

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
    </dict>
</dict>
</plist>

另一种方法是在 info.plist 中添加 NSAppTransportSecurity -> NSExceptionDomains 并添加 URL 的域并启用加载子域的权限(NSIncludesSubdomains) 和允许不安全的 HTTP 加载 (NSExceptionAllowsInsecureHTTPLoads)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSExceptionDomains</key>
      <dict>
        <key>www.7timer.info</key>
        <dict>
          <key>NSIncludesSubdomains</key>
          <true/>
          <key>NSExceptionAllowsInsecureHTTPLoads</key>
          <true/>
        </dict>
      </dict>
    </dict>
  </dict>
</plist>