Per verificare se openssl funziona in modalità fips, emettere quanto segue:
$ openssl md5 somefile
Quanto sopra dovrebbe fallire poiché MD5 non è uno standard hash approvato da FIPS.
$ openssl sha1 somefile
Quanto sopra funzionerebbe poiché SHA1 è lo standard hash approvato da fips.
Esempio :
# 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
Riferimento
Lo stesso OpenSSL non è convalidato FIPS 140-2 e, secondo i suoi manutentori, non lo sarà mai. Tuttavia, ha un modulo convalidato FIPS 140-2 chiamato FIPS Object Module, che sostituisce in parte libcrypto utilizzato in Vanilla OpenSSL. Ulteriori informazioni, inclusa la guida per l'utente, sono disponibili qui. In breve:
Lo stesso OpenSSL non è convalidato e non lo sarà mai. Invece è stato creato un componente software appositamente definito chiamato OpenSSL FIPS ObjectModule. Questo modulo è stato progettato per la compatibilità con OpenSSL in modo che i prodotti che utilizzano l'API OpenSSL possano essere convertiti per utilizzare la crittografia convalidata con il minimo sforzo.
Come posso verificare se OpenSSL fornisce o meno crittografia convalidata FIPS?
Dipende da come e quando vuoi controllare. Dipende anche dall'applicazione.
FIPS potrebbe essere disponibile ma non utilizzato. Quindi un'applicazione deve abilitare la crittografia convalidata tramite FIPS_mode_set
e la chiamata must avere successo.
Se desideri verificare se la libreria compatibile con FIPS, come OpenSSL 1.0.1e, è stata configurata per utilizzare il modulo oggetto FIPS, puoi:
$ cat /usr/local/ssl/include/openssl/opensslconf.h | grep -A 2 -i fips
#ifndef OPENSSL_FIPS
# define OPENSSL_FIPS
#endif
OPENSSL_FIPS
indica che la libreria compatibile con FIPS è stata configurata per utilizzare il modulo oggetto FIPS. Quindi la crittografia convalidata FIPS è disponibile.
OPENSSL_FIPS
tuttavia, non significa che l'applicazione stia utilizzando la crittografia convalidata FIPS. L'applicazione deve chiamare FIPS_mode_set
, e la funzione deve restituire successo.
In fase di esecuzione, puoi stampare la stringa associata a quanto segue (è presa dal codice che uso appositamente per questo):
ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());
Il codice produrrà una voce di log simile alla seguente:
Version: OpenSSL 1.0.1f-fips 6 Jan 2014
Puoi controllare il modulo con alcuni trucchi. Ad esempio, quanto segue verificherà alcuni simboli che devono essere presente se l'eseguibile è veramente FIPS.
In questo caso, sto testando l'oggetto condiviso compatibile con FIPS OpenSSL. Se l'applicazione si collega a libcrypto.a
, allora puoi controllare il programma piuttosto che l'oggetto condiviso 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
...
Hai anche i simboli di 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
Ora, questo è davvero subdolo. È possibile verificare che il modulo includa gli autotest. Ad esempio, fips_drbg_selftest.h
includerà i seguenti byte nei suoi test automatici:
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
E puoi verificare che lo sviluppatore abbia eseguito incore
o macho_incore
sul loro eseguibile per incorporare l'impronta digitale FIPS scaricando i 20 byte del simbolo FIPS_signature
. Se sono 20 byte di 0 (il valore predefinito da fips_premain.c
), quindi l'impronta digitale non è stata incorporata e FIPS_mode_set
avrà esito negativo. Quindi in questo caso non è possibile utilizzare la crittografia convalidata FIPS.
Aggiorna :Ho caricato un mazzo di diapositive che ho sull'argomento nel wiki di OpenSSL. Si chiama Creazione di applicazioni utilizzando la crittografia convalidata da OpenSSL:note dal campo per sviluppatori e revisori. Ti consigliamo di rivedere il materiale a partire dalla diapositiva 18.
Ho costruito lo slide deck per OWASP ma non c'era interesse a riceverlo. So che Stack Overflow disapprova link come quello sul wiki di OpenSSL, ma non so come fornire qui una presentazione di oltre 35 diapositive.
Opzione del kernel "fips=1 " dovrebbe essere abilitato. Qui ne parleremo un po' di più.
Per vedere se è caricato:
sudo sysctl -a|grep fips