FIPS Capable OpenSSL和一般Android问题

时间:2015-05-22 04:53:08

标签: android security android-ndk openssl fips

我的要求是将应用程序与FIPS Capable OpenSSL集成。我正在按照下一个教程在https://wiki.openssl.org/index.php/FIPS_Library_and_Android编译库。

但我有一些我不理解的一般性问题。

  1. 为什么我需要使用FIPS编译库,以及为什么不对它们进行预编译?

  2. 我可以使用Cygwin在Windows中编译它们吗?我一直在检查shell,它看起来只适用于linux和Mac。

  3. 编译完库后,我可以在带有gradle的jniLibs文件夹中添加到我的项目中,它们将在所有设备中运行吗?或者我需要为我想支持的每个架构进行预编译?

  4. 编译库并获取.so文件之后我计划使用NDK集成它,但是我是否需要在C / C ++中创建一个包装类来在OpenSSL库和java之间建立桥梁码?

  5. 你有创建这个包装类的教程,我没有使用过C和OpenSSL的经验,我一直使用Java和BouncyCastle。

  6. 提前致谢。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 为什么我需要使用FIPS编译库,以及为什么它们不是预编译的?
  2.   

OpenSSL和美国政府以源代码形式进行验证,因此它与任何平台无关(有些人放弃正常运行环境或OE)。

  
      
  1. 我可以使用Cygwin在Windows中编译它们吗?我一直在检查shell,它看起来只适用于linux和Mac。
  2.   

为此,您需要检查OpenSSL FIPS 140-2 Security Policy。它对支持的平台非常具体。该表从第9页开始。

  
      
  1. 编译完库后,我可以使用gradle将其添加到jniLibs文件夹中的项目中吗?它们将在所有设备中运行吗?
  2.   

NO。如果您将共享对象放在JNI文件夹中,则永远不会加载它。这是因为Zygote加载了系统的OpenSSL的低级版本。当您致电loadLibrary时,相关性已经满足了下级版本,因此您的版本映射到流程中。

您必须构建一个包装器共享对象,该对象链接到OpenSSL库的静态版本。

  
      
  1. ...或者我需要为每个想要支持的架构进行预编译?
  2.   

是的,您需要为您计划支持的每个Android平台(ARMv7,MIPSEL,ARM64等)构建它。该版本必须根据1747证书进行验证。您可以在OpenSSL FIPS 140-2 Security Policy

中查看是否已对其进行了验证
  
      
  1. 编译库并获取.so文件后,我计划使用NDK集成它,但是我是否需要在C / C ++中创建一个包装类,以便在OpenSSL库和java代码之间建立桥梁? / LI>   

正确。见(3)的答案。

  
      
  1. 你有创建这个包装类的教程,我没有使用过C和OpenSSL的经验,我一直使用Java和BouncyCastle。
  2.   

不,这是一个偏离主题的地方。你必须找到自己的教程。话虽如此,这里有一本书,提供了一个很好的处理方法: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)。