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

标签 android android-ndk openssl fips

我能够按照 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.0libssl.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/

相关文章:

java - 如何将 android 应用程序连接到非本地的 mysql 数据库?

linux - `environ` 结束后是什么?

android - 如何使用gradle以编程方式将libc++ _ shared.so包含到我的APK中?

mysql - 在本地主机上使用 OpenSSL 连接到 MySql 数据库

authentication - OpenSSL:是否可以附加额外的字符串进行身份验证?

android - 如何正确调用 mbstowcs?

android - 使用 AsyncTask 从数据库填充 ListView

android - 在 Android Studio 中重写 Gradle Remote Dependency 的 targetSdkVersion

android - ASSIMP - 安卓 NDK 工具链

linux - RHEL 中的 openssl - 在不使用 openssl.cnf 的情况下使用 root 签署客户端证书?