Sie könnten das Zertifikat exportieren (n) aus dem Schlüsselspeicher benötigen wie diese
keytool -exportcert -keystore <keystore> -file some.cer
Sie müssen möglicherweise über den Speichertyp und Speicheranbieter sagen keytool, look here.
Sie, dass die CER-Datei in den iOS-Schlüsselanhänger mit diesem Code lesen:
- (void) importCertToKeyChain: (NSData *) data
{
// Delete the old certificate, otherwise SecItemAdd complains.
OSStatus oss = SecItemDelete((__bridge CFDictionaryRef)([self clientCertificateQuery]));
// Import the certificate
SecCertificateRef certRef = NULL;
certRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(data));
NSDictionary *att = [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)(kSecClassCertificate), kSecClass, (__bridge id) certRef, kSecValueRef, nil];
oss = SecItemAdd((__bridge CFDictionaryRef)(att), NULL);
}
Wenn Sie das Zertifikat benötigen, können Sie aus dem Schlüsselbund wie diese:
- (SecCertificateRef) getCertFromKeyChain
{
CFTypeRef ref = NULL;
SecItemCopyMatching((__bridge CFDictionaryRef)([self clientCertificateQuery]), &ref);
return (SecCertificateRef) ref;
}
Das clientCertificateQuery Aussehen so was.
static NSString *clientCertSubject = @"TestSubjectClient";
-(NSMutableDictionary *) clientCertificateQuery
{
NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:(__bridge id) kSecClassCertificate forKey:(__bridge id)kSecClass];
[query setObject:clientCertSubject forKey:(__bridge id<NSCopying>)(kSecMatchSubjectContains)];
[query setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
id)kSecAttrKeyType];
return query;
}
Es gibt auch eine Funktion, um einen PCKS12 Speicher zu lesen (Sie würden immer noch Ihren BKS Speicher in dieses Format umwandeln müssen). Es heißt SecPKCS12Import
und damit müssen Sie das Cert nicht in Ihren iOS-Schlüsselbund importieren. Ich hatte kein Glück damit und brauchte das Zertifikat im Schlüsselbund, aber hier ist something about this.
Update:
Wie camdaochemgio zeigte in den Kommentaren obigen Verfahren unter Verwendung von aus nicht empfehlen, wenn ein Zertifikat enthält, die geheimen Informationen enthält (wie private Schlüssel) in einer App. Weil die .cer-Datei nicht geschützt ist und leicht aus der .ipa extrahiert werden kann.
PKCS # P12 unterstützt den Passwortschutz, daher ist es besser, dies zu verwenden.
Sie können Ihre Schlüsselspeicher zu PKCS # P12 wie folgt aus (genommen from here) verdeckte:
keytool -importkeystore -srckeystore KEYSTORE.jks -destkeystore KEYSTORE.p12 -srcstoretype BKS -deststoretype PKCS12 -srcstorepass mysecret -deststorepass mysecret -srcalias myalias -destalias myalias -srckeypass mykeypass -destkeypass mykeypass -noprompt
Dann können Sie die P12-Datei wie folgt laden (Credits gehen here)
// Load Certificate
NSString *path = [[NSBundle mainBundle] pathForResource:@"cert" ofType:@"p12"];
NSData *p12data = [NSData dataWithContentsOfFile:path];
CFDataRef inP12data = (__bridge CFDataRef)p12data;
// Only password based PKCS#12 blobs are supported
CFStringRef password = CFSTR("Password");
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { password };
CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
// The import
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus securityError = SecPKCS12Import(inP12data, options, &items);
if (securityError == 0)
{
// Exploring the content
CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
const void *tempIdentity = NULL;
tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity);
*identity = (SecIdentityRef)tempIdentity;
const void *tempTrust = NULL;
tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust);
*trust = (SecTrustRef)tempTrust;
}
if (options) {
CFRelease(options);
}
Last aber nicht zuletzt ein paar Links zu diesem Thema:
Auf diese Weise ist nicht sicher, da die Zertifikatsdatei in Hauptbündel gespeichert wird. Jemand kann das Bündel extrahieren und dann die Datei ohne Passwort erhalten. Keystores als Android ist besser, aber ich weiß nicht, Keystores in iOS zu tun. Irgendeine Idee? –
@camdaochemgio Richtig, ich habe den Post aktualisiert, wie man mit PCKS12 Stores arbeitet. – sofacoder