2009-08-09 11 views
6

J'ouvre actuellement une connexion https à un serveur Web en utilisant NSURLConnection. Tout fonctionne comme il se doit et je suis en mesure de récupérer le contenu de la page que je suis après. Le certificat est émis par VeriSign et je suppose que NSURLConnection fait un certain travail pour vérifier l'authenticité du certificat dans une certaine mesure? Si je me connectais au même site via un safari mobile, il extrairait du certificat et afficherait l'organisation (du site Web) dans la barre de navigation. Est-il possible d'extraire ces mêmes détails dans Cocoa Touch que je voudrais aussi les présenter à l'utilisateur? Est-ce que la vérification du nom d'hôte du serveur par rapport à ce certificat serait également assez raisonnable pour supposer que le site Web est légitime?Comment vérifier un certificat de site Web dans Cocoa Touch?

Répondre

5

NSURLConnection vous donnera une erreur (NSURLErrorDomain) si vous tentez de vous connecter à un serveur avec un certificat invalide (par exemple, il est auto-signé, obsolète, a le mauvais hôte, etc.). Vous n'avez donc pas besoin de vérifier vous-même, car tout est géré pour vous. Si vous souhaitez vraiment afficher un résumé de certificat SSL dans votre interface utilisateur, vous devez sélectionner une couche de NSURLConnection et utiliser l'API de bas niveau CFNetwork à la place. Une fois que vous avez un CFReadStreamRef qui est dans l'état kCFStreamEventEndEncountered, vous devriez être en mesure de faire ce qui suit (en supposant que votre poignée de flux est appelé readStream):

NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease]; 
if ([certificates count] > 0) { 
    SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0]; 
    NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease]; 
    NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease]; 
} 

Vous aurez besoin de décoder les informations contenues dans data si vous voulez pour accéder aux différentes propriétés du certificat, mais le résumé détenu dans description pourrait être suffisant pour vos besoins.

+1

Merci pour l'aide Nathan, laissant tomber une couche comme vous l'avez suggéré a fait l'affaire! Bien que ce ne soit pas vraiment un problème, votre distribution NSDictionary * ne devrait-elle pas être un NSArray * à la place? – dbotha

+0

Seriez-vous en mesure de poster un exemple de code Deon? – Pripyat

+0

@Deon Droit vous êtes! J'ai mis à jour l'exemple de code. –