传输安全已阻止明文HTTP

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

传输安全已阻止明文HTTP(超文本传输协议://)资源加载,因为它不安全。临时异常可以通过您的应用程序的Info.plist文件。

Xcode

假设我的域是example.com

911037 次浏览

见论坛帖子应用程序传输安全?

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

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

在此处输入图片描述

您必须在info.plist文件的NS应用传输安全字典下将NS允许任意负载键设置为

Plist配置

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

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

这意味着(根据苹果留档):

NSAllowsSplingLoads
任意加载策略用于禁用NSExceptionDomains字典中未列出的任何域的应用程序传输安全性的布尔值。列出的域使用为该域指定的设置。

默认值NO需要所有连接的默认应用传输安全行为。

我真的推荐链接:

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

下面的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)并添加异常以只允许我们知道正常的地址。

对于感兴趣的读者

2018年更新:

Apple不建议关闭此功能-更多信息可以在207场WWDC 2018中找到,并在安全性方面进行了更多解释

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

这已经过测试,并且正在使用iOS9 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的情况下连接到一些域。

这是视觉上的:

Info.plist结构

传输安全性在iOS9.0或更高版本上可用。当您尝试在应用程序中调用WS时,可能会收到以下警告:

应用程序传输安全已阻止明文HTTP(超文本传输协议://)资源加载,因为它不安全。可以通过应用程序的Info.plist文件配置临时异常。

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

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

用途:

PList Screenshot以更好地理解

在类型为字典的plist文件中添加一个新项目NS应用传输安全,然后在类型为布尔的字典中添加子项NS允许任意负载,并设置bool值。这对我有用。

对于那些想要更多关于为什么的上下文的人来说,这正在发生,除了如何修复它,然后阅读下面。

随着iOS9的引入,为了提高应用程序和Web服务之间连接的安全性,应用与其Web服务之间的安全连接必须遵循最佳实践

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

应用程序传输安全技术说明中所述,在与Web服务通信时,应用传输安全现在具有以下要求和行为:

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

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

但是,正如在其他帖子中提到的,您可以通过在应用程序的Info.plist中指定不安全域来覆盖应用程序传输安全性的此新行为。


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

例如,如果我想绕过主机www.yourwebservicehost.com上Web服务的应用传输安全行为,那么我会执行以下操作:

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

  2. 在Project Navigator中找到Info.plist文件并“右键”单击它并选择Open As>Source Code菜单选项。属性列表文件将出现在右窗格中。

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

要了解有关上面引用的键的更多信息,请阅读上面已经提到了technote

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

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

正如许多人所指出的,这是iOS9.0附带的一个功能问题。他们添加了一个名为应用程序传输安全的东西,当它破坏我的应用程序时,我也很生气。

您可以使用. plist文件中NSAppTransportSecurity字典下的NSAllows任意加载键将其捆绑到YES,但最终您需要重写形成URL的代码以形成HTTPS://前缀。

Apple在iOS9.0中重写了NSUrlConnection类。

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

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

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

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

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

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

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

复制粘贴上面的代码

 "</dict></plist>"

这是在结尾。

Xcode 7.1更新,面临问题27.10.15:

Info.plist中的新值是“应用传输安全设置”。从那里,这个字典应该包含:

  • 允许任意负载=是
  • 异常域(在此插入您的超文本传输协议域)

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

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

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

示例

以下是视觉上的设置:

通过Xcode GUI在info.plist中加载NSAllows任意值的可视化设置

开发示例

这是一个plist的屏幕截图,它保持ATS完好无损(=安全),但允许通过HTTP而不是HTTPS连接到localhost。它在Xcode 7.1.1中工作。

在此处输入图片描述

Apple Document 1

Apple Document 2

对此有两种解决方案:

解决方案1:

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

Plist结构应该如下图所示。

解决方案1

解决方案2:

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

Plist结构应该如下图所示。

解决方案2

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

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

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

它应该在里面:

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

据Apple称,通常禁用ATS会导致应用程序拒绝,除非您有充分的理由这样做。即便如此,您也应该为可以安全访问的域添加例外。

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

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

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

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

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

注意: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+甚至ObjectiveC:

在此处输入图片描述

如果您想允许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. 右键单击空格并单击添加行
  2. 将密钥名称写为NSAppTransportSecurity,在其下
  3. 选择异常域,将新项添加到此
  4. 写下您需要访问的域名
  5. 将域类型从字符串更改为字典,添加一个新项目
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个具有真值的布尔值。看图正确跟随

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

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

对于那些来到这里试图找到为什么他们的WKWebView总是白色和加载什么的原因(正如这里所描述的如何让WKWebView在Swift和macOS应用程序中工作):

如果以上所有的火箭科学都不适用于您,请检查显而易见的:沙盒设置

沙盒设置]

我是Swift和Cocoa的新手,但在编程方面非常有经验,我花了大约20个小时才找到这个解决方案。

在Swift 4和Xocde 10中,更改NSAllows任意负载以允许任意负载。所以它看起来像这样:

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

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

1.在项目info.plist中添加源代码,在根标签中添加以下代码。

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

2.使用项目信息。

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

在此处输入图片描述

怎么修?

在此处输入图片描述

下面的步骤来修复它。

在此处输入图像描述在此处输入图片描述在此处输入图片描述在此处输入图片描述输入图片描述

⛔不要用坏习惯!

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

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


✅设置Allow Arbitrary LoadsNO!!!

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

例如,如果您使用http://google.com并得到该错误,您必须将其更改为https://google.com(使用<的trong>的),因为它完全支持。

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

预期

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

  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>