2012-09-10 6 views
5

Estoy construyendo una aplicación para iPhone que necesita .bks keystores para autenticarse. No encontré nada sobre esta información para las aplicaciones de iOS.Usando. bks keystores certificado en la aplicación iPhone

Me gustaría saber si apple permite el uso de keystores en sus aplicaciones y cómo iniciarse en iOS. Los certificados se crean usando BouncyCastle. Encontré información sobre él para Android, pero para iOS no tuve suerte. Cualquier ayuda será apreciada.

Respuesta

2

Se puede exportar el certificado (s) que necesita del almacén de claves como esto

keytool -exportcert -keystore <keystore> -file some.cer 

Es posible que tenga que contar herramienta de claves sobre el tipo de almacén y proveedor de almacén, look here.

Usted puede leer el archivo .cer en el llavero iOS con este código:

- (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); 
} 

Cuando se necesita el certificado que se puede llegar desde el llavero así:

- (SecCertificateRef) getCertFromKeyChain 
{ 
    CFTypeRef ref = NULL; 
    SecItemCopyMatching((__bridge CFDictionaryRef)([self clientCertificateQuery]), &ref); 

    return (SecCertificateRef) ref; 
} 

Las miradas clientCertificateQuery Me gusta esto.

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; 
} 

También hay una función para leer una tienda PCKS12 (usted todavía necesita para transformar su tienda BKS en ese formato). Se llama SecPKCS12Import y con ella no necesitará importar el certificado en su llavero iOS. No tuve suerte con eso y necesitaba el certificado en el llavero de todos modos, pero aquí está something about this.

Actualización:

Como camdaochemgio se señala en los comentarios usando el método anterior no se recomiendan cuando se incluye un certificado que contiene información secreta (como claves privadas) en una aplicación. Porque el archivo .cer no está protegido y puede extraerse fácilmente desde .ipa.

PKCS # P12 admite protección con contraseña, por lo que es mejor usar esto.

Puede encubierta para el almacén de claves PKCS # P12 como esto (tomado from here):

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 

, puede cargar el archivo .p12 como esto (créditos van 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); 
} 

Último pero no menos importantes algunos enlaces relacionados con este tema:

+0

esta manera no es seguro, porque el archivo de certificado se almacena en el paquete principal. Algunos pueden extraer el paquete y luego obtener el archivo sin contraseña. Tiendas de claves como android es mejor, pero no sé hacer keystores en iOS. ¿Alguna idea? –

+0

@camdaochemgio Bien, actualicé la publicación sobre cómo trabajar con las tiendas PCKS12. – sofacoder

Cuestiones relacionadas