Как проверить поддержку 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