繁体   English   中英

传输安全已阻止明文 HTTP

[英]Transport security has blocked a cleartext HTTP

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

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

Xcode

假设我的域是example.com

使用 NSAppTransportSecurity:

在此处输入图像描述

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

列表配置

以下是视觉设置:

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

请参阅论坛帖子应用程序传输安全性? .

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

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

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

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

这是视觉上的:

Info.plist 结构

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

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

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

NSAllowsArbitraryLoads
一个布尔值,用于禁用 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 不建议关闭此功能 - 更多信息可在WWDC 2018 的 207 会议中找到,其中解释了有关安全性的更多内容

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

对于那些想要了解为什么会发生这种情况的更多背景信息以及如何解决它的人,请阅读以下内容。

随着 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 进行加密。

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


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

例如,如果我想绕过主机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下添加另一个字典属性。

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

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

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

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

例子

苹果文档 1

苹果文档 2

有两种解决方案:

解决方案 1:

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

Plist结构应如下图所示。

解决方案 1

解决方案 2:

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

Plist结构应如下图所示。

解决方案 2

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

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

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

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

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

⛔️不要使用不良做法!

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

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


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

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

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

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

异常

开发示例

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

在此处输入图像描述

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

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

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

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

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

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

转到您的 Info.plist

  1. 右键单击空白区域,然后单击添加行
  2. 将密钥名称写为 NSAppTransportSecurity,在它下面
  3. 选择异常域,向此添加新项目
  4. 写下您需要访问的域名
  5. 将域类型从字符串更改为字典,添加一个新项目
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个具有真值的布尔值。 看图正确跟随

本技术说明中所述,确定可以自动执行哪些设置:

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

注意:您的 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>

利用:

PList 截图以更好地理解

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

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>

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

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

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

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

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 中的新值是“App Transport Security Settings”。 从那里开始,这本字典应该包含:

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

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

如果上面的所有火箭科学都对您不起作用,请检查显而易见的:沙箱设置

沙盒设置]

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

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

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

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

2.使用项目信息。

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

在此处输入图像描述

** 最后!!! 已解决的应用程序传输安全性**

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

在此处输入图像描述

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

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

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>

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

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

它应该在里面:

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

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

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

Apple 在 iOS 9.0 中重新编写了 NSUrlConnection 类。 您可以在NSURLConnection中了解它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM