1

我能够按照这个问题中的指示为 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 剥离了“不需要”的东西(见这个问题)......我还在看这个,但如果有人有一些关于这个的信息非常感谢。

4

1 回答 1

2

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

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

System.load()加载版本化的 .so没有问题,因此当您a)正确指定完整路径(例如 System.load("/data/local/tmp/libssl.so.1.0.0"))并且b)文件被传递到该路径时。对于第一次测试,我建议手动上传libcrypto.so.1.0.0libssl.so.1.0.0/sdcard/看看 FIPS 指纹是否变得更快乐。

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

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

于 2012-09-08T21:39:26.177 回答