2010-06-11 3 views
10

Ho un'applicazione che comunica con molti siti diversi e ogni sito ha il proprio certificato SSL firmato dalla nostra CA interna. Questo ci impedisce di acquistare certificati SSL per ogni sito (centinaia o migliaia) ed è più sicuro quindi utilizzare un certificato jolly con una chiave condivisa su ciascuno di questi siti. Quindi, fondamentalmente l'uso di un certificato CA è l'unico modo.iPhone Certificato CA personalizzato per un'applicazione che utilizza NSURLConnection?

Al momento, dispongo di un file mobileprovision che installerà il certificato CA come profilo sul telefono. Quando la nostra applicazione per iPhone viene avviata se riceve un errore del certificato SSL, reindirizza a questo file di provisioning mobile tramite Safari e all'utente verrà richiesto di installare la CA.

Il problema è che sono preoccupato che l'AppStore Apple potrebbe negare la mia app per fare questo (Solo alcuni feedback da altri sviluppatori a questo punto), e volevo ricercare altri modi per ottenere questo risultato.

Fondamentalmente ciò che devo realizzare è consentire una connessione SSL che verificherà con un certificato CA personalizzato che verrà incorporato nella mia applicazione. Ciò renderà il certificato CA attivo solo per le chiamate che creo. Sto usando i metodi standard NSURLConnection per comunicare con il servizio.

È possibile? Qualcuno può mostrarmi come caricare la CA (che forma PEM?) E aggiungerlo all'elenco dei certificati CA affidabili per la mia applicazione? Se questo non è possibile quali altre opzioni ho? Solo fidarsi di tutti i certificati non è un'opzione, vogliamo prevenire gli attacchi man in the middle e fidarci solo dei certificati emessi dalla CA.

Grazie!

+1

-1 senza un commento. simpatico! –

risposta

1

Utilizzare il sotto due metodo delegato di NSURLConnection di accedere a qualsiasi sito con certificato non valido

- (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

Attualmente li ho implementati ma non vengono chiamati :([NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost: [[NSURL URLWithString: url] host]]; – jsetting32