在Android中使用openssl-fips-2.0共享库

在Android中使用openssl-fips-2.0共享库,android,android-ndk,openssl,fips,Android,Android Ndk,Openssl,Fips,我能够按照中的说明为Android构建openssl的共享库 例如 及 这将生成libcrypto.so.1.0.0和libssl.so.1.0.0,并将相应的符号链接作为libcrypto.so和libssl.so 由于NDK构建系统不支持版本化的共享库,我不得不使用符号链接(使用预构建的共享库)。但是,通过这种方式,库最终以libcrypto.so和libssl.so的形式到达设备,而不是以libcrypto.so.1.0.0和libssl.so.1.0.0的形式到达设备,导致我的库在查找具

我能够按照中的说明为Android构建openssl的共享库

例如

这将生成libcrypto.so.1.0.0和libssl.so.1.0.0,并将相应的符号链接作为libcrypto.so和libssl.so

由于NDK构建系统不支持版本化的共享库,我不得不使用符号链接(使用预构建的共享库)。但是,通过这种方式,库最终以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配置文件和makefiles,以生成libcrypto.1.0.0.so(例如,文件名和soname中扩展名之前的版本号),这使我能够绕过以前的加载问题。但是,当我尝试在设置了FIPS_模块_模式_的情况下打开FIPS模式(FIPS_R_指纹_不匹配)时,会出现一个错误


我还不知道为什么会发生这种情况,但这可能是由于NDK剥离了“不需要的”东西(见此)。。。我仍在研究这个问题,但如果有人对此也有一些信息,我将不胜感激。

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

首先,我不确定您是否可以在普通APK中提供FIPS模式,而无需重建或至少支持Android(参见示例)

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

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


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

在发布问题之前,您是否看过此讨论?是的,我尝试添加后续注释,因为它看起来至少brewphone可以正常工作,但由于我没有足够的信誉,我无法做到这一点。当我添加一个“答案”时,它被删除了。这个问题也与此相关。我成功地构建了一个版本,没有libcrypto。所以请参见。谢谢Alex!事实证明,我需要将未剥离的lib打包为内容,然后将它们复制到apps数据文件夹中,然后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内容,也会导致指纹失败。好消息!祝你的项目好运!您可能不知道有什么方法可以不让剥离的libcrypto.so和libssl.so成为apk的一部分?目前,我的jni库的Android.mk文件包括openssl crypto和ssl LIB作为本地共享库,最终导致这些文件被复制到我的apk文件中。但是,实际复制到设备上的文件是没有版本控制的剥离文件,在我执行System.load调用时无法使用它们。因此,正如本文所讨论的,我最终将“真正的”libcrypto.So.1.0.0和libssl.So.1.0.0文件作为内容包含在apk中,这样我就可以将它们加载到我的代码中。因此,在这起作用的同时,这意味着我的apk在apk中和设备上都有两个加密和两个ssl LIB,使我的apk文件比它必须的大小大约2MB。理想情况下,我希望在apk的打包阶段用libcrypto.so.1.0.0替换libcrypto.so。
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