2012-02-16 27 views
5

Estoy tratando de realizar la validación del certificado SSL y han puesto en práctica la canAuthenticateAgainstProtectionSpace delegadométodo IOS canAuthenticateAgainstProtectionSpace no se llama cada vez que

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace*)protectionSpace 
{ 
    OSStatus status = SecTrustEvaluate(protectionSpace.serverTrust, &trustResult); 
    if(status == errSecSuccess) 
    { 
    } 
    else 
    { 
    } 
} 

Sin embargo, noto que este delegado se llama la primera vez que una determinada URL, pero no para intentos posteriores para la misma URL. Pensé que esto tenía que ver con la respuesta en caché, por lo que creó la NSURLRequest como la siguiente:

NSURLRequest *request = [[NSURLRequest alloc] 
         initWithURL: [NSURL URLWithString:_urlString] 
         cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
         timeoutInterval: 10 
         ]; 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Esto no ayuda tampoco. ¿Alguna idea, cómo puedo obtener el método canAuthenticateAgainstProtectionSpace para recibir llamadas cada vez?

Respuesta

2

He resuelto el problema agregando el siguiente código:

- (void)connection:(NSURLConnection *)connection 
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
[[challenge sender] cancelAuthenticationChallenge:challenge]; 
} 

Lo anterior cancela el reto de autenticación y por lo que el delegado canAuthenticateAgainstProtectionSpace es llamado cada vez que

10

La respuesta anterior no resuelve el problema real . El problema real aquí es que solo se presenta un desafío de autenticación la primera vez que se establece una conexión para esa URL mientras la aplicación está abierta.

Como se explica here

sesión TLS es un uso intensivo del procesador y Apple no quiere que le permite crear uno nuevo cada vez que se realiza una conexión a esa URL, por lo que almacena en caché para usted. En este caso, está trabajando en contra de usted, pero debería ser capaz de evitar el problema al incluir un "." personaje al final de tu host.

En nuestro caso, intentamos establecer una conexión a un servidor web que contiene un certificado emitido por una CA interna. Como sabíamos que la CA no sería confiable en la primera conexión, permitimos que la conexión continuara para que la CA se pudiera descargar. Durante esa conexión, agregamos el "." carácter al final del host. Todas las conexiones posteriores utilizan la URL normal sin el "." personaje al final del host. Esto asegura que el certificado CA que descargamos se valida la primera vez que se realiza una conexión "real".

+0

¡Insano, una sugerencia tan útil! Muchas gracias por compartir esto ! :-) – Lepidopteron

Cuestiones relacionadas