ver valido servidor instalar este correo confiar confianza confiable certificados certificado caducado ios ssl uiwebview self-signed wkwebview

valido - ios confiar certificado



Permitir certificados ssl no verificados en WKWebView (7)

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

No necesito una solución que sea válida para AppStore, ya que solo necesito acceder a sitios de certificados autofirmados en las fases de desarrollo, no en la producción, pero es realmente un problema para el desarrollo y las instancias de servidor de prueba.

Gracias de antemano.


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


En mi caso, los siguientes trabajos para cargar la URL HTTP o HTTPS

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

En caso de que esté cargando una URL HTTP insegura, como http://www.example.com , necesita abrir Info.plist y activar NSExceptionAllowsInsecureHTTPLoads , así:


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


Pasé mucho tiempo investigando esto, como un novato en ios, ninguna de las soluciones propuestas era completa en mi opinión. Así que esto es lo que hice para que WKWebView funcionara en mi caso (una vista web muy simple que necesita acceso a un certificado autofirmado solo para dev ):

Lo primero: en mi archivo raíz Info.plist, agregué "Configuración de seguridad de transporte de aplicaciones" como un diccionario, y agregué el elemento "Permitir cargas arbitrarias" con un valor de SÍ.

Segundo: agregué este código a mi ViewController (hereda UIViewController y WKNavigationDelegate) - esto se obtuvo de varias respuestas en otros lugares

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)) }

TENGA EN CUENTA QUE ESTA SOLUCIÓN PUEDE SER RECHAZADA POR LA TIENDA DE LA APLICACIÓN - ME ENVIARÉ A LA TIENDA DE LA APLICACIÓN CON EL ELEMENTO "Permitir cargas arbitrarias" CON UN VALOR DE NO.


Prueba esto:

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) } }


Tengo el mismo error, y trato de resolverlo usando la respuesta Más Votada arriba, usé el siguiente código para crear un objeto NSURLCredential , pero falló.

NSURLCredential * credential = [[NSURLCredential 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, 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]); }


¡Esto está arreglado en iOS 9! WKWebView finalmente hace llamadas a webView(_:didReceiveAuthenticationChallenge:completionHandler:) en WKNavigationDelegate . Desafortunadamente, esto no funciona si ejecuta el código incorporado en Xcode 7 en dispositivos con iOS 8 (al menos no en mi prueba inicial).

En mi ejemplo a continuación, no estoy haciendo nada con el certificado y solo lo dejo pasar sin hacer ninguna validación adicional (obviamente un mal plan para el código de producción). Consulte la documentación de Apple (Listado 3) para obtener más detalles sobre lo que quieren que haga aquí.

Rápido:

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) }

C objetivo

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