2016-01-14 68 views
1

我們有一個項目需要在iOS設備上運行openssl引擎。我們已經爲測試引擎編譯了.so文件,並且它可以在命令行下正常工作。但是,當我們將其放入iOS項目並嘗試加載引擎時,加載步驟始終會出現錯誤。未裝載用於iOS的Openssl引擎

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將永遠是NULL。我懷疑iOS不允許這樣的動態庫。有沒有人有經驗如何使OpenSSL引擎在iOS上工作?

+0

大多數iOS版本都不允許動態加載庫。我被告知最近改變了。但是,你可以通過「swizzling」來解決它。請參見[使用動態庫的Objective C方法Swizzling](http://stackoverflow.com/q/9638815)。另請參閱[重新思考和重新包裝iOS應用程序](https://www.google.com/search?q=Rethinking+%26+Repackaging+iOS+Apps)。 – jww

+0

@jww感謝您的信息。使用動態庫進行Swizzling是另一種嘗試的方法。然而,在挖掘之後,我被告知Apple不允許在iOS中定製動態庫(將被App Store拒絕)。所以另一個問題是,我們可以在編譯OpenSSL時修改'openssl.cnf'來添加我們的庫,然後將它作爲默認引擎提供嗎? – Summer

回答

0

最後我把它用靜態engine..Simply載入中OpenSSL的引擎調用引擎文件應該努力解決。 iOS上無需動態引擎。

+0

你介意分享更多關於如何使這項工作的細節? 「簡單地加載引擎文件我OpenSSL引擎調用」是什麼意思?謝謝。 – mkwon

+0

@mkwon由此我的意思是你可以在Xcode項目中包含.c引擎文件並直接使用它。不需要將其預編譯到.so文件中,然後將其放入Xcode項目中。 – Summer

+0

你是否嘗試過在EVP_KEY中使用引擎,並將它包裝在SecIdentityRef中?我試圖找到一種方法來使用OpenSSL引擎進行https客戶端身份驗證 – Indio

0

Apple不允許您在iOS上使用「so」(共享庫)。

你最簡單的方法是通過的CocoaPods OpenSSL的集成到您的項目:https://cocoapods.org/pods/OpenSSL-Universal

+0

不幸的是,它看起來像OpenSSL-Universal不提供修正版本的'opensslconf.h'。 – jww

+0

@jww更詳細地描述問題。我相信你會埋葬一些東西。 –

+0

謝謝亞歷山大。然而,這不是導致問題的OpenSSL。我們已經在我們的iOS項目中使用了OpenSSL,並且它工作正常。它是OpenSSL的引擎部分不起作用。所有示例/教程都將引擎編譯爲.so文件並在運行時加載它。所以我只是想知道是否有與iOS兼容的方式來整合它。 – Summer