如何检查OpenSSL中的FIPS 140-2支持?

我们有一个客户询问OpenSSL FIPS (Federal Information Processing Standard) 140-2 兼容的支持validation密码使用。 如何检查OpenSSL是否有FIPS抱怨提供FIPSvalidation密码?

操作系统: Redhat 5 Linux

我如何检查OpenSSL是否提供了经过FIPS验证的密码术?

这取决于如何以及何时要检查。 这也取决于应用程序。

FIPS可用,但不能使用。 因此,应用程序必须通过FIPS_mode_set启用验证的加密,并且调用必须成功。


如果要检查是否已将FIPS功能库(如OpenSSL 1.0.1e)配置为使用FIPS对象模块,则可以:

 $ cat /usr/local/ssl/include/openssl/opensslconf.h | grep -A 2 -i fips #ifndef OPENSSL_FIPS # define OPENSSL_FIPS #endif 

OPENSSL_FIPS告诉您FIPS功能库被配置为使用FIPS对象模块。 所以FIPS验证的密码是可用的。

OPENSSL_FIPS并不意味着应用程序正在使用FIPS验证的加密。 应用程序必须调用FIPS_mode_set ,并且该函数必须返回成功。


在运行时,可以打印与以下代码相关的字符串(从我为此专门使用的代码中获取):

 ostringstream oss; oss << OPENSSL_VERSION_TEXT; LogVersion(oss.str().c_str()); 

该代码将生成类似于以下内容的日志条目:

 Version: OpenSSL 1.0.1f-fips 6 Jan 2014 

您可以用一些技巧来审计模块。 例如,如果可执行文件是真正的FIPS,下面将测试一些必须存在的符号。

在这种情况下,我正在测试OpenSSL FIPS Capable共享对象。 如果应用程序链接到libcrypto.a ,那么您可以审计程序而不是OpenSSL共享对象。

 $ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_* 00000000000c7f60 T ERR_load_FIPS_strings 00000000000c2250 T FIPS_add_error_data 00000000000c3900 T FIPS_add_lock 0000000000082820 T FIPS_bn_bin2bn 0000000000082980 T FIPS_bn_bn2bin 0000000000082760 T FIPS_bn_clear 0000000000082350 T FIPS_bn_clear_free 00000000000823d0 T FIPS_bn_free 0000000000087c90 T FIPS_bn_generate_prime_ex 0000000000082790 T FIPS_bn_get_word 0000000000082d20 T FIPS_bn_is_bit_set 0000000000087c80 T FIPS_bn_is_prime_ex 0000000000087750 T FIPS_bn_is_prime_fasttest_ex ... 

你也有来自fips_premain.c的符号:

 $ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_text_* 00000000000c4520 T FIPS_text_end 000000000007b340 T FIPS_text_start $ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_rodata* 00000000001e1e20 R FIPS_rodata_end 00000000001d8ce0 R FIPS_rodata_start $ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_signature* 00000000004696c0 B FIPS_signature $ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_incore* 000000000007b5a0 T FIPS_incore_fingerprint 

现在,这真是鬼鬼祟祟的。 您可以检查模块是否包含自检。 例如, fips_drbg_selftest.h将包含以下字节的自测:

 0x2e,0xbf,0x98,0xf9,0x85,0x27,0x8b,0xff,0x36,0xb9,0x40,0x0b, 0xc0,0xa1,0xa0,0x13,0x20,0x06,0xcc,0xe6,0x2a,0x03,0x77,0x7d, 0xee,0xde,0xcc,0x34,0xe3,0xcd,0x77,0xea,0xd0,0x3e,0xbe,0xdd, 0xf6,0x15,0xfb,0xa7,0xd7,0x8e,0xd0,0x2e,0x2f,0x82,0x4c,0xc7, 0x87,0xb1,0x6f,0xc5,0xf8,0x5c,0x78,0xde,0x77,0x9b,0x15,0x9a, 0xb9,0x3c,0x38 

并且您可以验证开发人员在其可执行文件上运行incoremacho_incore以通过转储符号FIPS_signature的20个字节来嵌入FIPS指纹。 如果其20个字节的0(缺省来自fips_premain.c ),则指纹没有被嵌入,并且FIPS_mode_set将失败。 所以在这种情况下不可能使用经过FIPS验证的密码术。


更新 :我上传了一个关于这个主题的幻灯片给OpenSSL wiki。 它被称为使用OpenSSL验证的密码学的建筑应用程序:来自现场的开发人员和审计员的注意事项 。 您将需要查看幻灯片18附近的材料。

我为OWASP构建了幻灯片,但是没有兴趣收到它。 我知道Stack Overflow在OpenSSL wiki上的链接上皱眉,但是我不知道如何在这里提供一个35+的幻灯片。

要检查openssl是否在fips模式下运行,请发出以下命令:

 $ openssl md5 somefile 

以上应该失败,因为MD5不是一个批准的哈希标准。

 $ openssl sha1 somefile 

以上将作为SHA1是fips Approved哈希标准。

例如

 # openssl md5 message.txt Error setting digest md5 140062425388872:error:060800A3:digital envelope routines:EVP_DigestInit_ex:disabled for fips:digest.c:251: # openssl sha1 message.txt SHA1(messagetext.txt)= 9f5080758dbf71537cc44a4d8cb67564f2ad938a 

参考

OpenSSL本身不是FIPS 140-2验证的,根据它的维护者,永远不会。 但是,它有一个名为FIPS对象模块的FIPS 140-2验证模块,部分取代了在vanilla OpenSSL中使用的libcrypto 。 更多信息,包括用户指南 ,可以在这里找到。 简而言之:

OpenSSL本身没有被验证,永远不会。 相反,已经创建了一个称为OpenSSL FIPS对象模块的特别仔细定义的软件组件。 本模块是为了与OpenSSL兼容而设计的,因此使用OpenSSL API的产品可以转换为使用经过验证的密码系统,而且只需很少的工作。

应该启用内核选项“ fips = 1 ”。 在这里多一点。

看看是否加载:

 sudo sysctl -a|grep fips 

在这里,我发现检查支持。

 # openssl ciphers FIPS -v ADH-AES256-SHA SSLv3 Kx=DH Au=None Enc=AES(256) Mac=SHA1 DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1 AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 ADH-AES128-SHA SSLv3 Kx=DH Au=None Enc=AES(128) Mac=SHA1 DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 KRB5-DES-CBC3-SHA SSLv3 Kx=KRB5 Au=KRB5 Enc=3DES(168) Mac=SHA1 ADH-DES-CBC3-SHA SSLv3 Kx=DH Au=None Enc=3DES(168) Mac=SHA1 EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1 EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1 DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1