Permitir certificates SSL no verificados en WKWebView

Estoy intentando cargar una url HTTPS con un certificate autofirmado en un WKWebView para iOS 8 y sigue fallando. La solución alternativa utilizada con UIWebView (usando setAllowsAnyHTTPSCertificate de NSUrlRequest) no parece funcionar. ¿Alguien sabe de alguna solución?

No necesito una solución válida para AppStore, ya que solo necesito acceder a sitios de certificates autofirmados en fases de desarrollo, no en producción, pero es realmente un problema para el desarrollo y testing de instancias de server.

Gracias de antemano.

¡Esto se soluciona en iOS 9! WKWebView finalmente realiza llamadas a webView (_: didReceiveAuthenticationChallenge: completionHandler 🙂 en WKNavigationDelegate. Lamentablemente, esto no funciona si ejecutas un código incorporado en Xcode 7 en dispositivos iOS 8 (al less no en mis testings iniciales).

En mi ejemplo a continuación, en realidad no estoy haciendo nada con el certificate y simplemente dejándolo pasar sin hacer ninguna otra validation (obviamente, un mal plan para el código de producción). Consulte los documentos de Apple (Listado 3) para get más detalles sobre lo que quieren que haga aquí.

Rápido:

func webView(webView: WKWebView, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCnetworkingential?) -> Void) { let cnetworking = NSURLCnetworkingential.init(forTrust: challenge.protectionSpace.serverTrust!) completionHandler(.UseCnetworkingential, cnetworking) } 

Swift 3:

 let cnetworking = URLCnetworkingential(trust: challenge.protectionSpace.serverTrust!) completionHandler(.useCnetworkingential, cnetworking) 

C objective

 NSURLCnetworkingential * cnetworkingential = [[NSURLCnetworkingential alloc] initWithTrust:[challenge protectionSpace].serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCnetworkingential, cnetworkingential); 

Parece que puede que no haya una solución en esta etapa (iOS 8.1.1). Uno podría haber esperado el método webView:didReceiveAuthenticationChallenge:completionHandler: para manejar esto, pero basado en esta discusión en el foro de desarrolladores de Apple, un empleado de Apple confirma que este método de delegado actualmente no recibe una llamada cuando se encuentran certificates autofirmados.

Abra la URL en Safari en el dispositivo una vez, allí se le pedirá la opción de aceptar el certificate. Una vez aceptado, debería funcionar también en su aplicación, ya que el dispositivo conoce el certificate. Esta es una solución por dispositivo, de ninguna manera afectará a su aplicación en el momento del lanzamiento.

Tengo el mismo error y trato de solucionarlo usando la respuesta más votada arriba, utilicé el siguiente código para crear un object NSURLCnetworkingential , pero falló.

 NSURLCnetworkingential * cnetworkingential = [[NSURLCnetworkingential alloc] initWithTrust:[challenge protectionSpace].serverTrust]; 

Luego encontré una solución en los foros de desarrolladores de Apple . Esto me ayudó:

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

Objeto URL:

 NSURL *url = [NSURL URLWithString:urlAddress]; NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:requestObj delegate:self]; [connection start]; 

Y luego, agregue esto a su delegado:

 - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { [challenge.sender useCnetworkingential:[NSURLCnetworkingential cnetworkingentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; } else { [challenge.sender continueWithoutCnetworkingentialForAuthenticationChallenge:challenge]; } } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [resultData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *htmlString = [[NSString alloc] initWithBytes:[resultData bytes] length:[resultData length] encoding:NSUTF8StringEncoding]; [webView loadHTMLString:htmlString baseURL:url]; }