iOS9 不会从安全页面加载不安全的资源(SSL/HTTPS)

Posted

技术标签:

【中文标题】iOS9 不会从安全页面加载不安全的资源(SSL/HTTPS)【英文标题】:iOS9 does not load insecure resources from a secure page (SSL/HTTPS) 【发布时间】:2015-12-04 01:58:53 【问题描述】:

我正在尝试使用 https:// URL 将页面加载到 ios9 上的 UIWebView。加载的页面包括来自不安全服务器的 CSS 和图像。

例如加载的页面:https://www.example.com/ 其中包括样式表http://www.example.com /style.css 和图片 http://www.example.com/image.jpg

如果原始页面是通过不安全的连接(常规 http)加载的,则一切正常。一切都可以通过 HTTPS 和 HTTP 在 iOS8 上运行。

我确实在应用程序 PLIST 文件中将 NSAppTransportSecurity 设置为 NSAllowsArbitraryLoads

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

虽然通过 HTTPS 加载页面时,图像加载正常,但 CSS 文件加载不正常。似乎 UIWebView 会阻止从安全页面加载不安全的资源。

是否有任何 UIWebView 设置允许通过不安全的连接加载 CSS?

【问题讨论】:

如果您添加HSTS header,浏览器会自动将指向您域的所有 HTTP 链接升级为 HTTPS(但理想情况下,您也应该修复这些链接)。 有人对此有任何新的更新吗?现在是否可以使用 WKWebView 或新的 iOS 工具来做到这一点? @illis69,我不知道。不从安全页面加载不安全资源的要求是合理的,因此可能不会更改。 【参考方案1】:

这与 ATS 无关。 WebKit 强制执行混合内容策略,当通过 https 提供主机页面时,禁止通过不安全的连接加载对某些类别的“活动”内容(JS、CSS 等)的访问。

如果您在 Inspector 中检查您的页面,您会在错误面板中看到此报告。


跟进:您无法关闭混合内容阻止功能。允许不安全的 CSS 或 JS 会将整个页面的安全性降低到最不安全的资源。如果必须通过 http 加载 css/js,解决方案是通过 http 加载整个页面。这样,用户看到的 UI 就正确地反映了内容的安全性。

【讨论】:

作为修改后问题的后续:您不能关闭混合内容阻止。允许不安全的 CSS 或 JS 会将整个页面的安全性降低到最不安全的资源。如果必须通过 http 加载 css/js,解决方案是通过 http 加载整个页面。这样,用户看到的 UI 就能正确反映内容的安全性。 由于答案不允许我解决从不安全页面加载不安全内容的问题,这确实说明这是不可能的。标记为正确答案。【参考方案2】:

在您的 info.plist 中,您需要添加以下应用传输安全密钥:

NSAppTransportSecurity                                      Dictionary
    NSAllowsArbitraryLoads                                  Boolean       YES
    NSExceptionDomains                                      Dictionary    
        **YOUR-DOMAIN-HERE**                                Dictionary
            NSExceptionAllowsInsecureHTTPLoads              Boolean       YES
            NSIncludesSubdomains                            Boolean       YES
            NSThirdPartyExceptionAllowsInsecureHTTPLoads    Boolean       YES

希望这对你有用。

【讨论】:

那么,如果我的页面内部有多个链接引用并从外部源加载一些与添加的域无关的数据,它应该如何工作?! 如果您不想使用 NTS,您可以在 Info.plist 中简单地将 NSAllowsArbitraryLoads 设置为 true。否则,您将必须添加您要链接到的所有域。这是一个很好的链接,详细解释了它neglectedpotential.com/2015/06/…【参考方案3】:

App Transport Security 在 iOS9 版本中修订。现在,您的应用程序不会受到不安全连接的影响。 iOS 强制进行安全连接。在您的情况下,这可能会发生冲突。

来自Apple documentation

如果您的应用需要向不安全的域发出请求,您必须在应用的 Info.plist 文件中指定该域

所以我认为这在为网页加载 .css 文件时会产生问题。

所以尝试在info.plist 中指定您的域并检查.css 文件是否已加载。

编辑:


Spotlight:您需要在info.plist 中添加更多密钥。

看看这个键NSThirdPartyExceptionAllowsInsecureHTTPLoads这允许一个不受开发者控制的服务域并向传输层添加一个例外来绕过不安全的资源。

App Transport Security添加密钥的结构如下:

有关所有键的更多详细信息和说明,请查看此说明 - App Transport Security Technote

【讨论】:

将域添加到排除列表 (NSIncludesSubdomains) 没有帮助。该视图仍然不会为安全页面加载不安全的资源。【参考方案4】:

在 Xcode 8.3.3 (8E3004b) 上

已经改成

App Transport Security Settings > Allow Arbitrary Loads in Web Content > YES

【讨论】:

【参考方案5】:

下面的过程使我能够在 WKWebView 中打开不安全的内容。

    首先我在 App Transport Security Settings 字典中的 info.列表。

    我在 wkwebview 下面添加了委托方法:

    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) 完成处理程序(.useCredential,URLCredential(信任:challenge.protectionSpace.serverTrust!))

    第二步不要忘记将代理注册为:

    覆盖 func viewDidLoad() super.viewDidLoad() self.webView.navigationDelegate = 自我

【讨论】:

兄弟,这太棒了,找了这么久,谢谢。你拯救了我的一天【参考方案6】:

我使用 webkit 工具,但我无法打开 ssl 不允许的链接(一些 https 链接),它可以通过此代码在 swift4 上运行(您必须先声明委托)

override func viewDidLoad() 
    super.viewDidLoad()

    let url = URL(string: currentAttach.fileUrl!)
    let req = URLRequest(url:url!)
    self.webView!.load(req)
    self.webView.navigationDelegate = self

    


extension ViewController: WKNavigationDelegate

    //MARK:- WKNavigationDelegate
    //For Allow SSL https
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) 
        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) 
        print(error.localizedDescription)
    

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) 
        print("Strat to load")
        startLoading()
    

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
        print("finish to load")
        stopLoading()
    


【讨论】:

以上是关于iOS9 不会从安全页面加载不安全的资源(SSL/HTTPS)的主要内容,如果未能解决你的问题,请参考以下文章

应用传输安全问题 iOS9

如何在HTTPS里调用HTTP资源不出现提示框

SSL:不安全的内容 IE

关于Jsonp 跨域

内容安全策略:页面的设置阻止了资源的加载

基于Nginx服务器和iOS9的HTTPS安全通信