2012-09-04 89 views
1

我能夠按照this question中的說明構建Android的共享庫openssl。在Android中使用openssl-fips-2.0共享庫

E.g.

cd openssl-fips-2.0/ 
./config 
make 
make install 

而且

cd openssl-1.0.1c/ 
./config fips --with-fipsdir=/usr/local/ssl/fips-2.0/ shared 
make depend 
make 

這會產生libcrypto.so.1.0.0和libssl.so.1.0.0與相應的符號鏈接到他們作爲libcrypto.so和libssl.so。

由於NDK構建系統不支持版本化的共享庫,我不得不使用符號鏈接(使用PREBUILT_SHARED_LIBRARY)。但是,有了這個,庫最終會以libcrypto.so和libssl.so的身份登錄到設備,而不是libcrypto.so.1.0.0和libssl.so.1.0.0,導致我的磁帶庫無法加載,因爲它正在尋找用於具有版本名稱的庫。

鏈接的問題提到用System.load(libcrypto.so.1.0.0)而不是System.loadLibrary()加載庫,但我還沒有能夠得到這個工作,即使是完整的路徑,因爲如上所述之前,該文件將作爲libcrypto.so複製到設備中。

沒有人成功地做到了這一點?

注意:我也嘗試修改openssl-1.0.1c配置文件和makefile以生成libcrypto.1.0.0.so(例如,在文件名和soname擴展名之前的版本號),這讓我解決之前的加載問題。但是,當我嘗試使用FIPS_module_mode_set(FIPS_R_FINGERPRINT_DOES_NOT_MATCH)打開FIPS模式時,出現此錯誤。

我不知道爲什麼會發生這種情況,但這可能是由於NDK剝離了「不需要」的東西(請參閱此question)...我仍然在看這個,但如果有人有一些這方面的信息以及它將非常感謝。

+0

你見過這個討論http://stackoverflow.com/questions/11091905/android-build-openssl-fips-2-0在你發佈你的問題之前? –

+0

是的,我試着給它添加後續評論,因爲它至少看起來像是brewphone正常工作,但由於我沒有足夠的信譽,我無法做到這一點。當我添加一個'答案'它被刪除。 –

+0

這個問題也與此有關。 –

回答

2

讓我們正確識別問題。這可能不是導致問題的NDK構建,當它從靜態庫構建共享庫時,絕對不是導致未使用條目的鏈接器。

首先,我不確定您可以在通常的APK中提供FIPS模式,而無需重建或至少生根Android(請參閱http://gcn.com/articles/2010/12/23/android-fips-security.aspx)。

沒有爲System.load()沒有問題的加載版本。所以,當你一)正確指定的完整路徑(例如System.load("/data/local/tmp/libssl.so.1.0.0"))和B)文件傳送到該路徑。對於第一次測試,我建議手動將libcrypto.so.1.0.0libssl.so.1.0.0上傳到/sdcard/並查看FIPS指紋是否變得更快樂。

如果/SD卡/位置造成任何問題,你可以嘗試/數據/本地//數據/本地的/ tmp/。您還可以使用/data/data/(您的包裝)/files/。後者有一個好處:當您的應用程序被卸載時,它將被系統自動刪除。

要製作版本爲.so的(如libcrypto.so.1.0.0)部分APK,請將其複製到項目的資產文件夾中。 Java代碼負責將它從那裏複製到磁盤上的指定位置。確保此Java代碼處理正確的升級和SD卡交換。

+0

謝謝亞歷克斯! 事實證明,我需要將未清除的庫作爲內容打包,然後將它們複製到應用程序數據文件夾中,之後將System.load(「/ data/data/myapp/files/libcrypto.so.1.0.0」 )和System.load(「/ data/data/myapp/files/libssl.so.1.0.0」)的技巧。 有趣的是,只要更改makefiles即可在.so擴展名之前放置版本號,即使未觸及fips,也會導致指紋失敗。 –

+0

好消息!祝你的項目好運! –

+0

你不知道任何方式不要有剝離的libcrypto.so和libssl.so不成爲apk的一部分嗎? –