Question

En utilisant NSURLDemande, j'essaie d'accéder à un site Web dont le certificat a expiré.Lorsque j'envoie la demande, mon connexion : didFailWithError La méthode déléguée est invoquée avec les informations suivantes :

-1203, NSURLErrorDomain, bad server certificate

Mes recherches n'ont abouti qu'à une seule solution :une méthode de classe cachée dans NSURLRequest :

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

Cependant, je ne souhaite pas utiliser d'API privées dans une application de production pour des raisons évidentes.

Des suggestions sur quoi faire ?Dois-je utiliser les API CFNetwork, et si oui, deux questions :

  • Un exemple de code que je peux utiliser pour commencer ?Je n'en ai trouvé aucun en ligne.
  • Si j'utilise CFNetwork pour cela, dois-je abandonner complètement NSURL ?

MODIFIER:

iPhone OS 3.0 a introduit une méthode prise en charge pour ce faire.Plus de détails ici : Comment utiliser NSURLConnection pour se connecter avec SSL pour un certificat non fiable ?

Était-ce utile?

La solution 3

iPhone OS 3.0 a introduit une méthode prise en charge pour ce faire, qui ne nécessite pas les API CFNetwork de niveau inférieur.Plus de détails ici :

Comment utiliser NSURLConnection pour se connecter avec SSL pour un certificat non fiable ?

Autres conseils

La manière prise en charge de procéder nécessite l’utilisation de CFNetwork.Vous devez attacher un kCFStreamPropertySSLSettings au flux qui spécifie kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse.Vous trouverez ci-dessous un code rapide qui le fait, sans la vérification des résultats valides, ajoutez le nettoyage.Une fois que vous avez fait cela, vous pouvez utiliser CFReadStreamRead() pour obtenir les données.

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);    
CFReadStreamOpen(myStream);

S'il s'agit d'un serveur interne à des fins de test, pourquoi ne pas simplement importer le certificat du serveur de test dans le KeyChain et définir des paramètres de confiance personnalisés ?

J'ai rencontré le même problème : je développais un client SOAP et le serveur de développement dispose d'un certificat "maison".Je n'ai pas pu résoudre le problème même en utilisant cette méthode, puisque je n'utilisais pas NSURL, mais les méthodes WS (mal documentées et apparemment abandonnées), et j'ai décidé pour le moment d'utiliser (en interne) simplement un non-SSL connexion.

Cela dit, cependant, la question qui vient à l'esprit est la suivante : si vous n'êtes pas disposé à utiliser une API privée dans une application de production, devriez-vous autoriser l'accès à un site avec un certificat douteux ?

je vais citer Jens Alfke:

Il ne s'agit pas seulement d'un problème de sécurité théorique.Quelque chose
comme 25 % des serveurs DNS publics ont été compromis, selon
rapports récents, et peut diriger les utilisateurs vers des sites de phishing/malware/publicité même
s'ils saisissent correctement le nom de domaine.La seule chose qui te protège
à partir de là, la vérification du certificat SSL.

Pouvez-vous créer un certificat auto-signé et ajouter votre autorité de certification personnalisée aux autorités de certification de confiance ?Je ne sais pas vraiment comment cela fonctionnerait sur l'iPhone, mais je suppose que sous Mac OS X, vous les ajouteriez au trousseau.

Cet article pourrait également vous intéresser Concernant:Comment gérer une mauvaise erreur de certificat dans NSURLDownload

Une autre option consisterait à utiliser une autre bibliothèque de connexions.

Je suis un grand fan d'AsyncSocket et il prend en charge les certificats auto-signés

http://code.google.com/p/cocoaasyncsocket/

Jetez un oeil, je pense que c'est beaucoup plus robuste que les NSURLRequests standard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top