2016-01-14 3 views
1

Nous avons un projet qui doit exécuter un moteur openssl sur un appareil iOS. Nous avons compilé le fichier .so pour le moteur de test et cela fonctionne très bien avec la ligne de commande. Mais quand nous le mettons dans le projet iOS et essayons de charger le moteur, l'étape de chargement donne toujours une erreur.Openssl Engine pour iOS n'est pas chargé

NSString *enginePath = [[NSBundle mainBundle] pathForResource:@"silly-engine" ofType:@"so"]; 
char* engine_id = "silly-engine"; 
char* engine_path = (char *)[enginePath UTF8String]; 
ENGINE_load_dynamic(); 
ENGINE *dyn = ENGINE_by_id("dynamic"); 

if (!ENGINE_ctrl_cmd_string(dyn, "SO_PATH", engine_path, 0)) 
{ 
    NSLog(@"SO_PATH failed"); 
} 
if (!ENGINE_ctrl_cmd_string(dyn, "DIR_ADD", engine_path, 0)) 
{ 
    NSLog(@"DIR_ADD failed"); 
} 
if (!ENGINE_ctrl_cmd_string(dyn, "ID", engine_id, 0)) 
{ 
    NSLog(@"ID failed"); 
} 


if (!ENGINE_ctrl_cmd(dyn, "LIST_ADD", 1, NULL, NULL, 0)) 
{ 
    NSLog(@"LIST_ADD failed"); 
} 

if (!ENGINE_ctrl_cmd_string(dyn, "LOAD", NULL, 0)) 
{ 
    NSLog(@"LOAD failed"); 
} 

ENGINE *myEngine = ENGINE_by_id(engine_id); 

myEngine seront aways être NULL. Je soupçonne que iOS ne permet pas de telles bibliothèques dynamiques. Est-ce que quelqu'un a de l'expérience pour faire fonctionner le moteur OpenSSL sur iOS?

+0

La plupart des versions d'iOS n'autorisent pas le chargement dynamique des bibliothèques. On me dit que cela a changé récemment. Cependant, vous pouvez contourner ce problème en "balançant". Voir [Méthode Objective C Swizzling en utilisant la bibliothèque dynamique] (http://stackoverflow.com/q/9638815). Voir également [Rethinking & Repackaging iOS Apps] (https://www.google.com/search?q=Rethinking+%26+Repackaging+iOS+Apps). – jww

+0

@jww Merci pour l'information. Swizzling en utilisant la bibliothèque dynamique est une autre approche que je vais essayer. Cependant, après avoir creusé, on me dit que Apple ne permet pas la bibliothèque dynamique personnalisée dans iOS (sera rejetée par App Store). Donc une autre question est que pouvons-nous modifier 'openssl.cnf' pour ajouter notre bibliothèque en compilant OpenSSL puis le rendre disponible en tant que moteur par défaut? – Summer

Répondre

0

Enfin Je l'ai résolu en utilisant engine..Simply statique chargement du fichier du moteur dans les appels moteur OpenSSL devrait fonctionner. Pas besoin de moteur dynamique sur iOS.

+0

cela vous dérange-t-il de partager plus de détails sur la façon dont cela fonctionne? Que voulez-vous dire par "Simplement charger le fichier du moteur i Appels moteur OpenSSL"? Merci. – mkwon

+0

@mkwon Je veux dire par là que vous pouvez inclure le fichier .c engine dans le projet xcode et l'utiliser directement. Pas besoin de le précompiler dans le fichier .so puis de le déposer dans le projet Xcode. – Summer

+0

Salut avais-tu essayé d'utiliser le moteur dans un EVP_KEY et de l'envelopper dans un SecIdentityRef? J'essaie de trouver un moyen de faire https client auth avec un moteur OpenSSL – Indio

0

Apple ne vous permet pas d'utiliser "so" (bibliothèques partagées) sur iOS.

La façon la plus simple pour vous est d'intégrer OpenSSL à votre projet via CocoaPods: https://cocoapods.org/pods/OpenSSL-Universal

+0

Malheureusement, OpenSSL-Universal ne fournit pas une version corrigée de 'opensslconf.h'. – jww

+0

@jww décrire le problème plus de détails. Je crois que tu es en train de cuner quelque chose. –

+0

Merci Alexander. Cependant, ce n'est pas OpenSSL qui cause le problème. Nous avons déjà OpenSSL dans notre projet iOS et cela fonctionne très bien. C'est la partie Engine d'OpenSSL qui ne fonctionne pas. Tous les exemples/tutoriels compilent le moteur dans un fichier .so et le chargent au moment de l'exécution. Je me demande donc s'il existe un moyen compatible avec iOS pour l'intégrer. – Summer