4 votes

Connexion synchrone SSL en Objective-C

Je suis un peu novice en Objective-C mais je suis tombé sur un problème que je n'arrive pas à résoudre, principalement parce que je ne suis pas sûr d'implémenter la solution correctement.

J'essaie de me connecter à l'aide d'une connexion synchrone à un site https avec un certificat auto-signé. J'obtiens le message

Erreur Domain=NSURLErrorDomain Code=-1202 "certificat de serveur non approuvé".

Erreur pour laquelle j'ai vu quelques solutions sur ce forum. La solution que j'ai trouvée est d'ajouter :

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];  
}  

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];  

}

au délégué NSURLD pour accepter tous les certificats. Lorsque je me connecte au site en utilisant uniquement un :

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];  
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

Cela fonctionne bien et je vois que le défi est accepté. Cependant, lorsque j'essaie de me connecter en utilisant la connexion synchrone, j'obtiens toujours l'erreur et je ne vois pas les fonctions du défi être appelées lorsque je mets la journalisation.

Comment puis-je faire en sorte que la connexion synchrone utilise les méthodes de défi ? Cela a-t-il quelque chose à voir avec la partie delegate:self de l'URLConnection ? Je dispose également d'un système d'enregistrement pour l'envoi et la réception de données dans le délégué NSURLD qui est appelé par ma fonction de connexion mais pas par la fonction synchrone.

Ce que j'utilise pour la partie synchrone :

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"https://examplesite.com/"]];  
        [request setHTTPMethod: @"POST"];  
        [request setHTTPBody: [[NSString stringWithString:@"username=mike"] dataUsingEncoding: NSUTF8StringEncoding]];  
        dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
        NSLog(@"%@", error);  
        stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding];  
        NSLog(@"%@", stringReply);  
        [stringReply release];  
        NSLog(@"Done"); 

Comme je l'ai mentionné, je suis un peu novice en matière d'objectif C, alors soyez gentil :)

Merci pour toute aide. Mike

7voto

David Gelhar Points 20703

Selon les documents d'Apple ( Guide de programmation du système de chargement URL ), la méthode synchrone NSURLRequest n'est pas recommandée car "elle présente de sérieuses limitations". Il semblerait que l'absence de possibilité de contrôler les certificats acceptables soit l'une de ces limitations.

Et oui, vous avez raison, c'est la delegate:self sur le NSURLConnection qui provoque l'appel de vos méthodes déléguées. Parce que le simple (ou simpliste) synchrone sendSynchronousRequest: ne fournit pas de moyen de spécifier un délégué, ces méthodes de délégué ne sont pas utilisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X