2012-06-01 9 views
9

Ahora tengo un problema con mi clave pública, utilicé SecKeyGeneratePair para generar pública y privada. Ahora tengo que enviar mi clave pública al servidor. He usado el siguiente método para convertir SecKeyRef en NSData, siempre obtengo la misma clave pública. Sin embargo, lo convertí en formato base64 y lo envié al servidor. Pero no funciona en absoluto y el servidor (Java) comienza a lanzar errores. Aquí está mi código de iOS:iOS SecKeyRef (clave pública) enviarlo al servidor

- (NSData *)getPublicKeyBits { 
    OSStatus sanityCheck = noErr; 
    NSData * publicKeyBits = nil; 

    NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; 

    // Set the public key query dictionary. 
    [queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass]; 
    [queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag]; 
    [queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType]; 
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData]; 

    // Get the key bits. 
    sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits); 

    if (sanityCheck != noErr) 
    { 
     publicKeyBits = nil; 
    } 

    [queryPublicKey release]; 

    return publicKeyBits; 
} 

¿Puede cualquiera que me ayude a convertir a SecKeyRef NSString o NSData.

Gracias de antemano!

-Murali Krishnan

+0

¿Es posible anular la marca esto como un duplicado? Las respuestas aquí son perfectas para el caso de uso para usar pares de claves RSA generadas con iOS con un servidor Java, pero la pregunta vinculada no. – mikeho

Respuesta

9

Creo que las claves generadas por iOS faltan algunos datos de cabecera que el resto del mundo (Java API en su caso) espera ver. Por lo tanto, para que Java funcione con una clave generada por las API de seguridad de iOS, primero necesita agregar esta información de encabezado a la clave binaria.

A la inversa, a fin de que el IOS Sec * API para trabajar con una clave generada por openssl o ssh-keygen (por ejemplo), primero debe eliminar esta información de la cabecera de la clave binaria.

Específicamente, iOS no le gusta el OID ASN.1, y el resto del mundo sí.

Consulte este artículo para exportar una clave generada por el IOS para su uso por una aplicación Java - debe conseguir que va:

http://blog.wingsofhermes.org/?p=42

+0

Ver también [blog de Chris Luke] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo

+0

Bien, esta respuesta ayuda exactamente al caso de uso que estaba teniendo problemas con. – mikeho

Cuestiones relacionadas