Autoriser les certificates SSL non vérifiés dans WKWebView

J'essaye de charger une URL de HTTPS avec un certificate auto-signé dans un WKWebView pour iOS 8 et il continue à échouer. La solution de contournement utilisée avec UIWebView (using setAllowsAnyHTTPSCertificate de NSUrlRequest) ne semble pas fonctionner. Est-ce que quelqu'un sait d'une solution de contournement?

Je n'ai pas besoin d'une solution valable pour AppStore, car j'ai seulement besoin d'accéder à des sites de certificates autosignés sur les phases de développement, pas sur la production, mais c'est vraiment un problème pour le développement et le test des instances de server.

Merci d'avance.

Ceci est corrigé dans iOS 9! WKWebView effectue enfin des appels à webView (_: didReceiveAuthenticationChallenge: completionHandler 🙂 sur WKNavigationDelegate. Malheureusement, cela ne fonctionne pas si vous exécutez du code embedded dans Xcode 7 sur iOS 8 (du less pas lors de mon test initial).

Dans mon exemple ci-dessous, je ne fais rien avec le CERT et je le laisse passer sans faire de validation supplémentaire (évidemment un mauvais plan pour le code de production). Voir les documents d'Apple (Listing 3) pour plus de détails sur ce qu'ils veulent que vous fassiez ici.

Rapide:

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

Swift 3:

 let cred = URLCredential(trust: challenge.protectionSpace.serverTrust!) completionHandler(.useCredential, cred) 

Swift 4:

 func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { let cred = URLCredential(trust: challenge.protectionSpace.serverTrust!) completionHandler(.useCredential, cred) } 

Objectif c

 NSURLCredential * credential = [[NSURLCredential alloc] initWithTrust:[challenge protectionSpace].serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential, credential); 

On dirait qu'il n'y a peut-être pas de solution à ce stade (iOS 8.1.1). On aurait pu s'attendre à la méthode webView:didReceiveAuthenticationChallenge:completionHandler: pour gérer cela, mais en se basant sur cette discussion sur le forum des développeurs Apple, un employé d'Apple confirme que cette méthode de délégué n'est pas appelée lorsque des certificates auto-signés sont rencontrés.

J'ai la même erreur, et essayez de le résoudre en utilisant la réponse la plus votée ci-dessus, j'ai utilisé le code suivant pour créer un object NSURLCredential , mais il a échoué.

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

Ensuite, j'ai trouvé une solution dans Apple Developer Forums . Cela m'a aidé:

 - (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]); } 

Ouvrez l'URL dans Safari sur l'appareil une fois, vous serez invité avec l'option d'accepter le certificate. Une fois accepté, il devrait également fonctionner dans votre application, car le certificate est maintenant connu de l'appareil. Il s'agit d'une solution de contournement par périphérique, cela n'affectera en aucun cas votre application au moment de la publication.

Objet URL:

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

Et puis, ajoutez ceci à votre délégué:

 - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { return [protectionSpace.authenticationMethod isEqualToSsortingng:NSURLAuthenticationMethodServerTrust]; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToSsortingng:NSURLAuthenticationMethodServerTrust]) { [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; } else { [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [resultData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSSsortingng *htmlSsortingng = [[NSSsortingng alloc] initWithBytes:[resultData bytes] length:[resultData length] encoding:NSUTF8SsortingngEncoding]; [webView loadHTMLSsortingng:htmlSsortingng baseURL:url]; }