2010-06-11 15 views
10

Mam aplikację, która komunikuje się z wieloma różnymi witrynami, a każda witryna ma swój własny certyfikat SSL podpisany przez nasz własny wewnętrzny ośrodek certyfikacji. Takie postępowanie uniemożliwia nam zakup certyfikatów SSL dla każdej witryny (setki lub tysiące) i jest bezpieczniejsze niż używanie certyfikatu wieloznacznego z kluczem udostępnionym w każdej z tych witryn. Więc, w zasadzie używanie certyfikatu CA jest jedynym sposobem.iPhone Niestandardowy certyfikat CA dla aplikacji korzystającej z NSURLConnection?

W tej chwili mam plik mobileprovision, który zainstaluje certyfikat CA jako profil na telefonie. Gdy nasza aplikacja na iPhone'a zostanie uruchomiona, jeśli otrzyma błąd certyfikatu SSL, przekierowuje do tego mobilnego pliku usług przez Safari, a użytkownik zostanie poproszony o zainstalowanie CA.

Problem polega na tym, że obawiam się, że Apple AppStore może odmówić mojej aplikacji za wykonanie tej czynności (tylko niektóre opinie od innych deweloperów w tym momencie) i chciałem zbadać inne sposoby osiągnięcia tego celu.

Zasadniczo potrzebuję wykonać połączenie SSL, które będzie weryfikowane na podstawie niestandardowego certyfikatu CA, który zostanie osadzony w mojej aplikacji. To spowoduje, że certyfikat CA będzie aktywny tylko dla połączeń, które wykonuję. Używam standardowych metod NSURLConnection w celu komunikacji z usługą.

Czy to możliwe? Czy ktoś może mi pokazać, jak załadować urząd certyfikacji (w jakiej formie PEM?) I dodać go do listy zaufanych certyfikatów CA dla mojej aplikacji? Jeśli nie jest to możliwe, jakie mam inne opcje? Po prostu zaufanie do wszystkich certyfikatów nie jest tak naprawdę żadną opcją, chcemy zapobiec atakowi człowieka w środkowych atakach i ufać tylko naszym urzędom wydającym certyfikaty.

Dzięki!

+1

-1 bez uwag. miły! –

Odpowiedz

1

użyciu poniższej metody dwa Delegat NSURLConnection dostęp do dowolnego miejsca w nieprawidłowym certyfikatu

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

Obecnie zaimplementowałem te, ale nie są nazywane :([NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost: [[NSURL URLWithString: url] host]]; – jsetting32

Powiązane problemy