2010-07-05 10 views
5

J'écris une application iPhone et je voudrais me connecter à un serveur 'HTTPS' pour obtenir des informations. Cependant, je reçois l'erreur dans la console qui est"certificat de serveur non approuvé" sur l'iPhone

NSUnderlyingError = erreur Domaine = code kCFErrorDomainCFNetwork = -1202 UserInfo = 0x3e95cf0 « Le certificat pour ce serveur est invalide. Vous peut-être connecté à un serveur qui est prétendre être "example.com" ce qui pourrait mettre en danger vos informations confidentielles. "; }

Comment puis-je faire confiance au certificat et obtenir le code d'état HTTP 200

Ce qui suit est mon code.

NSMutableURLRequest *request_get2 = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request_get2 setURL:[NSURL URLWithString:@"https://www.example.com"]]; 
    [request_get2 setHTTPMethod:@"GET"]; 
    [request_get2 setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    //[request_get2 setValue:@"text/html; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 
    [request_get2 setValue:@"https://www.example.com" forHTTPHeaderField:@"Referer"]; 
    [request_get2 setHTTPShouldHandleCookies:YES]; 
    // cookiesString is in format "cookieName=cookieValue;" 
    [request_get2 setValue: (NSString *) cookiesString forHTTPHeaderField:@"Cookie"]; 


    // doGet - response 
    NSHTTPURLResponse *response_get2 = nil; // it change from 'NSURLRespaonse' to 'NSHTTPURLResponse' 
    NSError *error_get2 = nil; 
    NSData *responseData_get2 = [NSURLConnection sendSynchronousRequest:request_get2 returningResponse:&response_get2 error:&error_get2]; 
    NSString *data_get2 = [[NSString alloc]initWithData:responseData_get2 encoding:NSUTF8StringEncoding]; 

    if (!error_get2) { 
     NSString *responseURL_get2 = [[response_get2 URL] absoluteString];   // null value 
     NSString *responseTextEncodingName_get2 = [response_get2 textEncodingName]; // null value 
     NSString *responseMIMEType_get2 = [response_get2 MIMEType];     // null value 
     NSUInteger *responseStatusCode_get2 = [response_get2 statusCode]; //[responseStatusCode intValue]; // the status code is 0 
    } 
    else { 
     NSLog(@"\nsomething went wrong: %@\n", [error_get2 userInfo]); // got the error in here 
    } 

Répondre

11

Je pense que l'ajout d'un certificat non approuvé est (au moins dans le simulateur) pas possible, mais vous pouvez dire à votre délégué NSURLConnection d'accepter des certificats auto-signés (ou ceux généralement non fiables)

Le lien suivant m'a aidé à résoudre le problème!

How to use NSURLConnection to connect with SSL for an untrusted cert?

+0

merci, sam. C'est très utile. Mais j'ai encore 1 questions, où devrais-je mettre le code. J'avais l'habitude de mettre le code dans une classe .m. Mais cela n'a pas fonctionné. J'ai vérifié le site Web du développeur Apple, je sais que ce sont des fonctions prédéfinies, mais où dois-je l'appeler? J'avais aussi l'habitude de mettre le NSLog() pour imprimer le contenu, mais je ne pouvais pas voir le contenu du NSLog. Merci beaucoup. – Questions

+0

s'il vous plaît voir ma réponse dans votre autre fil avec la même question :) .. thxs – samsam

0

Confiants tous les certificats est une très mauvaise idée. Une personne malveillante peut effectuer une attaque Man-in-the-Middle sur vos utilisateurs pour lire ou modifier toutes les données transférées.

Je crois que votre certificat ne contient pas tous les certificats intermédiaires nécessaires pour valider le chemin vers un certificat racine approuvé du système. Il peut être signalé comme chaîne de certificat incomplète par certains outils de validation de configuration SSL.

Vous pouvez résoudre le problème chaîne de certificats incomplète manuellement en concaténant tous les certificats du certificat au certificat racine approuvé (exclusif, dans cet ordre), afin d'éviter de tels problèmes. Notez que le certificat racine approuvé ne doit pas être présent, car il est déjà inclus dans le magasin de certificats racine du système.

Vous devriez pouvoir extraire des certificats intermédiaires de l'émetteur et les concaténer ensemble. J'ai écrit un script pour automatiser la procédure, il faut un certificat pour produire la sortie des certificats correctement chaînés. https://github.com/zakjan/cert-chain-resolver