我的要求是将应用程序与FIPS Capable OpenSSL集成。我正在按照下一个教程在https://wiki.openssl.org/index.php/FIPS_Library_and_Android编译库。
但我有一些我不理解的一般性问题。
为什么我需要使用FIPS编译库,以及为什么不对它们进行预编译?
我可以使用Cygwin在Windows中编译它们吗?我一直在检查shell,它看起来只适用于linux和Mac。
编译完库后,我可以在带有gradle的jniLibs文件夹中添加到我的项目中,它们将在所有设备中运行吗?或者我需要为我想支持的每个架构进行预编译?
编译库并获取.so文件之后我计划使用NDK集成它,但是我是否需要在C / C ++中创建一个包装类来在OpenSSL库和java之间建立桥梁码?
你有创建这个包装类的教程,我没有使用过C和OpenSSL的经验,我一直使用Java和BouncyCastle。
提前致谢。
答案 0 :(得分:0)
- 为什么我需要使用FIPS编译库,以及为什么它们不是预编译的?
醇>
OpenSSL和美国政府以源代码形式进行验证,因此它与任何平台无关(有些人放弃正常运行环境或OE)。
- 我可以使用Cygwin在Windows中编译它们吗?我一直在检查shell,它看起来只适用于linux和Mac。
醇>
为此,您需要检查OpenSSL FIPS 140-2 Security Policy。它对支持的平台非常具体。该表从第9页开始。
- 编译完库后,我可以使用gradle将其添加到jniLibs文件夹中的项目中吗?它们将在所有设备中运行吗?
醇>
NO。如果您将共享对象放在JNI文件夹中,则永远不会加载它。这是因为Zygote加载了系统的OpenSSL的低级版本。当您致电loadLibrary
时,相关性已经满足了下级版本,因此您的版本不映射到流程中。
您必须构建一个包装器共享对象,该对象链接到OpenSSL库的静态版本。
- ...或者我需要为每个想要支持的架构进行预编译?
醇>
是的,您需要为您计划支持的每个Android平台(ARMv7,MIPSEL,ARM64等)构建它。该版本必须根据1747证书进行验证。您可以在OpenSSL FIPS 140-2 Security Policy。
中查看是否已对其进行了验证
- 编译库并获取.so文件后,我计划使用NDK集成它,但是我是否需要在C / C ++中创建一个包装类,以便在OpenSSL库和java代码之间建立桥梁? / LI> 醇>
正确。见(3)的答案。
- 你有创建这个包装类的教程,我没有使用过C和OpenSSL的经验,我一直使用Java和BouncyCastle。
醇>
不,这是一个偏离主题的地方。你必须找到自己的教程。话虽如此,这里有一本书,提供了一个很好的处理方法:Android Native Development Kit Cookbook。见第9章。
您仍然需要从命令行使用OpenSSL的makefile构建OpenSSL库。这是FIPS 140-2的政策和程序要求。但您可以使用Android修改过的make / build系统构建共享对象。
祝你好运使用Android改进的make / build系统。它非常令人沮丧,因为它记录不清。我找不到全面的治疗方法。你可以从" Hello World"开始JNI项目在文档中。然后,您尝试通过搜索答案并在Stack Overflow上提出问题来扩展到现实世界(当遇到问题时,例如编译器找不到OpenSSL头,链接器找不到静态库,或者包装器共享对象是没有打包APK)。