iOS - SSL-Zertifikat Installieren programmgesteuert
Ich Schreibe ein phonegap-plugin, das installiert sowohl CA-root-Zertifikat und nutzerzertifikat in der app-Schlüsselbund.
Hier ist der code verwendet, um das Zertifikat zu installieren:
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:certpath];
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;
CFStringRef password = (CFStringRef)certPassword;
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { password };
CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus securityError = SecPKCS12Import(inPKCS12Data, optionsDictionary, &items);
if (securityError == 0) {
NSLog(@" *** Certificate install Success ***");
} else {
NSLog(@" *** Certificate install Failure ***");
}
Den code oben funktioniert einwandfrei (securityError gleich 0). Allerdings bin ich der Erlangung jener Fehler:
unknown apsd[59] <Warning>: <APSCourier: 0xee1ba80>: Stream error occurred for <APSTCPStream: 0x126940>: TLS Error Code=-9844 "peer dropped connection before responding"
unknown securityd[638] <Error>: CFReadStream domain: 12 error: 8
Der angibt, dass das Gerät nicht akzeptieren, wird das installierte Zertifikat, so Frage ich mich, dass das Zertifikat nicht validiert gegen das CA-Root-Zertifikat auf dem Gerät installiert.
Muss ich installieren das CA-Root-Zertifikat für die app ?
Irgendwelche Ideen ?
P. S: ich bin neu in Objective-C und XCode-Umgebung.
EDIT:
Den code unten dient zum speichern von CA-root-Zertifikat in Ihrem Schlüsselbund:
NSString *rootCertPath = [[NSBundle mainBundle] pathForResource:@"rootca" ofType:@"cer"];
NSData *rootCertData = [NSData dataWithContentsOfFile:rootCertPath];
OSStatus err = noErr;
SecCertificateRef rootCert = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef) rootCertData);
CFTypeRef result;
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassCertificate, kSecClass,
rootCert, kSecValueRef,
nil];
err = SecItemAdd((CFDictionaryRef)dict, &result);
if( err == noErr) {
NSLog(@"Install root certificate success");
} else if( err == errSecDuplicateItem ) {
NSLog(@"duplicate root certificate entry");
} else {
NSLog(@"install root certificate failure");
}
BEARBEITEN:
Scheint es, dass das Zertifikat nicht zum server gesendet wird. Ich denke, dass ich zu senden manuell das Zertifikat jedes mal, wenn eine https-Anforderung...
Ich bin auf der Suche nach einem Weg, fangen Sie jede https-Aufruf in phonegap.
- Schauen Sie [hier][1], es ist ein älteres ALSO Antwort zum gleichen Thema. [1]: stackoverflow.com/questions/5323686/...
- Ich habe versucht, das gleiche snippet mit meiner cer-Datei, funktioniert es nicht...
- Generell gibt es Sicherheit Fragen gestellt werden, wenn eine app ändern können der Liste vertrauenswürdiger CA-Zertifikate verwendet, die Global von dem Gerät, vor allem ohne explizites eingreifen des Benutzers.
- Bruno:Es wird fügen Sie das Zertifikat in die keychain-sandbox der Anwendung, d.h. keine andere Anwendung Vertrauen Sie Ihrer cert.
- ah fair genug, sorry, ich bin nicht allzu vertraut mit der iOS-Entwicklung.
- Versuche zu installieren, die vollständige Kette von Zertifikaten von der CA für die server, nur eine Vermutung, aber das beste, das ich tun kann, mit der info, die ich habe.
- Das root-Zertifikat zu sein scheint, installiert mit SecItemAdd Methode. Jetzt bin ich versucht zu installieren, die Benutzer-Zertifikat mit der gleichen Methode und durch die übergabe der Zertifikat-Passwort.
- hast du es lösen?
- blog.asolutions.com/2011/02/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht genug, um importieren Sie das Zertifikat in den Schlüsselbund. Das neue root-Zertifikat besitzt auch das Vertrauen der Benutzer oder das system.
Vorausgesetzt, Sie haben noch die
SecCertificateRef
in die variablecertificate
verwenden Sie den folgenden code zu erhöhen das Vertrauen Ebene:Ändern der Vertrauensstufe wird der Benutzer aufgefordert, in einem popup-Fenster angezeigt, wenn er akzeptiert die änderung.
Security.framework
Funktionen (wahrscheinlich) gewickelt darunter?Denen ich war auf der Suche, Einstellung "Immer Vertrauen" für den System-Schlüsselbund-Zertifikat,