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:
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? –
@camdaochemgio Bien, actualicé la publicación sobre cómo trabajar con las tiendas PCKS12. – sofacoder