【问题标题】:Using openssl-fips-2.0 shared libraries in Android在 Android 中使用 openssl-fips-2.0 共享库
【发布时间】:2012-09-04 18:46:17
【问题描述】:

我能够按照 this question 中的指示为 Android 构建一个 openssl 共享库。

例如

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)...我也在看这个,但如果有人有对此也有一些信息,我们将不胜感激。

【问题讨论】:

  • 在您发布问题之前,您是否在stackoverflow.com/questions/11091905/… 看到过此讨论?
  • 是的,我尝试添加后续评论,因为它看起来至少 brewphone 可以正常工作,但由于我没有足够的信誉,我无法做到。当我添加“答案”时,它被删除了。
  • 该问题也与此相关。
  • 我设法构建了一个无版本的libcrypto.so,参见stackoverflow.com/a/33869277/4735903。

标签: android android-ndk openssl fips


【解决方案1】:

让我们正确识别问题。导致问题的可能不是 NDK 构建,也绝对不是在从静态库构建共享库时剥离未使用条目的链接器。

首先,我不确定您是否可以在普通 APK 中提供 FIPS 模式,而无需重新构建或至少植根 Android(参见例如 http://gcn.com/articles/2010/12/23/android-fips-security.aspx)。

System.load() 加载版本化的 .so 没有问题,所以当您 a) 正确指定完整路径时(eg @ 987654323@) 和 b) 文件被传送到该路径。对于第一次测试,我建议手动将libcrypto.so.1.0.0 和libssl.so.1.0.0 上传到/sdcard/,看看FIPS 指纹是否变得更快乐。

如果 /sdcard/ 上的位置导致任何问题,您可以尝试 /data/local/ 或 /data/local/tmp/。您也可以使用 /data/data/(您的包)/files/。后者有一个优点:当你的应用被卸载时,它会被系统自动删除。

要使版本化的 .so(如 libcrypto.so.1.0.0)成为 APK 的一部分,请将其复制到项目的 assets 文件夹中。您的 Java 代码将负责将其从那里复制到磁盘上的指定位置。确保此 Java 代码正确处理升级和 SD 卡交换。

【讨论】:

  • 谢谢亚历克斯!事实证明,我需要将未剥离的库打包为内容,然后将它们复制到应用程序数据文件夹中,之后 System.load("/data/data/myapp/files/libcrypto.so.1.0.0")并且 System.load("/data/data/myapp/files/libssl.so.1.0.0") 成功了。有趣的是,只是更改 makefile 以将版本号放在 .so 扩展名之前会导致指纹失败,即使 fips 的内容没有被触及。
  • 好消息!祝你的项目好运!
  • 你不知道有什么方法可以不让剥离的 libcrypto.so 和 libssl.so 不成为 apk 的一部分?
  • 目前我的 jni 库的 Android.mk 文件包括 openssl 加密和 ssl 库作为 LOCAL_SHARED_LIBRARIES 最终导致这些文件被复制到我的 apk 文件中。但是,实际复制到设备的文件是没有版本控制的剥离文件,它们无法使用,然后我进行 System.load 调用。因此,正如本文所讨论的,我最终将“真正的”libcrypto.so.1.0.0 和 libssl.so.1.0.0 文件作为内容包含在 apk 中,以便我可以将它们加载到我的代码中。跨度>
  • 所以虽然这可行,但这意味着我的 apk 最终在 apk 和设备上拥有两个加密和两个 ssl 库,使我的 apk 文件比它必须的大 2MB。理想情况下,我想在 apk 的打包阶段将 libcrypto.so 替换为 libcrypto.so.1.0.0。
猜你喜欢
  • 2012-07-17
  • 2012-06-20
  • 1970-01-01
  • 2017-01-29
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多