允许WKWebView中未经验证的ssl证书

时间:2014-11-24 08:24:45

标签: ios ssl uiwebview self-signed wkwebview

我尝试在适用于iOS 8的WKWebView中加载带有自签名证书的HTTPS网址,但它仍然失败。与UIWebView一起使用的解决方法(使用来自NSUrlRequest的setAllowsAnyHTTPSCertificate)似乎不起作用。有谁知道任何解决方法?

我不需要对AppStore有效的解决方案,因为我只需要在开发阶段访问自签名证书站点,而不是在生产阶段访问,但它对于开发和测试服务器实例来说确实是一个问题。

提前谢谢。

7 个答案:

答案 0 :(得分:4)

在这个阶段看起来可能没有解决方案(iOS 8.1.1)。有人可能期望WKNavigationDelegate方法webView:didReceiveAuthenticationChallenge:completionHandler:来处理这个问题,但是基于这个Apple developer forum discussion,Apple员工确认当遇到自签名证书时,当前不会调用此委托方法。

答案 1 :(得分:3)

我有同样的错误,并尝试使用上面的最投票答案解决它,我使用以下代码创建一个NSURLCredential对象,但它失败了。

NSURLCredential * credential = [[NSURLCredential alloc] initWithTrust:[challenge protectionSpace].serverTrust];

然后我在Apple Developer Forums找到了解决方案。这对我有所帮助:

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
  NSLog(@"Allow all");
  SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
  CFDataRef exceptions = SecTrustCopyExceptions (serverTrust);
  SecTrustSetExceptions (serverTrust, exceptions);
  CFRelease (exceptions);
  completionHandler (NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:serverTrust]);
  }

答案 2 :(得分:3)

Try this:

 func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

    if let serverTrust = challenge.protectionSpace.serverTrust {
        let credential = URLCredential(trust: serverTrust)
        completionHandler(.useCredential, credential)
    }else{
         completionHandler(.useCredential, nil)
    }

}

答案 3 :(得分:0)

在设备的Safari中打开一次URL,系统会提示您选择接受证书。一旦被接受,它也应该在您的应用程序中工作,因为该设备现在已知证书。 这是每个设备的解决方法,它不会在发布时影响您的应用。

答案 4 :(得分:0)

作为ios新手,我花了很多时间研究这个问题,我认为所提出的解决方案都不是完整的。因此,这就是我为使WKWebView在我的情况下工作而要做的事情(非常简单的Web视图,仅需要 dev 才能访问自签名证书):

第一件事:在我的根Info.plist文件中,添加了“ App Transport Security设置”作为字典,并添加了“允许任意加载”项,其值为YES。

App Transport Security Settings Allow Arbitrary Loads

第二:我将此代码添加到我的ViewController中(继承了UIViewController和WKNavigationDelegate)-这是从其他地方的几个答案中获得的

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    guard let serverTrust = challenge.protectionSpace.serverTrust else { return completionHandler(.useCredential, nil) }
    let exceptions = SecTrustCopyExceptions(serverTrust)
    SecTrustSetExceptions(serverTrust, exceptions)
    completionHandler(.useCredential, URLCredential(trust: serverTrust))
}

请注意,此解决方案可能会被应用程序商店拒绝-我将提交具有“允许任意负载”项目且值为NO的应用程序商店。

答案 5 :(得分:0)

以下情况适用于我加载HTTP或HTTPS网址的情况

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    return completionHandler(.useCredential, nil)
}

如果您正在加载不安全的HTTP URL(例如http://www.example.com),则需要打开Info.plist并打开NSExceptionAllowsInsecureHTTPLoads,如下所示:

enter image description here

答案 6 :(得分:0)

iOS 10+ 忽略 NSAllowsArbitraryLoads:检查 here。并且对其他标志要谨慎,因为 Apple 会要求 AppStore 审查的理由。而忽略UIWebview相关的解决方案,苹果无论如何都会拒绝。

简单的方法

  1. 在设备上下载自签名根 CA
  2. 在设置中信任它> about > ...证书..

这显然不适合大量目标受众。

更好但更难的方式

  1. 阅读guideline
  2. 实现 WKNavigationDelegate webView(_:didReceive:completionHandler:)

更多关于 websocket (OSError -9807)

有一个 unfixed webkit bug for websocket (since 2015!),它是不同的身份验证路由,因此目前无法覆盖系统默认行为。 Apple 论坛主题: