提问人:Jeef 提问时间:7/7/2015 最后编辑:jwwJeef 更新时间:11/1/2023 访问量:947120
传输安全性阻止了明文 HTTP
Transport security has blocked a cleartext HTTP
问:
根据以下错误消息,我需要在 HTTP 中设置什么设置才能启用 HTTP 模式?info.plist
传输安全已阻止明文 HTTP (http://) 资源 加载,因为它不安全。可以通过以下方式配置临时例外 应用的 Info.plist 文件。
假设我的域是 。example.com
答:
请参阅论坛帖子 Application Transport Security?。
例如,您可以添加一个特定的域,例如:
<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>
###Note:
info.plist
是一个 XML 文件,因此您可以将此代码或多或少地放在文件中的任何位置。
评论
使用 NSAppTransportSecurity:
您必须在 info.plist 文件中的 NSAppTransportSecurity 字典下将 NSAllowsArbitraryLoads 键设置为 YES。
评论
这是在 plist 中添加以下内容的快速解决方法(但不推荐):
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这意味着(根据 Apple 的文档):
NSAllowsArbitraryLoads 一个布尔值,用于对 NSExceptionDomains
字典中未列出的任何域禁用 App Transport Security。列出的域使用为该域指定的设置。默认值 NO 要求所有连接都采用默认的应用传输安全行为。
我真的推荐链接:
- Apple 的技术说明
- WWDC 2015 会议 706(安全和您的应用程序)在 1:50 左右开始
- WWDC 2015 会议 711(使用 NSURLSession 联网)
- 博客文章 Shipping an App With 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>
禁止对所有页面进行任意调用,但 for 将允许连接使用 HTTP 协议。PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE
在上面的 XML 中,您可以添加:
<key>NSIncludesSubdomains</key>
<true/>
如果要允许指定地址的子域进行不安全的连接。
最好的方法是阻止所有任意加载(设置为 false)并添加例外以仅允许我们知道没问题的地址。
2018年更新:
Apple 不建议将其关闭 - 更多信息可以在 207 会议中找到 WWDC 2018,其中解释了有关安全性的更多内容
由于历史原因和发展阶段而留下原始答案
评论
NSAllowsArbitraryLoads
必须是false
<key>NSIncludesSubdomains</key> <true/>
<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
must 是 ,因为它不允许所有不安全的连接,但例外列表允许连接到某些没有 HTTPS 的域。false
这是视觉上的:
评论
传输安全性在 iOS 9.0 或更高版本上可用。尝试在应用程序中调用 WS 时,可能会收到以下警告:
应用程序传输安全性已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时例外。
将以下内容添加到 Info.plist 将禁用 ATS:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
评论
用:
在 plist 文件中添加一个类型为 Dictionary 的新项 NSAppTransportSecurity,然后在 Boolean 类型的字典中添加子项 NSAllowsArbitraryLoads,并将 bool 值设置为 YES。 这对我有用。
评论
对于那些想要了解为什么会发生这种情况的人,除了如何解决它之外,请阅读下文。
随着 iOS 9 的推出,为了提高应用与 Web 服务之间连接的安全性,应用与其 Web 服务之间的安全连接必须遵循最佳做法。应用程序传输安全性强制执行最佳做法行为,以便:
- 防止意外泄露,以及
- 提供安全的默认行为。
如应用传输安全技术说明中所述,在与 Web 服务通信时,应用传输安全现在具有以下要求和行为:
- 服务器必须至少支持传输层安全性 (TLS) 协议版本 1.2。
- 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表)。
- 必须使用 SHA256 或更好的签名哈希算法对证书进行签名,该算法具有 2048 位或更高的 RSA 密钥,或者 256 位或 更大的椭圆曲线 (ECC) 键。
- 无效的证书会导致硬故障和无连接。
换言之,您的 Web 服务请求应:a.)使用 HTTPS 和 b.)使用具有前向保密功能的 TLS v1.2 进行加密。
但是,正如在其他文章中提到的,您可以通过在应用程序中指定不安全的域来覆盖应用程序传输安全性中的这种新行为。Info.plist
要覆盖,您需要将 > 字典属性添加到 .接下来,将 Web 服务的域添加到字典中。NSAppTransportSecurity
NSExceptionDomains
Info.plist
NSExceptionDomains
例如,如果我想绕过主机 www.yourwebservicehost.com 上 Web 服务的应用程序传输安全行为,那么我将执行以下操作:
在 Xcode 中打开您的 App。
在 Project Navigator 中找到该文件,然后单击“鼠标右键”,然后选择“打开为源代码>”菜单选项。属性列表文件将显示在右窗格中。
Info.plist
将以下属性块放在主属性字典中(在第一个 )。
<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
要了解有关上面引用的键的更多信息,请阅读此已经提到的技术说明。
评论
./platforms/ios/<project>/<project>-Info.plist
NSAllowsArbitraryLoads=false
NSAllowsArbitraryLoads=true
config.xml
<access origin=.../>
<access origin="*"/>
NSAllowsArbitraryLoads=true
NSExceptionAllowsInsecureHTTPLoads
true
在 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>
这可能有点不安全,但我找不到其他解决方案。
评论
NSAllowsArbitraryLoads
true
正如许多人所指出的那样,这是iOS 9.0附带的功能问题。他们添加了一个名为 App Transport Security 的东西,当它破坏我的应用程序时,我也很生气。
您可以在 .plist 文件中的 NSAppTransportSecurity 字典下使用 NSAllowsArbitraryLoads 键将其包扎为 YES,但最终您需要重新编写构成 URL 的代码以形成 HTTPS:// 前缀。
Apple 在 iOS 9.0 中重写了 NSUrlConnection 类。您可以在 NSURLConnection 中阅读有关它的信息。
否则,您可能需要退出iOS 9.0,直到您有时间实施正确的解决方案。
弄清楚要使用的设置可以自动执行,如本技术说明所述:
/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>"
这是在最后。
评论
NSAllowsArbitraryLoads
true
Xcode 7.1 更新,面临问题 27.10.15:
Info.plist 中的新值是“应用传输安全设置”。 从那里,这本词典应该包含:
- 允许任意负载 = 是
- 例外域(在此处插入您的 http 域)
我不喜欢直接编辑plist。您可以使用 GUI 轻松地将其添加到 plist 中:
- 单击左侧导航器中的 Info.plist。
现在更改主区域中的数据:
- 在最后一行添加 +
- 输入组的名称:应用传输安全设置
- 右键单击该组,然后选择
Add Row
- 输入“允许任意负载”
- 将右侧的值设置为“是”
评论
NSAllowsArbitraryLoads
YES
以下是直观的设置:
评论
开发实例
下面是一个 plist 的屏幕截图,它保持 ATS 完好无损(=安全),但允许通过 HTTP 而不是 HTTPS 与 localhost 建立连接。它适用于 Xcode 7.1.1。
评论
NSExceptionAllowsInsecureHTTPLoads - YES
有两种解决方案:
解决方案 1 :
- 在文件中添加一个带有键的字典
Info.plist
NSAppTransportSecurity
' - 在字典中添加另一个带有键的元素
'Allow Arbitrary Loads'
Plist
结构应如下图所示。
解决方案 2 :
- 在文件中添加一个带有键的字典
Info.plist
NSAppTransportSecurity
' - 在字典中添加另一个元素,键为 ”
NSExceptionDomains
' - 添加键类型为 NSDictionary 的元素
'MyDomainName.com'
- 添加键 '' 的元素,其类型和值设置为
NSIncludesSubdomains
Boolean
YES
- 添加键 '' 的元素,其类型和值设置为
NSTemporaryExceptionAllowsInsecureHTTPLoads
Boolean
YES
Plist
结构应如下图所示。
解决方案 2 是首选,因为它只允许选定的域,而解决方案 1 允许所有不安全的 HTTP 连接。
评论
NSAllowsArbitraryLoads
YES
对于 Cordova,如果要将其添加到ios.json中,请执行以下操作:
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
}
]
它应该在以下部分:
"*-Info.plist": {
"parents": {
}
}
评论
NSAllowsArbitraryLoads
true
根据 Apple 的说法,通常禁用 ATS 会导致应用程序被拒绝,除非您有充分的理由这样做。即便如此,您也应该为可以安全访问的域添加例外。
Apple 有一个出色的工具,可以准确地告诉您要使用哪些设置:在“终端”中,输入
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
nscurl 会检查这个请求是否失败,然后尝试各种设置,并告诉你到底是哪一个通过,以及该怎么做。例如,对于我访问的某些第三方 URL,此命令告诉我此字典通过:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
若要区分你自己的网站和不受你控制的第三方网站,请使用密钥 NSThirdPartyExceptionRequiresForwardSecrecy。
评论
NSExceptionAllowsInsecureHTTPLoads = true;
注意:plist 中的例外域应为小写。
示例:您在“设置”->“共享”下将机器命名为“MyAwesomeMacbook”;您的服务器(用于测试目的)在 MyAwesomeMacbook.local:3000 上运行,并且您的应用程序需要向 http://MyAwesomeMacbook.local:3000/files...(您的列表)发送请求,您需要将“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>
评论
NSAllowsArbitraryLoads
true
转到您的 Info.plist
- 右键单击空白区域,然后单击添加行
- 将密钥名称写为 NSAppTransportSecurity,在其下
- 选择“例外域”,向此添加新项目
- 写下您需要访问的域名
- 将“域类型”从“字符串”更改为“字典”,添加新项目
- NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个具有 true 值的布尔值。
评论
NSAllowsArbitraryLoads
true
由于目标站点可能会加载资源(例如 files) 从外部域 .也可以通过将这些外部域添加到中来解决此问题。NSExceptionDomains
js
http
NSExceptionDomains
若要检查无法加载哪些资源,请尝试使用远程调试。这是一个教程:http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/
对于那些来到这里试图找到他们的 WKWebView 总是白色并且不加载任何内容的原因的人(完全如此描述,我如何让 WKWebView 在 swift 和 macOS 应用程序中工作):
如果上述所有火箭科学都不适合您,请检查显而易见的:沙盒设置
作为 swift 和 cocoa 的新手,但在编程方面非常有经验,我花了大约 20 个小时来找到这个解决方案。几十个时髦的 iOS 教程和苹果主题演讲都没有——没有人提到这个小复选框。
评论
在 swift 4 和 xocde 10 中,将 NSAllowsArbitraryLoads 更改为允许任意负载。所以它将看起来像这样:
<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. 使用项目信息。
在左侧窗格中单击项目上的项目,选择项目作为目标,然后选择“信息”选项卡。您必须按以下结构添加字典。
如何解决?
以下步骤可以修复它。
⛔️ 不要使用不良做法!
许多答案(包括已接受的答案)都告诉您,通过设置 to (或 )。这是网络请求最危险的设置!它仅用于测试和临时目的。Allow Arbitrary Loads
Yes
true
你可以看到这位 Apple 工程师在 WWDC18 中清楚地说出了这一点,即使是对于 Web 内容,你也试图允许它们!
✅ 设置为 !!Allow Arbitrary Loads
NO
您必须始终用于您的网络内容。但是,如果您确实做不到,只需在HTTPS
info.plist
例如,如果您正在使用并收到该错误,则必须将其更改为(使用 s),因为它完全支持。http://google.com
https://google.com
但是,如果你不能以某种方式(并且你不能说服后端开发人员支持SSL),请将这个不安全的域添加到(而不是使其可用于所有不安全的网络!info.plist
)
**最后!!!已解决的应用传输安全性 **
1. Follow the follow the screen shot. Do it in Targets info Section.
我们有两种方法可以克服这个问题。我们需要添加 inSwift 5
NSAppTransportSecurity
info.plist
我给出源代码和图像供参考info.plist
第一个是将 -> 添加到 中。NSAppTransportSecurity
NSAllowsArbitraryLoads
info.plist
<?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>
另一种方法是添加 -> 并添加 URL 的域并启用加载 sub-domains() 和允许不安全的 HTTP 加载(NSAppTransportSecurity
NSExceptionDomains
info.plist
NSIncludesSubdomains
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>
打开 info.plist 文件
添加一个名为 Dictionary 的键。
App Transport Security Settings
添加一个名为 Boolean 的 Subkey,并将其值设置为 YES,如下图所示。
Allow Arbitrary Loads
最后,清理项目(使用 Command+Shift+K)并完成。
或者,在代码中:
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
// .....
</dict>
评论
Allow arbitary loads