Autoriser les certificats ssl non vérifiés dans WKWebView
j'essaie de charger une url HTTPS avec un certificat auto-signé dans un WKWebView pour iOS 8 et ça continue à échouer. La solution de contournement utilisée avec UIWebView (en utilisant setAllowsAnyHTTPSCertificate de NSUrlRequest) ne semble pas fonctionner. Personne ne sait de toute solution de contournement?
Je n'ai pas besoin d'une solution valable pour AppStore, car je n'ai besoin d'accéder aux sites de certificats auto-signés que lors des phases de développement, pas lors de la production, mais c'est vraiment un problème pour le serveur de développement et de test instance.
je vous Remercie à l'avance.
4 réponses
ceci est corrigé dans iOS 9! WKWebView
enfin fait des appels à webView(_:didReceiveAuthenticationChallenge:completionHandler:)
WKNavigationDelegate
. Malheureusement, cela ne fonctionne pas si vous exécutez du code construit en Xcode 7 sur les appareils iOS 8 (du moins pas dans mes tests initiaux).
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 Apple docs (Liste 3) pour plus de détails sur ce qu'ils veulent que vous fassiez ici.
Swift:
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 WKNavigationDelegate webView:didReceiveAuthenticationChallenge:completionHandler:
pour gérer cela, mais sur cette base Apple developer forum discussion un employé d'Apple confirme que ce délégué méthode n'est pas appelée lorsque des certificats auto-signés sont rencontrés.
j'ai la même erreur, et j'essaie de la résoudre en utilisant la réponse la plus votée ci-dessus, j'ai utilisé le code suivant pour créer un NSURLCredential
objet, mais il a échoué.
NSURLCredential * credential = [[NSURLCredential alloc] initWithTrust:[challenge protectionSpace].serverTrust];
alors j'ai trouvé une solution dans Forums De Développeurs Apple. Ce qui 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 y serez invité avec l'option d'accepter le certificat. Une fois accepté, il devrait fonctionner dans votre application, car le certificat est maintenant connu de l'appareil. C'est par un dispositif de contournement, il n'aura aucune incidence sur votre application lors d'une sortie.