传输安全性已阻止明文 HTTP

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

传输安全性由于不安全,阻止了明文 HTTP(http://)资源加载。可以通过应用程序的 Info.plist 文件配置临时异常。

Xcode

假设我的域名是example.com

答案

使用 NSAppTransportSecurity:

在此处输入图片说明

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

Plist配置

这是直观的设置:

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

请参阅论坛中的应用程序传输安全性?

同样是在 iOS 9 和 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 文件,因此您可以将此代码或多或少地放在文件内的任何位置。

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

在此处输入图片说明

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

这已经过测试,并且正在 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 的域。

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

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

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

NSAllows 任意负载
一个布尔值,用于为未在 NSExceptionDomains 词典中列出的任何域禁用应用程序传输安全性。列出的域使用为该域指定的设置。

默认值为 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),并添加例外以仅允许我们知道可以使用的地址。

对于感兴趣的读者

2018 年更新:

苹果不建议您关闭此功能 - 可以在207 届 WWDC 2018 中找到更多信息,并在安全方面进行了更多说明

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

对于那些想要更多了解为何发生这种情况的人,除了如何解决它之外,请阅读以下内容。

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

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

App Transport Security 技术说明中所述,在与 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文件,然后单击 “鼠标右键”,然后选择 “ 另存为” >“ 源代码”菜单选项。属性列表文件将出现在右窗格中。

  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

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

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

    • 在最后一行添加 +
    • 输入组的名称: App Transport 安全设置
    • 右键单击组,然后选择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. 添加元素与键 “ NSIncludesSubdomains类型的” Boolean和值集合作为YES
  5. 添加键类型为Boolean且键值设置为YES元素 “ NSTemporaryExceptionAllowsInsecureHTTPLoads ” 的元素

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>