Как проверить поддержку FIPS 140-2 в OpenSSL?

У нас есть клиент, который спрашивает об OpenSSL FIPS (Federal Information Processing Standard) 140-2 уступчивое поддержка использование проверенной криптографии. Как проверить OpenSSL имеет FIPS жалуется предоставляет ли FIPS проверенную криптографию или нет?

OS:Redhat 5 Linux

5 ответов


Как проверить, предоставляет ли OpenSSL проверенную криптографию FIPS или нет?

это зависит от того, как и когда вы хотите проверить. Оно также зависит от приложения.

FIPS может быть доступен, но не используется. Таким образом, приложение должно включить проверенную криптографию через FIPS_mode_set, а вызов должны получится.


если вы хотите проверить, была ли библиотека с поддержкой FIPS, такая как OpenSSL 1.0.1 e настроенный для использования модуля объекта 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. Если приложение ссылается на 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

и вы можете проверить, что разработчик ran incore или macho_incore на их исполняемом файле для встраивания отпечатка пальца FIPS путем сброса 20 байтов символ FIPS_signature. Если его 20 байт 0 (по умолчанию от fips_premain.c), то отпечаток пальца не был встроен и FIPS_mode_set не удастся. Таким образом, в этом случае невозможно использовать проверенную криптографию FIPS.


обновление: я загрузил слайд-колоду, которую у меня есть по этому вопросу в вики OpenSSL. Его называют создание приложений с использованием криптографии, проверенной OpenSSL: заметки из поля для разработчиков и аудиторов. Вы хотите чтобы просмотреть материал, начиная с слайда 18.

Я построил слайд-палубу для OWASP но не было никакого интереса в его получении. Я знаю, что переполнение стека хмурится по ссылкам, таким как на вики OpenSSL, но я не знаю, как предоставить здесь слайд-колоду 35+.


OpenSSL сам по себе не FIPS 140-2 проверен и, согласно его сопровождающим, никогда не будет. Однако он имеет проверенный модуль FIPS 140-2, называемый модулем объекта FIPS, который частично заменяет libcrypto используется в ванили OpenSSL. Дополнительная информация, включая руководство пользователя можно найти здесь. Короче:

OpenSSL сам по себе не проверен и никогда не будет. Вместо специального тщательно определенный программный компонент называется объект в OpenSSL ФИПС Модуль создан. Этот модуль был конструирован для совместимости с OpenSSL, чтобы продукты, использующие OpenSSL API, могли быть преобразованы использовать проверенную криптографию с минимальными усилиями.


чтобы проверить, работает ли openssl в режиме fips, выполните следующие действия:

$ openssl md5 somefile

выше должны подвести как MD5-это не ФИПС утвердил хэш-стандарт.

$ 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

ссылка


опции ядра "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