2010-06-11 7 views
10

J'ai une application qui communique avec de nombreux sites différents et chaque site a son propre certificat SSL signé par notre propre CA interne. Cela nous évite d'avoir à acheter des certificats SSL pour chaque site (des centaines ou des milliers) et est plus sûr que d'utiliser un certificat générique avec une clé partagée sur chacun de ces sites. Ainsi, l'utilisation d'un certificat CA est la seule façon de procéder.iPhone Certificat personnalisé de CA pour une application qui utilise NSURLConnection?

À l'heure actuelle, j'ai un fichier mobileprovision qui va installer le certificat CA comme un profil sur le téléphone. Lorsque notre application iPhone se lance en cas d'erreur de certificat SSL, elle redirige vers ce fichier de provision mobile via Safari et l'utilisateur est invité à installer l'autorité de certification. Le problème est que je crains que Apple AppStore pourrait refuser mon application pour ce faire (Juste quelques commentaires d'autres développeurs à ce stade), et je voulais rechercher d'autres moyens pour y parvenir.

Fondamentalement, ce que j'ai besoin d'accomplir est d'autoriser une connexion SSL qui va vérifier par rapport à un certificat CA personnalisé qui sera intégré dans mon application. Cela rendra le certificat CA actif uniquement pour les appels que je fais. J'utilise les méthodes standard NSURLConnection pour communiquer avec le service.

Est-ce possible? Quelqu'un peut-il me montrer comment charger l'AC (quelle forme PEM?) Et l'ajouter à la liste des certificats d'AC de confiance pour mon application? Si ce n'est pas possible, quelles autres options ai-je? Juste faire confiance à tous les certificats n'est pas vraiment une option, nous voulons empêcher l'homme dans les attaques du milieu et ne faire confiance qu'à nos certificats émis par l'autorité de certification.

Merci!

+1

-1 sans commentaire. agréable! –

Répondre

1

Utilisez le dessous de deux méthode de délégué du NSURLConnection d'accéder à un site avec certificat non valide

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
    { 

      NSLog(@"canAuthenticateAgainstProtectionSpace"); 
     if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      // Note: this is presently only called once per server (or URL?) until 
      //  you restart the app 
       NSLog(@"Authentication checking is doing"); 
      return YES; // Self-signed cert will be accepted 
      // Note: it doesn't seem to matter what you return for a proper SSL cert 
      //  only self-signed certs 
     } 
     return NO; 
    } 

    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
    { 
      NSLog(@"didReceiveAuthenticationChallenge"); 
     if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
     { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
       NSLog(@"chalenging protection space authentication checking"); 
     } 
    } 
+0

Actuellement, j'ai mis en œuvre ces derniers mais il n'y a pas appelé :([NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost: [[NSURL URLWithString: url] hôte]]; – jsetting32

Questions connexes