我有一个Python应用程序,它是用Python、Libcrypto和LibSSL共享对象打包的。这个应用程序是用Openssl Fips Module 2.0构建的。Python的请求模块和urllib3使用这些共享对象来发出TLS请求。
我在构建应用程序的环境中启用了OPENSSL_FIPS标记。现在,如果要检查共享对象在从开发环境中取出并将其放入另一台计算机时是否启用了fips模式,该如何操作?
如何检查是否启用了fips模式?如果没有,如何为这些共享对象启用fips模式?
可能有所帮助的其他详细信息:
- OpenSSL版本:1.0.2h(根据源代码构建)**
- Fips模块:2.0.12(从源代码构建)**
- 巨蟒:3.6**
- 操作系统:Ubuntu 16.04 LTS**
如果需要任何其他详细信息,请告知我。
谢谢!
1条答案
按热度按时间igetnqfo1#
我使用常规标志构建了 * OpenSSL-FIPS * 模块(例如:* no-asm 、 shared *、禁用某些旧密码):
开始玩它:
注意"(存储库:OpenSSL 1.0.2g 2016年3月1日)"部分。该部分(存在)表明 * openssl * 可执行文件正常(预期版本),但它使用了错误的 * libcrypto(默认安装在系统上--在/lib * 下--通常不支持 * FIPS *)。
它必须加载我们的库,这是通过设置 * LD_LIBRARY_PATH * 来完成的(同样的行为也可以通过在构建 * OpenSSL * 时设置一个env var来实现,该env var将设置 * openssl * 可执行文件中的 * rpath *,但我忘记了,我不想再次构建它):
现在,设置已经成功,让我们深入了解 * OPENSSL_FIPSenvvar *:
从上面可以看出,* md5 * 哈希行为受 * OPENSSL_FIPS**env var * 的影响(当 * FIPS * 模式打开时,不允许使用它)。
由于 * OPENSSL_FIPSenv var * 是在 * openssl * 可执行级别处理的,将被绕过(因为 * libcrypto * 将被直接使用),因此对于当前情况没有任何用处,因此我们必须深入研究。以下是在loaded***libcrypto * 示例中控制 * FIPS * 模式的函数:
它们将用于读取/写入 * FIPS * 模式。为了测试是否真正设置了 * FIPS * 模式,将使用 * md5 * 散列(来自上例)。
import hashlib
语句位于设置 * FIPS * 模式之后(而不是在文件开头,这是应该的),因为 * hashlib在导入时执行一些缓存,所以它在导入时捕获 * FIPS * 值,而不关心它之后是否更改如图所示,通过 * CTypes * 设置 * FIPS * 模式,实际上设置了它。
我不知道为什么会出现 * SegFault ,但与 * md5 * 相关的代码仅用于测试目的,因此在生产中不需要。
我记得在一些 * Nix * 版本(可能是基于 * RH * 的)上,也可以通过编辑一些条目(在/proc * 下?)来设置 * FIPS * 模式(对系统全局),但我不记得了。
一个更优雅的方法是为这两个函数公开 * Python * Package 器。
检查**[Python.Bugs]: FIPS_mode() and FIPS_mode_set() functions in Python (ssl),我还提交了 * Python3.4***的补丁(它们由**ssl**模块公开),但基于以下参数(其中前两个是相关的),它被拒绝了:
1. FIPS * 是一个糟糕的标准
1. OpenSSL * 将不再支持它
1.它打破了一般性
您可以将其应用于 * Python 3.6 *(我不认为它会工作 * OOTB *,因为行号很可能会改变),而且(显然)您必须从源代码构建 * Python *。
*FIPS * 工作和FIPS * 验证之间有很大的区别,我相信您已经在[OpenSSL]: User Guide for the OpenSSL FIPS Object Module v2.0上读到过
一些可能有用的参考资料(尽管最后一个可能有点太"深奥"):
更新 *#0 *
我突然想到,您在[SO]: Not able to call FIPS_mode_set() of libcrypto.so with Python ctypes [duplicate]上遇到的行为也可能与加载了错误的 * libcrypto有关(从一开始就检查
openssl version
测试w/wo * LD_LIBRARY_PATH *)。不支持 * FIPS * 的 * OpenSSL * 仍将导出这2个函数,但它们都只返回0。
因此,确保通过指定 * LD_LIBRARY_PATH*来加载正确的库(还有其他方法,但这是最直接的一种)。