传输安全已经阻止了明文HTTP

根据下面的错误信息,我需要在我的info.plist放置什么样的设置来启用HTTP模式?

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

Xcode中

假设我的域名是example.com

如果您使用Xcode 8.0和Swift 3.0或Swift 2.2:

在这里输入图像说明

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

使用:

在这里输入图像说明

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

Plist配置

以下是可视化设置:

通过Xcode GUI在info.plist中为NSAllowsArbitraryLoads提供可视化设置

请参阅论坛post应用程序运输安全?

另外, 在iOS 9和OSX 10.11中configurationApp Transport安全例外

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

 <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文件,所以你可以把这个代码或多或less放在文件的任何地方。

这已经过testing,并且正在使用iOS 9 GM种子 – 这是允许特定域使用HTTP而不是HTTPS的configuration:

 <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的某些域。

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

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

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

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

NO的默认值要求所有连接的默认App Transport安全性行为。

我真的推荐链接:

  • 苹果的技术说明
  • WWDC 2015会话706(安全和您的应用程序)从1:50开始
  • WWDC 2015会话711(与NSURLSession联网)
  • 博客文章使用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),并添加例外,只允许我们知道的地址是好的。

感兴趣的读者

对于那些想要更加了解为什么发生这种情况的人,除了如何解决这个问题之外,请阅读下面的内容。

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

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

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

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

换句话说,您的Web服务请求应该:a。)使用HTTPS ,b。)使用TLS v1.2进行encryption并保密。

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


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

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

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

  2. 在Project Navigator中findInfo.plist文件,然后点击鼠标右键并selectOpen 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下添加另一个字典属性。

要了解更多关于上面引用的键,请阅读这个已经提到的技术 。

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

  • 点击左侧导航栏中的Info.plist。
  • 现在改变主要区域的数据:

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

例

苹果文档1

Apple文档2

有两个解决scheme:

解决scheme1:

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

Plist结构应该如下图所示。

解决方案1

解决scheme2:

  1. Info.plist文件中添加一个密钥为“ NSAppTransportSecurity ”的字典
  2. 使用键“ NSExceptionDomains ”添加字典内的另一个元素
  3. 添加types为NSDictionary的键'MyDomainName.com'的元素
  4. 添加具有Boolean型键值“ NSIncludesSubdomains ”的元素,并将值设置为YES
  5. 添加具有Boolean型键值“ NSTemporaryExceptionAllowsInsecureHTTPLoads ”的元素,并将值设置为YES

Plist结构应该如下图所示。

解决方案2

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

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

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

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

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

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

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

开发例子

下面是一个保持ATS完整(=安全)的plist屏幕截图,但允许通过HTTP而不是HTTPS连接到本地主机 。 它在Xcode 7.1.1中起作用。

在这里输入图像说明

使用:

PList截图更好地理解

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

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

我使用了一个非懒惰的方法,但它没有工作。 以下是我的尝试。

第一,

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

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

转到您的Info.plist

  1. 右键单击空白处并单击添加行
  2. 将密钥名称写为NSAppTransportSecurity,在它下面
  3. select例外域,添加一个新的项目
  4. 写下你需要访问的域名
  5. 将域types从string更改为字典,添加一个新的项目
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个真值的布尔值。 看看这张照片是否正确

注意:你的plist中的exception域应该是LOWER-CASE。

例如:您已经在设置 ​​- >共享下为您的机器命名为“MyAwesomeMacbook” 您的服务器(用于testing目的)正在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> 

更新Xcode 7.1,面临问题27.10.15:

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

  • 允许任意负载= YES
  • 例外域名(在这里插入你的http域名)

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

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

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

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

复制粘贴上面的代码

  "</dict> </plist>" 

这是最后。

根据苹果公司的说法,通常禁用ATS会导致应用程序拒绝,除非你有充分的理由这样做。 即使这样,您也应该为可以安全访问的域添加例外情况。

苹果有一个很好的工具,告诉你什么设置使用:在terminal,input

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

nscurl会检查这个请求是否失败,然后尝试各种设置,告诉你究竟哪一个通过了,怎么做。 例如,对于我访问的一些第三方URL,这个命令告诉我这个字典通过:

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

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

对于那些来这里试图find他们的WKWebView为什么总是白色的原因,并没有加载任何东西(正如我在这里所描述的, 我如何让WKWebView工作在迅速和MacOS应用程序 ):

如果上面所有的火箭科学都不适合你,请检查一下显而易见的内容:沙盒设置

沙箱设置]

作为swift和cocoa的新手,在编程方面非常有经验,我花了20个小时才find这个解决scheme。 没有几十个时髦iOS的教程,也没有苹果的主题演讲 – 没有提到这个小checkbox。

对于Cordova,如果你想把它添加到你的ios.json中,请执行以下操作:

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

它应该在里面:

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

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

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

像许多人已经注意到的那样,这是iOS 9.0的一个function问题。 他们添加了一个名为App Transport Security的东西,当我的应用程序崩溃时,我也很恼火。

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

苹果已经在iOS 9.0中重写了NSUrlConnection类。 你可以在NSURLConnection中看到它。

否则,您可能不得不退出iOS 9.0,直到您有时间实施正确的解决scheme。