13

我们有一个客户询问FIPS (Federal Information Processing Standard) 140-2 是否符合 OpenSSL 支持验证的加密使用。如何检查 OpenSSL 是否有 FIPS 抱怨是否提供 FIPS 验证加密?

操作系统:Redhat 5 Linux

4

6 回答 6

21

如何检查 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

您可以通过转储符号的 20 个字节来验证开发人员运行incore或在他们的可执行文件上嵌入 FIPS 指纹。如果它有 20 个字节的 0(默认来自),那么指纹没有嵌入并且会失败。所以在这种情况下不可能使用 FIPS 验证的密码学。macho_incoreFIPS_signaturefips_premain.cFIPS_mode_set


更新:我上传了一个关于这个主题的幻灯片到 OpenSSL wiki。它被称为使用 OpenSSL 验证加密技术构建应用程序:开发人员和审计人员的现场注释。您将需要从幻灯片 18 开始查看材料。

我为OWASP制作了幻灯片,但没有兴趣接收它。我知道 Stack Overflow 不喜欢 OpenSSL wiki 上的链接,但我不知道如何在这里提供 35+ 幻灯片。

于 2014-02-01T00:57:39.760 回答
8

要检查 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

参考

于 2015-05-26T19:35:58.263 回答
2

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

OpenSSL 本身没有经过验证,而且永远不会。取而代之的是,创建了一个经过精心定义的特殊软件组件,称为 OpenSSL FIPS 对象模块。该模块旨在与 OpenSSL 兼容,因此使用 OpenSSL API 的产品可以轻松转换为使用经过验证的加密技术。

于 2013-10-15T11:09:47.793 回答
1

如果您使用动态链接,此 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

https://github.com/ericcurtin/fips_openssl_check

于 2019-01-15T21:29:08.553 回答
0

内核选项“ fips=1 ”应该被启用。更多关于这里的内容。

要查看是否已加载:

sudo sysctl -a|grep fips
于 2016-04-06T21:21:39.107 回答
-1

这是我发现检查支持的内容。

# 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
于 2013-09-04T15:32:59.430 回答