Pour vérifier si openssl fonctionne en mode fips, exécutez la commande suivante :
$ openssl md5 somefile
Ce qui précède devrait échouer car MD5 n'est pas une norme de hachage approuvée par FIPS.
$ openssl sha1 somefile
Ce qui précède fonctionnerait car SHA1 est la norme de hachage approuvée par fips.
Exemple :
# 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
Référence
OpenSSL lui-même n'est pas validé FIPS 140-2 et, selon ses responsables, ne le sera jamais. Cependant, il possède un module validé FIPS 140-2 appelé FIPS Object Module, qui remplace en partie libcrypto utilisé dans la vanille OpenSSL. Plus d'informations, y compris le guide de l'utilisateur, peuvent être trouvées ici. En bref :
OpenSSL lui-même n'est pas validé et ne le sera jamais. Au lieu de cela, un composant logiciel spécialement défini appelé OpenSSL FIPS ObjectModule a été créé. Ce module a été conçu pour être compatible avec OpenSSL afin que les produits utilisant l'API OpenSSL puissent être convertis pour utiliser une cryptographie validée avec un minimum d'effort.
Comment puis-je vérifier si OpenSSL fournit ou non une cryptographie validée FIPS ?
Cela dépend de comment et quand vous voulez vérifier. Cela dépend aussi de l'application.
FIPS pourrait être disponible mais non utilisé. Une application doit donc activer la cryptographie validée via FIPS_mode_set
, et l'appel doit réussir.
Si vous souhaitez vérifier si la bibliothèque compatible FIPS, telle que OpenSSL 1.0.1e, a été configurée pour utiliser le module d'objet FIPS, vous pouvez :
$ cat /usr/local/ssl/include/openssl/opensslconf.h | grep -A 2 -i fips
#ifndef OPENSSL_FIPS
# define OPENSSL_FIPS
#endif
OPENSSL_FIPS
vous indique que la bibliothèque compatible FIPS a été configurée pour utiliser le module d'objet FIPS. La cryptographie validée FIPS est donc disponible.
OPENSSL_FIPS
ne signifie pas pour autant que l'application utilise la cryptographie validée FIPS. L'application doit appeler FIPS_mode_set
, et la fonction doit renvoyer le succès.
Au moment de l'exécution, vous pouvez imprimer la chaîne associée à ce qui suit (elle est extraite du code que j'utilise spécifiquement pour cela) :
ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());
Le code produira une entrée de journal semblable à celle-ci :
Version: OpenSSL 1.0.1f-fips 6 Jan 2014
Vous pouvez auditer le module avec quelques astuces. Par exemple, ce qui suit testera certains symboles qui doivent être présent si l'exécutable est vraiment FIPS.
Dans ce cas, je teste l'objet partagé OpenSSL FIPS Capable. Si l'application est liée à libcrypto.a
, vous pouvez auditer le programme plutôt que l'objet partagé 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
...
Vous avez également les symboles de 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
Maintenant, c'est vraiment sournois. Vous pouvez vérifier que le module inclut les autotests. Par exemple, fips_drbg_selftest.h
inclura les octets suivants dans ses tests automatiques :
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
Et vous pouvez vérifier que le développeur a exécuté incore
ou macho_incore
sur leur exécutable pour intégrer l'empreinte FIPS en vidant les 20 octets du symbole FIPS_signature
. Si ses 20 octets de 0 (la valeur par défaut de fips_premain.c
), alors l'empreinte n'a pas été intégrée et FIPS_mode_set
échouera. Il n'est donc pas possible d'utiliser la cryptographie validée FIPS dans ce cas.
Mettre à jour :J'ai téléchargé un jeu de diapositives que j'ai sur le sujet sur le wiki OpenSSL. Il s'intitule Création d'applications à l'aide de la cryptographie validée OpenSSL :Notes du terrain pour les développeurs et les auditeurs. Vous voudrez revoir le matériel à partir de la diapositive 18 environ.
J'ai construit le diaporama pour OWASP mais il n'y avait aucun intérêt à le recevoir. Je sais que Stack Overflow désapprouve les liens comme celui sur le wiki OpenSSL, mais je ne sais pas comment fournir un diaporama de plus de 35 diapositives ici.
Option noyau "fips=1 " devrait être activé. Un peu plus à ce sujet ici.
Pour voir si cela est chargé :
sudo sysctl -a|grep fips