我能够按照this question中的说明为Android构建openssl的共享库。
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 config和makefile以生成libcrypto.1.0.0.so(例如,在文件名和soname中扩展名之前的版本号)这样我就可以了围绕上一个加载问题。但是,当我尝试使用FIPS_module_mode_set(FIPS_R_FINGERPRINT_DOES_NOT_MATCH)打开FIPS模式时,我收到错误。
我不知道为什么会发生这种情况,但这可能是由于NDK剥离了“不需要的”东西(见question)...我仍然在看这个但是如果有人对此有一些信息也会非常感激。
答案 0 :(得分:2)
让我们正确地识别问题。 NDK构建可能不会导致问题,并且肯定不是链接器在从静态lib构建共享库时剥离未使用的条目。
首先,我不确定您是否可以在常规APK中提供FIPS模式,而无需重建或至少生成Android(请参阅例如http://gcn.com/articles/2010/12/23/android-fips-security.aspx)。
{<1}}加载版本化的.so时没有问题 a) 正确指定完整路径(例如 System.load()
)和 b) 文件将传递到该路径。对于第一次测试,我建议您手动将System.load("/data/local/tmp/libssl.so.1.0.0")
和libcrypto.so.1.0.0
上传到 / sdcard / ,看看FIPS指纹是否更快乐。
如果 / sdcard / 上的位置导致任何问题,您可以尝试 / data / local / 或 / data / local / tmp / 。您还可以使用 / data / data / (您的包) / files / 。后者有一个优点:当您的应用程序被卸载时,系统会自动删除它。
要制作版本的 .so (如libssl.so.1.0.0
)部分APK,请将其复制到项目的资源文件夹中。您的Java代码将负责将其从那里复制到磁盘上的指定位置。确保此Java代码正确处理升级和SD卡交换。