如何检查OpenSSL中的FIPS 140-2支持? [英] How to check FIPS 140-2 support in OpenSSL?
问题描述
我们有一个客户正在询问有关OpenSSL FIPS (Federal Information Processing Standard) 140-2
兼容支持验证的加密技术的使用.如何检查OpenSSL 是否有FIPS投诉是否提供了经过FIPS验证的加密?
We have a client which is asking about OpenSSL FIPS (Federal Information Processing Standard) 140-2
compliant support validated cryptography use. How do I check whether OpenSSL has FIPS complains is providing FIPS validated cryptography or not?
操作系统:Redhat 5 Linux
推荐答案
如何检查OpenSSL是否提供了FIPS验证的加密?
How do I check whether OpenSSL has is providing FIPS validated cryptography or not?
这取决于您要检查的方式和时间.这也取决于应用程序.
It depends on how and when you want to check. It also depends on the application.
FIPS可能可用,但未使用.因此,应用程序必须通过FIPS_mode_set
启用经过验证的加密,并且调用必须必须成功.
FIPS could be available but not used. So an application must enable the validated cryptography via FIPS_mode_set
, and the call must succeed.
如果要检查是否已将FIPS Capable库(例如OpenSSL 1.0.1e)配置为使用FIPS对象模块,则可以:
If you want to check if the FIPS Capable Library, such as OpenSSL 1.0.1e, was configured to use the FIPS Object Module, then you can:
$ 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
tells you the FIPS Capable Library was configured to use FIPS Object Module. So the FIPS validated cryptography is available.
OPENSSL_FIPS
并不意味着该应用程序正在使用FIPS验证的密码学.应用程序必须调用FIPS_mode_set
,并且该函数必须返回成功.
OPENSSL_FIPS
does not mean the application is using the FIPS validated cryptography, though. The application must call FIPS_mode_set
, and the function must return success.
在运行时,您可以打印与以下内容关联的字符串(其取自我专门为此使用的代码):
At runtime, you can print the string associated with the following (its taken from code I use specifically for this):
ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());
该代码将产生类似于以下内容的日志条目:
The code will produce a log entry similar to the following:
Version: OpenSSL 1.0.1f-fips 6 Jan 2014
您可以通过一些技巧来审核模块.例如,以下内容将测试如果可执行文件是真正的FIPS,则必须出现某些 的符号.
You can audit the module with a few tricks. For example, the following will test for some symbols that must be present if executable is truly FIPS.
在这种情况下,我正在测试支持OpenSSL FIPS的共享对象.如果应用程序链接到libcrypto.a
,则可以审核程序而不是OpenSSL共享对象.
In this case, I'm testing the OpenSSL FIPS Capable shared object. If the application links to libcrypto.a
, then you can audit the program rather than the OpenSSL shared object.
$ 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
的符号:
You also have the symbols from 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
将包括以下字节以进行自我测试:
Now, this is really sneaky. You can check that the module includes the self tests. For example, fips_drbg_selftest.h
will include the following bytes its self tests:
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
然后您可以通过转储符号FIPS_signature
的20个字节来验证开发人员在其可执行文件上运行了incore
或macho_incore
来嵌入FIPS指纹.如果它的20个字节为0(默认值为fips_premain.c
),则指纹未嵌入,并且FIPS_mode_set
将失败.因此在这种情况下不可能使用FIPS验证的密码学.
And you can verify the developer ran incore
or macho_incore
on their executable to embed the FIPS fingerprint by dumping the 20 bytes of the symbol FIPS_signature
. If its 20 bytes of 0's (the default from fips_premain.c
), then the fingerprint was not embedded and FIPS_mode_set
will fail. So its not possible to use FIPS validated cryptography in this case.
更新 :我将关于主题的幻灯片放到了OpenSSL Wiki.它称为使用OpenSSL验证密码学构建应用程序:现场说明适用于开发人员和审计师.您将要从幻灯片18开始查看材料.
Update: I uploaded a slide deck I have on the subject to the OpenSSL wiki. Its called Building Applications using OpenSSL Validated Cryptography: Notes from the Field for Developers and Auditors. You will want to review the material starting around Slide 18.
我为 OWASP 构建了幻灯片平台,但是没有兴趣接收它.我知道Stack Overflow不赞成OpenSSL Wiki上的链接,但是我不知道如何在此处提供35张以上的幻灯片.
I built the slide deck for OWASP but there's was no interest in receiving it. I know Stack Overflow frowns upon links like the one on the OpenSSL wiki, but I don't know how to provide a 35+ slide deck here.
这篇关于如何检查OpenSSL中的FIPS 140-2支持?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!