2010-06-11 5 views
10

Ich habe eine Anwendung, die mit vielen verschiedenen Sites kommuniziert und jede Site hat ihr eigenes SSL-Zertifikat, das von unserer eigenen internen CA signiert wurde. Auf diese Weise können wir keine SSL-Zertifikate für jede Site kaufen (Hunderte oder Tausende) und sind sicherer, als ein Platzhalterzertifikat mit einem gemeinsamen Schlüssel auf jeder dieser Sites zu verwenden. Daher ist die Verwendung eines CA-Zertifikats der einzige Weg.iPhone Benutzerdefiniertes CA-Zertifikat für eine Anwendung, die NSURLConnection verwendet?

Momentan habe ich eine mobileprovision-Datei, die das CA-Zertifikat als Profil auf dem Telefon installiert. Wenn unsere iPhone-Anwendung gestartet wird, wenn ein SSL-Zertifikatfehler auftritt, wird sie über Safari an eine solche Bereitstellungsdatei weitergeleitet, und der Benutzer wird aufgefordert, die Zertifizierungsstelle zu installieren.

Das Problem ist, dass ich besorgt bin, dass der Apple AppStore meine App dafür bestreiten könnte (nur ein paar Rückmeldungen von anderen Entwicklern an dieser Stelle), und ich wollte andere Wege erforschen, um dies zu erreichen.

Grundsätzlich muss ich eine SSL-Verbindung zulassen, die gegen ein benutzerdefiniertes CA-Zertifikat verifiziert, das in meine Anwendung eingebettet wird. Dadurch wird das CA-Zertifikat nur für die von mir getätigten Anrufe aktiviert. Ich verwende die Standard-NSURLConnection-Methoden, um mit dem Dienst zu kommunizieren.

Ist das möglich? Kann mir jemand zeigen, wie man die CA lädt (welche Form PEM?) Und sie der Liste vertrauenswürdiger CA-Zertifikate für meine Anwendung hinzufügt? Wenn das nicht möglich ist, welche anderen Möglichkeiten habe ich? Nur auf alle Zertifikate zu vertrauen, ist keine Option, wir wollen verhindern, dass der Mensch in der Mitte der Angriffe ist und vertrauen nur unseren CA Zertifikaten.

Danke!

+1

-1 ohne Kommentar. nett! –

Antwort

1

Verwenden Sie die folgenden zwei Delegatmethode von NSURLConnection jede Website zuzugreifen mit ungültigem Zertifikat

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

Momentan habe ich diese implementiert, aber nicht aufgerufen :([NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost: [[NSURL URLWithString: url] host]]; – jsetting32

Verwandte Themen