In un precedente articolo abbiamo visto i concetti base di cifratura e chiave asimettrica applicati alla posta elettronica. Su linux il programma più famoso ed utilizzato che si occupa della sicurazza e della cifratura è OpenSSL.
OpenSSL è un’implementazione open source dei protocolli SSL e TLS. Le librerie di base (scritte in linguaggio C) eseguono le funzioni crittografiche principali. Nei diversi linguaggi di programmazione sono disponibili procedure che permettono di accedere alle funzioni della libreria OpenSSL.
È disponibile per la maggior parte dei sistemi operativi unix-like, inclusi GNU/Linux e Mac OS X, ed anche per Microsoft Windows. OpenSSL è originariamente basato sulle librerie SSLeay di Eric Young e Tim Hudson.
Vedremo oggi alcuni utilizzi pratici di programmi che si basano su OpenSSL.
Un utilizzo fondamentale di OpenSSL è quello di creare una propria Certification Authority (CA) con la quale generare certificati da utilizzare poi in altri programmi. Essendo questo un argomento di per se lungo non verrà trattato in questo articolo, dove vedremo utilizzi più semplici e meno comuni delle librerie OpenSSL
Collegarsi ad un servizio https
A volte è utile avere l’equivalente di un “telnet myservice 80”, ma con siti in https un telnet non funziona quindi è necessario un comando openssl:
openssl s_client -connect host:443 -state -debug GET / HTTP/1.0 |
Otterrete un output molto lungo, ma sarete in grado di fare qualche test/debug anche sul http criptato.
Generare numeri o stringhe casuali
Per generare stringhe casuali è possibile utilizzare l’opzione rand di openssl, per generare un numero intero casuale utilizzate è possibile utilizzare:
root@laptop:~# echo $(openssl rand 4 | od -DAn) 1173091498 |
Mentre se volete generare una stringa in base64 (magari per avere una password casuale)
root@laptop:~# openssl rand -base64 6 Cki3awd4 |
Verificare da linea di comando un certificato online
Non sempre i client più evoluti sono anche i più comodi per verificare un certificato, con questo comando potete verificare un certificato di un sito https o magari di un servizio ldaps:
root@laptop:~#openssl s_client -connect google.com:443 CONNECTED(00000003) depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA verify error:num=20:unable to get local issuer certificate verify return:0 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority --- Server certificate -----BEGIN CERTIFICATE----- MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd ....... |
E se dovete solo verificare la data di scadenza di un certificato usate in pipe un altro openssl:
root@laptop:~# openssl s_client -connect google.com:443|openssl x509 -dates -noout depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA verify error:num=20:unable to get local issuer certificate verify return:0 notBefore=Dec 18 00:00:00 2009 GMT notAfter=Dec 18 23:59:59 2011 GMT |
Estrarre informazioni da un certificato
Un certificato SSL contiene una vasta gamma di informazioni: chi l’ha emesso, date valide, l’oggetto ed informazioni crittografiche. Il sottocomando x509 è il punto di ingresso per recuperare queste informazioni per gli esempi proposti si da per scontato che il certificato che si desidera esaminare è memorizzato in un file denominato cert.pem.
L’uso dell’opzione -text darà la gamma completa di informazioni.
openssl x509 -text -in cert.pem |
È possibile ottenere informazioni specifiche utilizzando il flag appropriato:
# Chi ha emesso il certificato? openssl x509 -noout -in cert.pem -issuer # A chi è stato emesso? openssl x509 -noout -in cert.pem -subject # Per quali date è valido? openssl x509 -noout -in cert.pem -dates # I punti sopra, tutti assieme openssl x509 -noout -in cert.pem -issuer -subject -dates # Qual'è il valore del suo hash? openssl x509 -noout -in cert.pem -hash # Qual'è MD5 fingerprint? openssl x509 -noout -in cert.pem -fingerprint |
generare l’hash MD5
OpenSSL può essere utilizzato anche per generare l’MD5 di un testo o un file:
cat yourfile | openssl md5 |
o
echo -n "your text to be ashed" |openssl md5 |
Effettuare benchmark con OpenSSL
Openssl includere una funzione per effettuare il benchmark del vostro sistema, è sufficiente scrivere:
openssl speed |
Ed avrete un lungo rapporto come questo (centrino 1.5 GHZ)
OpenSSL 0.9.8o 01 Jun 2010 built on: Wed Nov 17 17:54:03 UTC 2010 options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx) compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall available timing options: TIMES TIMEB HZ=100 [sysconf value] timing function used: times The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes md2 855.18k 1732.09k 2342.00k 2575.00k 2662.40k mdc2 0.00 0.00 0.00 0.00 0.00 md4 16213.70k 56706.21k 157499.53k 287899.83k 381457.07k md5 13040.86k 43134.65k 112426.54k 185555.70k 228296.58k hmac(md5) 12273.58k 41765.66k 109326.48k 184496.49k 230343.74k sha1 11414.65k 33576.61k 72414.64k 102876.35k 117894.33k rmd160 8291.07k 21482.65k 41282.44k 53895.00k 58734.43k rc4 86563.98k 95285.79k 97506.37k 97709.46k 98543.12k des cbc 11432.19k 11648.68k 11724.95k 11777.63k 11772.70k des ede3 4123.07k 4138.75k 4154.66k 4162.05k 4128.22k idea cbc 0.00 0.00 0.00 0.00 0.00 seed cbc 0.00 0.00 0.00 0.00 0.00 rc2 cbc 13996.01k 14320.10k 14542.58k 14539.74k 14484.95k rc5-32/12 cbc 0.00 0.00 0.00 0.00 0.00 blowfish cbc 43255.37k 47920.37k 48867.76k 49545.33k 50041.82k cast cbc 30137.81k 32121.24k 32618.69k 33104.10k 32622.36k aes-128 cbc 36708.83k 39138.84k 39454.24k 39498.27k 39419.55k aes-192 cbc 31592.87k 33304.60k 33824.65k 33721.11k 33996.80k aes-256 cbc 27789.41k 29194.84k 29362.74k 29735.88k 29732.65k camellia-128 cbc 0.00 0.00 0.00 0.00 0.00 camellia-192 cbc 0.00 0.00 0.00 0.00 0.00 camellia-256 cbc 0.00 0.00 0.00 0.00 0.00 sha256 7809.17k 18163.74k 32279.64k 39705.60k 42603.65k sha512 2230.23k 8900.15k 13026.93k 18077.35k 20271.08k aes-128 ige 37110.42k 39163.19k 40161.57k 40480.51k 39874.08k aes-192 ige 31960.03k 33877.76k 34103.64k 34365.44k 34357.85k aes-256 ige 28192.66k 29575.37k 29714.13k 29876.08k 29675.52k sign verify sign/s verify/s rsa 512 bits 0.001703s 0.000145s 587.1 6896.0 rsa 1024 bits 0.009800s 0.000494s 102.0 2026.0 rsa 2048 bits 0.062584s 0.001759s 16.0 568.5 rsa 4096 bits 0.433333s 0.006440s 2.3 155.3 sign verify sign/s verify/s dsa 512 bits 0.001529s 0.001768s 654.0 565.7 dsa 1024 bits 0.004945s 0.005793s 202.2 172.6 dsa 2048 bits 0.017221s 0.019843s 58.1 50.4 |
Fare un benchmark di connessioni remote
L’opzione di connessione s_time consente di efefttuare un test di performance. L’invocazione più semplice avrà una durata di 30 secondi, utilizzare qualsiasi cifratura, e l’utilizzo di SSL handshake per determinare il numero di connessioni al secondo, utilizzando sia nuove sessioni che quelle riutilizzate:
openssl s_time -connect remote.host:443 |
Al di là che invocazione più semplice, s_time dà un’ampia varietà di opzioni di test.
# Recupera la pagina remota test.html usando solo sessioni nuove openssl s_time -connect remote.host:443 -www /test.html -new # simile usando solo SSL v3 e high encryption openssl s_time -connect remote.host:443 -www /test.html -new -ssl3 -cipher HIGH # Compara i risultati relativi a differenti suite di cifratura in test da 10 #secondi IFS=":" for c in $(openssl ciphers -ssl3 RSA); do echo $c openssl s_time -connect remote.host:443 -www / -new -time 10 -cipher $c 2>&1 | grep bytes echo done |
Riferimenti:
http://www.madboa.com/geek/openssl/
Popular Posts:
- None Found
Excellent article, the secure telnet equivalent is very useful for debugging a server it only provides secure connections.
Thank you.
Nice one. I’ve not used the rand or speed programs.
You might consider adding enc(1) into the mix here. I regularly use it to AES-encrypt / decrypt arbitrary files.
I think plenty of folks don’t realize that there is a lot more than cert management provided by openssl.
There ‘s probably a typo in
echo -n “your text to be ashed” |openssl md5
You meant “hashed”, I guess.
Corrected now.
Thanks
You don’t need to use OpenSSL to generate random numbers—your kernel will give you cryptographic-strength random bits directly from /dev/random and dev/urandom—which is what OpenSSL would be using anyway.
Also, nobody should be using MD5 any more.