2009-11-17 7 views
9

Meine App verbindet sich mit der Schwab OFX server mit NSURLConnection. Leider verwendet der Server ein sehr kurzes Zwischenzertifikat, das auf dem Mac-Desktop, aber noch nicht auf dem iPhone, vertrauenswürdig ist. (Probieren Sie die URL aus - Sie erhalten einen Zertifikatfehler auf dem iPhone.)Importieren eines SSL-Zertifikats unter dem iPhone SDK

Es gibt keine einfache Möglichkeit, NSURLConnection zu sagen, um ein ungültiges Zertifikat zu ignorieren, das ich kenne. Daher versuche ich, das Cert manuell in den Schlüsselbund zu importieren und sein Vertrauensniveau einzustellen, aber ich habe einen Block getroffen.

Ich rufe SecCertificateCreateWithData erfolgreich, um das Zertifikat aus einer .cer Datei zu importieren. Auf dem Desktop würde ich dann SecTrustSettingsSetTrustSettings anrufen, aber es existiert nicht im iPhone SDK.

Problemumgehung?

Antwort

12

Apple technischen Support antwortete mir prompt mit einer perfekten Antwort.

Erstens ist es falsch zu sagen, dass Schwab "ein sehr neues Zwischenzertifikat verwendet, das auf dem Mac-Desktop vertraut ist, aber noch nicht das iPhone". Zwischenzertifikate befinden sich niemals im integrierten Stammzertifikatsspeicher. Das Problem ist, dass die meisten SSL-Server Bundle alle Zwischenzertifikate für die Überprüfung benötigt, aber Schwab verwendet einen alternativen SSL-Prozess, der erwartet, dass Sie das Zwischenzertifikat von einer URL abrufen. Der Mac-Desktop unterstützt das Abrufen von Zwischenzertifikaten, nicht jedoch das aktuelle iPhone OS.

Hier ist der Kern des eigentlichen Code:

OSStatus   err; 
NSString *   path; 
NSData *   data; 
SecCertificateRef cert; 

path = [[NSBundle mainBundle] pathForResource:@"OFX-G3" ofType:@"cer"]; 
assert(path != nil); 

data = [NSData dataWithContentsOfFile:path]; 
assert(data != nil); 

cert = SecCertificateCreateWithData(NULL, (CFDataRef) data); 
assert(cert != NULL); 

err = SecItemAdd(
    (CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys: 
     (id) kSecClassCertificate, kSecClass, 
     cert,      kSecValueRef, 
     nil 
    ], 
    NULL 
); 
assert(err == noErr); 

CFRelease(cert); 

Dies setzt voraus, dass OFX-G3.cer das Zwischen SSL-Zertifikat und wird in den Ressourcen-Ordnern.

+0

Weird - Ich kann mir das Zertifikat per E-Mail zusenden und es analysiert es richtig, aber wenn ich versuche, es auf diese Weise zu laden, bekomme ich eine Null für cert. –

+0

ich das letzte assert geändert: 'assert (err == noErr || err == errSecDuplicateItem);' für den "Fehler" zu erklären, wenn es bereits für mich installiert ist, musste ich die umwandeln Zertifikate zum DER-Format sonst würde dieser Code nicht funktionieren. Ich tat das auf diese Weise: 'openssl x509 -in UTN-USERFirst-Hardware.cer -out UTN-USERFirst-Hardware.der -outform DER' –

0

Versuchen Sie dies programmgesteuert durchzuführen, oder ist es in Ordnung, dies über die normale Benutzeroberfläche zu tun?

Mit dem iPhone-Konfigurationsprogramm von Apple können Sie dem Telefon Zertifikate hinzufügen. Sie können das Zertifikat auch per E-Mail an einen Benutzer senden, der E-Mails auf dem Telefon lesen kann. Anschließend öffnen Sie das Zertifikat auf dem Telefon und Sie werden gefragt, ob Sie das Zertifikat installieren möchten.

Es tut mir leid, ich kann dir jetzt keine näheren Anweisungen geben, aber ich bin weg von meinem iPhone. Ich werde später zurückkommen, nachdem ich auf das iPhone gehen kann, um zu sehen, ob Sie Erfolg haben.

+0

Durch die "manuelle" Installation der Zertifikate kann der Benutzer ohne Probleme auf diese Website in Mobile Safari wechseln - aber es hilft NICHT bei Anfragen in der App (zumindest beim Testen mit iPod Touch Gen 2, iOS 3.0). –

2

Sie können ssl-Einstellungen mit CoreFoundation CFStream Objekt umgehen. Sie werden etwas tun müssen, wie ein Strom erzeugen, der auf dem OFX-Server an den entsprechenden Anschluss verbindet, dann CF(Read|Write)StreamSetProperty ein CFDictionary zur Verfügung zu stellen verwenden mit Tasten wie kCFStreamSSLLevel (die man ein NSDictionary werfen kann), kCFStreamSSLAllowsAnyRoot, kCFStreamSSLValidatesCertificateChain usw.

+0

Große Antwort. Der technische Support von Apple antwortete jedoch mit einer besseren Antwort - siehe meine eigene Antwort auf diese Frage. –

1

Sie können das Zertifikat direkt in die TrustStore.sqlite3-Datei des Simulators installieren. Charles Proxy verwendet dies, um sein Root-Zertifikat in den Simulator zu installieren.

+0

Danke für diesen Link :) - es hat das komplette Skript zu importieren. .. – Moszi