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

问题描述 投票:0回答:7

我们有一位客户询问 OpenSSL

FIPS (Federal Information Processing Standard) 140-2
合规支持 验证的加密使用。如何检查 OpenSSL 有 FIPS 投诉 是否提供 FIPS 验证的加密技术?

操作系统:

Redhat 5 Linux

linux security openssl fips
7个回答
23
投票

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


您可以验证开发人员在其可执行文件上运行
incore

macho_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 模式下运行,请发出以下命令:


11
投票

上述操作应该会失败,因为 MD5 不是 fips 批准的哈希标准。

$ openssl sha1 somefile

以上内容有效,因为 SHA1 是 fips 批准的哈希标准。

示例

# 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 140-2 验证。但是,它有一个经过 FIPS 140-2 验证的模块,称为 FIPS 对象模块,部分取代了普通 OpenSSL 中使用的

libcrypto


2
投票

在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

内核选项“

fips=1

1
投票
这里

查看是否已加载: sudo sysctl -a|grep fips

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

0
投票

Openssl 3.0系列已经删除了这些

0
投票
FIPS_模式()

FIPS_mode_set()
  • 这些功能是旧版 API,不适用于新的提供商模型。应用程序应该使用
EVP_default_properties_is_fips_enabled()

EVP_default_properties_enable_fips()
  • 例如,
  • #include <openssl/evp.h> #include <iostream> bool IsFIPSEnabled() { int fips_enabled = EVP_default_properties_is_fips_enabled(NULL); return fips_enabled != 0; } int main() { if (IsFIPSEnabled()) { std::cout << "FIPS mode is enabled." << std::endl; } else { std::cout << "FIPS mode is not enabled." << std::endl; } return 0; }

© www.soinside.com 2019 - 2024. All rights reserved.