¿Cómo utilizar NSURLConnection para conectarse con SSL para un certificado que no es de confianza?

Resuelto erotsppa asked hace 54 años • 13 respuestas

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?

erotsppa avatar Jan 01 '70 08:01 erotsppa
Aceptado

¡Existe una API compatible para lograr esto! Agregue algo como esto a su NSURLConnectiondelegado:

- (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.

Gordon Henriksen avatar Jan 09 '2010 15:01 Gordon Henriksen

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 connectionsel 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.

Nathan de Vries avatar Jun 10 '2009 01:06 Nathan de Vries