我们有一个客户端询问OpenSSL FIPS (Federal Information Processing Standard) 140-2
兼容支持验证加密使用。如何检查OpenSSL 是否有FIPS投诉是否提供FIPS验证加密?
操作系统:Redhat 5 Linux
答案 0 :(得分:14)
如何检查OpenSSL是否提供FIPS验证加密?
这取决于您要检查的方式和时间。它还取决于应用程序。
可以使用FIPS但不使用。因此,应用程序必须通过FIPS_mode_set
启用经过验证的加密,并且调用必须成功。
如果要检查FIPS Capable Library(例如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 Capable Library已配置为使用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
您可以通过转储符号incore
的20个字节来验证开发人员在其可执行文件上运行macho_incore
或FIPS_signature
以嵌入FIPS指纹。如果它的20个字节为0(默认来自fips_premain.c
),则指纹未嵌入,FIPS_mode_set
将失败。因此,在这种情况下,不可能使用FIPS验证的加密技术。
更新 :我将有关主题的幻灯片上传到OpenSSL wiki。它被称为Building Applications using OpenSSL Validated Cryptography: Notes from the Field for Developers and Auditors。您需要查看从幻灯片18开始的材料。
我为OWASP制作了幻灯片,但没有兴趣接收它。我知道Stack Overflow对OpenSSL wiki上的链接皱眉,但我不知道如何在这里提供35+幻灯片。
答案 1 :(得分:2)
OpenSSL本身不是经过FIPS 140-2验证的,根据它的维护者,它永远不会。但是,它有一个名为FIPS对象模块的FIPS 140-2验证模块,它部分取代了vanilla OpenSSL中使用的 libcrypto 。可以找到更多信息,包括user guide here。简而言之:
OpenSSL本身未经过验证,永远不会被验证。相反,特别的 精心定义的软件组件称为OpenSSL FIPS对象 模块已创建。本模块旨在实现兼容性 使用OpenSSL可以转换使用OpenSSL API的产品 以最小的努力使用经过验证的密码术。
答案 2 :(得分:2)
要检查openssl是否在fips模式下运行,请发出以下命令:
$ openssl md5 somefile
上述情况应该失败,因为MD5不是fips认可的哈希标准。
$ openssl sha1 somefile
上述内容可行,因为SHA1是fips Approved Hash Standard。
示例:
# 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
答案 3 :(得分:0)
答案 4 :(得分:0)
如果您使用动态链接,则此C代码将为您检查:
#include <openssl/err.h>
#include <string.h>
int main() {
if (FIPS_mode() || FIPS_mode_set(1)) {
printf("Installed library has FIPS support\n");
return 0;
}
const char* err_str = ERR_error_string(ERR_get_error(), 0);
printf("Failed to enable FIPS mode, %s\n", err_str);
if (strstr(err_str, "0F06D065")) {
printf("Installed library does not have FIPS support\n");
}
return 0;
}
在Linux上,您可以通过以下方式进行编译和运行:
这样编译:
gcc fips_openssl_check.c -lcrypto
或
gcc fips_openssl_check.c -l:libcrypto.so.1.0.2
如果您安装了多个libcrypto版本,并且想要检查特定的版本。其他编译器(例如clang)也可以。
执行以执行检查:
./a.out
答案 5 :(得分:-2)
这是我发现检查支持的内容。
# 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