我能够按照 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,并带有指向它们的相应符号链接(symbolic link),如 libcrypto.so 和 libssl.so。
由于 NDK 构建系统不支持版本共享库,我不得不使用符号链接(symbolic link)(使用 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)...我也在看这个,但如果有人有关于这方面的一些信息,我们将不胜感激。
最佳答案
让我们正确地识别问题。导致问题的可能不是 NDK 构建,也绝对不是在从静态库构建共享库时剥离未使用条目的链接器。
首先,我不确定您是否可以在不重建或至少生根 Android 的情况下在普通 APK 中提供 FIPS 模式(参见示例 http://gcn.com/articles/2010/12/23/android-fips-security.aspx)。
当您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/(您的包)/files/。后者有一个优点:当您的应用程序被卸载时,它会被系统自动删除。
要将版本化的 .so(如 libcrypto.so.1.0.0
)作为 APK 的一部分,请将其复制到项目的 Assets 文件夹中。您的 Java 代码将负责将其从那里复制到磁盘上的指定位置。确保此 Java 代码正确处理升级和 SD 卡交换。
关于android - 在 Android 中使用 openssl-fips-2.0 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12269563/