请参阅论坛帖子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>
###注意:
info.plist
是一个XML文件,所以您可以将此代码放置在文件的任何位置。
<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 的域。
这里是可视化的结构图:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
这些将帮助我理解原因和所有影响。
下面的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/>
NSAllowsArbitraryLoads
必须为 false
。 - Sound Blaster<key>NSIncludesSubdomains</key><true/>
?每个设置都必须用<dict>
包围吗?你怎么编辑这个该死的plist文件?格式是什么样的?:D 谢谢。 - Agent Zebra对于那些想要更多了解为什么会发生这种情况的人,以及如何解决,可以继续阅读下面的内容。
随着 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 服务的 App Transport Security 行为,那么我将执行以下操作:
在 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
下方添加另一个字典属性。./platforms/ios/<project>/<project>-Info.plist
,其中包含NSAllowsArbitraryLoads=false
和许多例外域到具有不同TLS/HTTP/HTTPS组合的服务。最初使用了NSAllowsArbitraryLoads=true
,然后通过试错排除规则来调整,以符合指南并提交审批。请注意,config.xml
<access origin=.../>
语句部分填充此文件,但目前需要通过直接编辑或通过XCode进行调整以获取正确的详细信息。 - jimmont<access origin="*"/>
(在config.xml中)设置了 NSAllowsArbitraryLoads=true
(适用于Cordova/Phonegap/hybrid应用程序)。 - jimmontNSExceptionAllowsInsecureHTTPLoads
设置为 true
?这会破坏 ATS 的目的。同时请参考 The most dangerous code in the world: validating SSL certificates in non-browser software。你的软件刚刚被列入其中。 - jwwNSAllowsArbitraryLoads
设置为 YES
?这会逆转ATS的目的。另请参见《世界上最危险的代码:在非浏览器软件中验证SSL证书》(http://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html)。你的软件刚刚上了名单。 - jww有两种解决方案:
解决方案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 连接。
许多答案(包括被接受的答案)告诉你通过将“允许任意加载”设置为“是”(或“true”),完全不加保护地进行应用程序的网络通信!那是最危险的网络请求设置!而且它仅限于测试和临时目的。
您可以在 WWDC18 中看到这位苹果工程师明确表态,即使对于 Web 内容,您也正在尝试允许所有这些内容!
您必须始终为您的网络事务使用HTTPS。但如果您真的无法这样做,只需向info.plist
添加一个异常即可。
例如,如果您正在使用 http://google.com
并得到该错误,您必须将其改为支持 HTTPS 的 https://google.com
(加上s)。
但如果你无法这样做(并且你无法说服后端开发人员支持 SSL),只需将此未加保护的域添加到 info.plist
中即可(而不是使其对于所有未加保护的网络!)