¿Cómo utilizar NSURLConnection para conectarse con SSL para un certificado que no es de confianza?
Tengo el siguiente código simple para conectarme a una página web SSL
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Excepto que da un error si el certificado es autofirmado. ¿ Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
Hay alguna manera de configurarlo para que acepte conexiones de todos modos (al igual que en un navegador, puede presionar aceptar) o una forma de evitarlo?
¡Existe una API compatible para lograr esto! Agregue algo como esto a su NSURLConnection
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])
if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
Tenga en cuenta que connection:didReceiveAuthenticationChallenge:
puede enviar su mensaje a Challenge.sender (mucho) más tarde, después de presentar un cuadro de diálogo al usuario si es necesario, etc.
Si no desea (o no puede) utilizar API privadas, existe una biblioteca de código abierto (licencia BSD) llamada ASIHTTPRequest que proporciona un contenedor para el nivel inferior CFNetwork APIs
. Recientemente introdujeron la capacidad de permitir HTTPS connections
el uso de certificados autofirmados o que no son de confianza con la -setValidatesSecureCertificate:
API. Si no desea utilizar toda la biblioteca, puede utilizar la fuente como referencia para implementar la misma funcionalidad usted mismo.