[英]App Transport Security has blocked a cleartext HTTP XCode 7.1
[英]Transport security has blocked a cleartext HTTP
请参阅论坛帖子应用程序传输安全性? .
例如,您可以添加特定域,例如:
<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 的某些域。
这是视觉上的:
这是在 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 服务的应用程序传输安全行为,那么我将执行以下操作:
在 Xcode 中打开您的应用程序。
在 Project Navigator 中找到Info.plist
文件并“鼠标右键”单击它并选择Open As > Source Code菜单选项。 属性列表文件将出现在右窗格中。
将以下属性块放在主属性字典中(在第一个<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
下添加另一个字典属性。
要了解有关上述键的更多信息,请阅读此已提及的技术说明。
有两种解决方案:
解决方案 1:
Info.plist
文件中添加一个带有键' NSAppTransportSecurity
'的字典'Allow Arbitrary Loads'
Plist
结构应如下图所示。
解决方案 2:
Info.plist
文件中添加一个带有键' NSAppTransportSecurity
'的字典NSExceptionDomains
''MyDomainName.com'
的元素Boolean
类型的键“ NSIncludesSubdomains
”且值设置为YES
的元素Boolean
类型的键“ NSTemporaryExceptionAllowsInsecureHTTPLoads
”且值设置为YES
的元素 Plist
结构应如下图所示。
首选解决方案 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! )
根据 Apple 的说法,通常禁用 ATS 会导致应用被拒绝,除非您有充分的理由这样做。 即使这样,您也应该为可以安全访问的域添加例外。
Apple 有一个出色的工具,可以准确地告诉您要使用的设置:在终端中,输入
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
而nscurl会检查这个请求是否失败,然后尝试各种设置并告诉你到底哪一个通过了,怎么办。 例如,对于我访问的一些第三方 URL,这个命令告诉我这个字典通过了:
{
NSExceptionDomains = {
"www.example.com" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
要区分您自己的网站和您无法控制的第三方网站,请使用密钥 NSThirdPartyExceptionRequiresForwardSecrecy。
如本技术说明中所述,确定可以自动执行哪些设置:
/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>
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”。 从那里开始,这本字典应该包含:
对于那些来到这里试图找到他们的 WKWebView 总是白色并且什么都不加载的原因的人(正如这里所描述的, 我如何让 WKWebView 在 swift 和 macOS 应用程序中工作):
如果上面的所有火箭科学都对您不起作用,请检查显而易见的:沙箱设置
作为 swift 和 cocoa 的新手,但在编程方面非常有经验,我花了大约 20 个小时来找到这个解决方案。 几十个时髦的 iOS 教程和苹果的主题演讲都没有——没有提到这个小复选框。
使用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.