传输安全已经阻止了明文HTTP
根据下面的错误信息,我需要在我的info.plist
放置什么样的设置来启用HTTP模式?
传输安全性已经阻止了明文HTTP(http://)资源负载,因为它是不安全的。 临时例外可以通过您的应用程序的Info.plist文件进行configuration。
假设我的域名是example.com
。
如果您使用Xcode 8.0和Swift 3.0或Swift 2.2:
<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>
使用:
您必须在.plist文件的NSAppTransportSecurity字典下将NSAllowsArbitraryLoads键设置为YES 。
以下是可视化设置:
请参阅论坛post应用程序运输安全? 。
另外, 在iOS 9和OSX 10.11中configurationApp Transport安全例外 。
例如,您可以添加一个特定的域名,如:
<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文件,所以你可以把这个代码或多或less放在文件的任何地方。
这已经过testing,并且正在使用iOS 9 GM种子 – 这是允许特定域使用HTTP而不是HTTPS的configuration:
<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的某些域。
这是一个快速的解决方法(但不build议)将其添加到plist中:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
这意味着(根据苹果的文档 ):
NSAllowsArbitraryLoads
一个布尔值,用于禁用NSExceptionDomains字典中未列出的任何域的App Transport Security。 列出的域使用为该域指定的设置。NO的默认值要求所有连接的默认App Transport安全性行为。
我真的推荐链接:
- 苹果的技术说明
- WWDC 2015会话706(安全和您的应用程序)从1:50开始
- WWDC 2015会话711(与NSURLSession联网)
- 博客文章使用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),并添加例外,只允许我们知道的地址是好的。
感兴趣的读者
对于那些想要更加了解为什么发生这种情况的人,除了如何解决这个问题之外,请阅读下面的内容。
随着iOS 9的推出,为了提高应用程序与Web服务之间的连接安全性,应用程序与其Web服务之间的安全连接必须遵循最佳实践 。 最佳做法行为由App Transport Security强制执行:
- 防止意外泄露
- 提供一个安全的默认行为。
如App Transport Security Technote中所解释的,在与您的Web服务进行通信时,App Transport Security现在具有以下要求和行为:
- 服务器必须至less支持传输层安全性(TLS)协议版本1.2。
- 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表)。
- 证书必须使用SHA256或更好的签名散列algorithm进行签名,并使用2048位或更大的RSA密钥或256位或更大的椭圆曲线(ECC)密钥。
- 无效的证书导致硬故障并且没有连接。
换句话说,您的Web服务请求应该:a。)使用HTTPS ,b。)使用TLS v1.2进行encryption并保密。
但是,正如其他post中提到的那样,您可以通过在应用程序的Info.plist
中指定不安全的域来从应用程序传输安全性中覆盖此新行为。
要覆盖,您需要将NSAppTransportSecurity
> NSExceptionDomains
字典属性添加到Info.plist
。 接下来,您将将Web服务的域添加到NSExceptionDomains
字典中。
例如,如果我想绕过主机http://www.yourwebservicehost.com上的Web服务的App Transport Security行为,那么我将执行以下操作:
-
在Xcode中打开你的应用程序。
-
在Project Navigator中find
Info.plist
文件,然后点击鼠标右键并selectOpen 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
下添加另一个字典属性。
要了解更多关于上面引用的键,请阅读这个已经提到的技术 。
我不喜欢直接编辑plist。 您可以使用GUI轻松将其添加到plist:
- 点击左侧导航栏中的Info.plist。
-
现在改变主要区域的数据:
- 在最后一行添加+
- input组的名称: 应用程序传输安全设置
- 右键单击该组并select
Add Row
- input允许任意负载
- 将右侧的值设置为YES
有两个解决scheme:
解决scheme1:
- 在
Info.plist
文件中添加一个密钥为“NSAppTransportSecurity
”的字典 - 使用键
'Allow Arbitrary Loads'
添加字典内的另一个元素
Plist
结构应该如下图所示。
解决scheme2:
- 在
Info.plist
文件中添加一个密钥为“NSAppTransportSecurity
”的字典 - 使用键“
NSExceptionDomains
”添加字典内的另一个元素 - 添加types为NSDictionary的键
'MyDomainName.com'
的元素 - 添加具有
Boolean
型键值“NSIncludesSubdomains
”的元素,并将值设置为YES
- 添加具有
Boolean
型键值“NSTemporaryExceptionAllowsInsecureHTTPLoads
”的元素,并将值设置为YES
Plist
结构应该如下图所示。
解决scheme2是首选,因为它只允许选定的域,而解决scheme1允许所有不安全的HTTP连接。
运输安全可在iOS 9.0或更高版本上使用。 尝试在应用程序中调用WS时,可能会出现此警告:
应用程序传输安全性已阻止明文HTTP(http://)资源加载,因为它是不安全的。 临时例外可以通过您的应用程序的Info.plist文件进行configuration。
将以下内容添加到Info.plist将禁用ATS:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key><true/> </dict>
确定要使用的设置可以自动执行,如本技术说明中所述 :
/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
开发例子
下面是一个保持ATS完整(=安全)的plist屏幕截图,但允许通过HTTP而不是HTTPS连接到本地主机 。 它在Xcode 7.1.1中起作用。
使用:
在types为Dictionary的plist文件中添加一个新的项NSAppTransportSecurity ,然后在布尔types的字典中添加子项NSAllowsArbitraryLoads ,并设置布尔值YES 。 这对我有用。
在2015-09-25(在Xcode在2015-09-18更新之后):
我使用了一个非懒惰的方法,但它没有工作。 以下是我的尝试。
第一,
<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>
这可能有点不安全,但我找不到其他解决scheme。
转到您的Info.plist
- 右键单击空白处并单击添加行
- 将密钥名称写为NSAppTransportSecurity,在它下面
- select例外域,添加一个新的项目
- 写下你需要访问的域名
- 将域types从string更改为字典,添加一个新的项目
- NSTemporaryExceptionAllowsInsecureHTTPLoads,这将是一个真值的布尔值。
注意:你的plist中的exception域应该是LOWER-CASE。
例如:您已经在设置 - >共享下为您的机器命名为“MyAwesomeMacbook” 您的服务器(用于testing目的)正在MyAwesomeMacbook.local:3000上运行,并且您的应用程序需要向http://MyAwesomeMacbook.local:3000 / files发送请求,您的plist需要指定“myawesomemacbook”。本地“作为例外域。
–
您的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 7.1,面临问题27.10.15:
Info.plist中的新值是“应用程序传输安全设置”。 从那里,这本字典应该包含:
- 允许任意负载= YES
- 例外域名(在这里插入你的http域名)
值得一提的是如何到达那里
Info.plist是Main.storyboard或viewController.swift下面的文件之一。
当你第一次点击时,通常是表格格式,所以右键单击文件并select“打开为”源代码,然后将代码添加到最后,即:
<key>NSAppTransportSecurity</key><dict><key>NSAllowsArbitraryLoads</key><true/></dict>
复制粘贴上面的代码
"</dict> </plist>"
这是最后。
根据苹果公司的说法,通常禁用ATS会导致应用程序拒绝,除非你有充分的理由这样做。 即使这样,您也应该为可以安全访问的域添加例外情况。
苹果有一个很好的工具,告诉你什么设置使用:在terminal,input
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever
nscurl会检查这个请求是否失败,然后尝试各种设置,告诉你究竟哪一个通过了,怎么做。 例如,对于我访问的一些第三方URL,这个命令告诉我这个字典通过:
{ NSExceptionDomains = { "www.example.com" = { NSExceptionRequiresForwardSecrecy = false; }; }; }
要区分您自己的网站和不受控制的第三方网站,请使用例如NSThirdPartyExceptionRequiresForwardSecrecy键。
对于那些来这里试图find他们的WKWebView为什么总是白色的原因,并没有加载任何东西(正如我在这里所描述的, 我如何让WKWebView工作在迅速和MacOS应用程序 ):
如果上面所有的火箭科学都不适合你,请检查一下显而易见的内容:沙盒设置
作为swift和cocoa的新手,在编程方面非常有经验,我花了20个小时才find这个解决scheme。 没有几十个时髦iOS的教程,也没有苹果的主题演讲 – 没有提到这个小checkbox。
对于Cordova,如果你想把它添加到你的ios.json中,请执行以下操作:
"NSAppTransportSecurity": [ { "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>" } ]
它应该在里面:
"*-Info.plist": { "parents": { } }
使用NSExceptionDomains
可能不会同时应用效果,因为目标站点可能会通过http
加载来自外部域的资源(例如js
文件)。 可以通过将这些外部域添加到NSExceptionDomains
来解决此问题。
要检查哪些资源无法加载,请尝试使用远程debugging。 这里是一个教程: http : //geeklearning.io/apache-cordova-and-remote-debugging-on-ios/
像许多人已经注意到的那样,这是iOS 9.0的一个function问题。 他们添加了一个名为App Transport Security的东西,当我的应用程序崩溃时,我也很恼火。
您可以在.plist文件的NSAppTransportSecurity字典中将NSAllowsArbitraryLoads键设置为YES,但最终需要重新编写构成您的URL的代码以形成HTTPS://前缀。
苹果已经在iOS 9.0中重写了NSUrlConnection类。 你可以在NSURLConnection中看到它。
否则,您可能不得不退出iOS 9.0,直到您有时间实施正确的解决scheme。