2012-09-10 6 views
5

Ich baue eine iPhone App, die .bks Keystores zur Authentifizierung benötigt. Ich habe keine Informationen zu diesen Informationen für iOS-Apps gefunden.Verwendung. bks Keystores Zertifikat in iPhone App

Ich würde gerne wissen, ob Apple die Verwendung von Keystores in ihren Apps erlaubt und wie man mit iOS beginnt. Die Zertifikate werden mit BouncyCastle erstellt. Ich habe Informationen darüber für Android gefunden, aber für iOS hatte ich kein Glück. Jede Hilfe wird geschätzt.

Antwort

2

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:

+0

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? –

+0

@camdaochemgio Richtig, ich habe den Post aktualisiert, wie man mit PCKS12 Stores arbeitet. – sofacoder

Verwandte Themen