Objective-C SSL Connexion Synchrone
Je suis un peu nouveau pour objective-C, mais avez exécuté sur un problème que je ne peux pas résoudre, surtout parce que je ne suis pas sûr que je suis la mise en œuvre de la solution correctement.
Je suis en train d'essayer de vous connecter en utilisant une Connexion Synchrone à un site en https avec un certificat auto-signé. Je suis le
Erreur de Domaine=NSURLErrorDomain Code=-1202 "non fiables certificat de serveur"
Erreur que j'ai vu des solutions à certains sur ce forum. La solution que j'ai trouvé a été 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];
}
à la NSURLDelegate à accepter tous les certificats. Lorsque je me connecte sur le site en utilisant seulement:
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
Il fonctionne très bien et je vois le défi d'être accepté. Cependant lorsque j'essaie de me connecter en utilisant la connexion synchrone j'ai toujours l'erreur et je ne vois pas le défi a pour fonction appelée lorsque je l'ai mis dans l'exploitation forestière.
Comment puis-je obtenir la connexion synchrone à utiliser le défi méthodes? Est-il quelque chose à faire avec le délégué:auto partie de la URLConnection? J'ai également la journalisation pour l'envoi/la réception de données à l'intérieur de la NSURLDelegate qui est appelé par ma fonction de connexion, mais pas par la fonction synchrone.
Ce que je suis à l'aide de la machine synchrone partie:
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 nouveau pour objectif C alors soyez gentils 🙂
Merci pour toute aide.
Mike
OriginalL'auteur Mike | 2010-04-21
Vous devez vous connecter pour publier un commentaire.
Selon l'Apple docs (URL de Chargement Guide de Programmation Système), la machine synchrone NSURLRequest méthode n'est pas recommandée parce que "parce qu'il a de graves lacunes". Il semblerait que le manque de capacité de contrôler quels sont les certificats acceptable est l'un de ces limitations.
Et oui, vous avez raison, c'est la
delegate:self
sur leNSURLConnection
d'installation que les causes de votre délégué méthodes à invoquer. Parce que le simple (ou simpliste) synchronesendSynchronousRequest:
appel ne fournit pas un moyen de spécifier un délégué, ceux délégué méthodes ne sont pas utilisées.c'est le point: lorsque vous utilisez un synchrone demande, il n'y a pas un moyen de spécifier un délégué de l'objet. Une requête asynchrone ressemble:
[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]
et un appel synchrone est comme[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]
. Notez qu'il n'y a pasdelegate:
paramètre à la-sendSynchronousRequest:returningResponse:error:
méthode. Bottom line: si vous avez besoin de la personnalisation d'un NSURLDelegate peut donner, vous devez utiliser la demande asynchrone.OriginalL'auteur David Gelhar