2. Facciamo una CA
• OpenSSL supporta la creazione di CA tramite openssl.cnf
max@spirit6 ~/Desktop/Corso PIN $ mkdir demoCA
max@spirit6 ~/Desktop/Corso PIN/demoCA $ mkdir newcerts
max@spirit6 ~/Desktop/Corso PIN/demoCA $ touch index.txt
max@spirit6 ~/Desktop/Corso PIN/demoCA $ echo 01 > serial
• demoCA conterrà tutte le informazioni, newcerts i nuovi certificati,
index la loro lista e il loro stato e serial il numero seriale
7. CA Certificate
X509v3 Basic Constraints:
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Netscape Cert Type:
SSL CA, S/MIME CA
X509v3 Subject Alternative Name:
email:max@mascanc.net
X509v3 Issuer Alternative Name:
email:max@mascanc.net
Signature Algorithm: sha256WithRSAEncryption
8. Generiamo un certificato normale
max@spirit6 ~/Desktop/Corso PIN $ openssl genrsa -out key.pem 2048
Generiamo una RICHIESTA DI CERTIFICATO
max@spirit6 ~/Desktop/Corso PIN $ openssl req -new -key key.pem -
out req.pem
Con la richiesta di certificato ci si va a registrare presso la RA
9. Firma di una CSR
max@spirit6 ~/Desktop/Corso PIN $ openssl req -in req.pem -noout –
text
max@spirit6 ~/Desktop/Corso PIN $ openssl ca -in req.pem -out
req.cert -config /usr/local/etc/openssl/openssl.cnf
Ora vediamo serial e index.txt
10. Creiamo un altro certificato
• E revochiamolo
max@spirit6 ~/Desktop/Corso PIN $ openssl ca -config
/usr/local/etc/openssl/openssl.cnf -revoke cert2.pem
Generiamo la CRL
max@spirit6 ~/Desktop/Corso PIN $ emacs demoCA/crlnumber
14. Transport Layer Security (TLS)
• TLS specificato nell’rfc8446
• Attualmente version 1.3
• Fornisce sicurezza a livello di trasporto
• Base per ogni servizio superiore (l’architettura della sicurezza,
ricordate?)
• HTTPS, SMTPS, IMAPS
17. TLS Modo di funzionamento
• TLS utilizza PKI per stabilire il TRUST
• Il certificato presentato durante il ServerHello è considerato fidato dal
client basandosi su delle policy aziendali
• Ma come fidarsi che il server è chi dice di essere?
• Bisogna fidarsi della RA
• Ma come fa il server a fidarsi del client?
• Mutua autenticazione TLS
18. CipherSpec
• TLS Funziona usando PKI per scambiarsi delle chiavi simmetriche
• Si configura con delle stringhe chiamate Ciphersuite
• Hanno la seguente forma
• TLS_RSA_WITH_AES_128_CBC_SHA256
• <protocollo>_<algoritmo>_<cifrariosimmetrico>_<parametri>_<modo
perativo>_<onewayhash>
19. Vediamolo dal vivo
• Facciamo partire tomcat o wildfly e configuriamolo
• Java KeyStore
• Si esporta il file in formato p12 max@spirit6 ~/Desktop/Corso PIN $
openssl pkcs12 -export -out corso.p12 -inkey key2.pem -in cert2.pem
• Se la chiave è cifrata si decifra come
• max@spirit6 ~/Desktop/Corso PIN $ openssl rsa -in enckey.pem (dopo
averla incollata in un file chiamato enckey.pem)
• Java keystore ha 2 diversi formati: JKS e P12
20. Keystore e Truststore
• max@spirit6 ~/Desktop/Corso PIN $ keytool -importkeystore -
srckeystore corso.p12 -srcstoretype pkcs12 -deststoretype jks -
destkeystore corso.jks
• In $JAVA_HOME/jre/lib/security c’è il file cacerts con la lista delle
certification authority fidate (tipo eIDAS)
21. Debug di un handshake
• Si mette java in debug: -Djavax.net.debug=ssl
• Openssl TLS client
• openssl s_client -connect localhost:6514 -cert
/Users/max/Documents/Tiani/Test
Certificates/certificates_arnulf/s1_cert.pem -key
/Users/max/Documents/Tiani/Test
Certificates/certificates_arnulf/s1_key.pem -CAfile
/Users/max/Documents/Tiani/Test
Certificates/certificates_arnulf/demoCA/cacert.pem
23. One Way Hash Function
• Dato un messaggio M di lunghezza variabile, la funzione che produce
un output di lunghezza fissa si chiama funzione di hash
• h=H(M)
• La funzione di HASH non è segreta, ci vuole un modo per proteggere il
suo valore
• Fornisce l’impronta digitale di un file.
24. Requisiti
• H può essere applicata ad un blocco di dati di qualsiasi dimensione
• H produce un output di lunghezza fissa
• H(x) è facile da calcolare
• Dato h è computazionalmente impossibile trovare x tale che H(x) = h.
E quindi one-way (monodirezionale)
• Per un blocco x, è computazionalmente impossibile trovare un 𝑦 ≠
𝑥: 𝐻 𝑥 = 𝐻 𝑦
• L’hash deve essere lungo: attacchi di compleanno, lo spazio si riduce
in alcuni casi a 2 𝑚/2
25. Le funzioni hash
• Hash sono usate in congiunzione message authentication code (MAC)
• Esempi: Md5, SHA1, SHA256
26. Scambio di Chiavi Diffie Hellman
• Schema di Merkle: qual è il problema?
27. Diffie Hellman
• Merkle ha un problema di tipo MITM (vedremo nell’attacco di
Armando)
• DH si basa sui logaritmi discreti (stessa difficoltà di calcolare la
fattorizzazione dei primi di RSA)
• Esempio: 𝑦 = 𝑔 𝑥
𝑚𝑜𝑑 𝑝. Se si conosce g,x,p, è immediato calcolare y.
Ma, dati, y, g, p, è computazionalmente complesso calcolare x.
• Si definisce una radice primitiva di un numero primo p com un
numero le cui potenze modulo p generano tutti gli interi compresi fra
1 e p-1
28. DH
• Per cui se a è radice primitiva di p (primo) allora i numeri
𝑎 𝑚𝑜𝑑 𝑝, 𝑎2 𝑚𝑜𝑑 𝑝, … , 𝑎 𝑝−1 𝑚𝑜𝑑 𝑝 sono distinti e sono costituiti dagli
interi compresi fra 1 e p-1 in una certa permutazione
• Per un qualsiasi intero b e una radici primitava a di un numero primo
p, si può trovare un esponente univoco i tale che
𝑏 ≡ 𝑎 𝑖 𝑚𝑜𝑑 𝑝 , 0 ≤ 𝑖 ≤ (𝑝 − 1)
• L’esponente i è chiamato logaritmo discreto di b per la base a modulo
p, e si denota con 𝑑𝑙𝑜𝑔 𝑎,𝑝 𝑏
29. Sistema di scambio DH
• Siano noti 𝑞, 𝛼, con q primo e 𝛼 < q, 𝛼 radice primitiva di q
• A genera la chiave selezionando un numero privato 𝑋𝐴 tale che 𝑋𝐴 <
𝑞 e calcola 𝑌𝐴 pubblico, tale che YA = 𝛼 𝑋 𝐴 𝑚𝑜𝑑 𝑞
• B genera la chiave selezionando un numero privato 𝑋 𝐵 tale che 𝑋 𝐵 <
𝑞 e calcola 𝑌𝐵 pubblico, tale che YB = 𝛼 𝑋 𝐵 𝑚𝑜𝑑 𝑞
• A genera la chiave come 𝐾 = 𝑌𝐵
𝑋 𝐴 𝑚𝑜𝑑 𝑞
• B genera la chiave come 𝐾 = 𝑌𝐴
𝑋 𝐵 𝑚𝑜𝑑 𝑞
• Per le proprietà dell’aritmetica modulare.
31. Diffie-Hellman
• DH soffre di MITM
• Se Mallory si mette nel mezzo (come?) può sfruttare una vulnerabilità
• QUALE?
32. Vulnerabilità DH
• I messaggi non sono autenticati!
• Non sappiamo se un messaggio viene da alice o da mallory!
• Si risolve con un sistema di certificati e firme (ciA)
33. Aritmetica a curva ellittica
• Il problema di RSA è che le chiavi devono essere molto grandi: piccolo
problema computazionale (Hardware Security Modules)
• Elliptic Curve Criptography (ECC) usa uno schema per avere chiavi più
piccole
• Dimensioni delle chiavi a parità di sforzo computazionale
Simmetrico ECC RSA
56 112 512
128 256 3072
256 512 15360
34. ECC
• Ci si basa sulla somma su curva ellittica, ovvero risolvere il problema
• 𝑎 × 𝑘 = 𝑎 + 𝑎 + ⋯ + 𝑎 k volte
• Una curva ellittica su 𝑅 è definita da equazioni cubiche, della
seguente forma
• 𝑦2 + 𝑎𝑥𝑦 + 𝑏𝑦 = 𝑥3 + 𝑐𝑥2 + 𝑑𝑥 + 𝑒, che si possono semplificare
come 𝑦2 = 𝑥3 + 𝑎𝑥 + 𝑏
• Quindi: y = 𝑥3 + 𝑎𝑥 + 𝑏. La curva è costituita da valori positivi o
negativi.
36. ECC
• Avendo un punto di origine, O, la somma sulle curve ellittiche può
essere definita da algebre
• Si somma nell’insieme definito E(a,b) per i valori specific di a,b di
𝑦2 = 𝑥3 + 𝑎𝑥 + 𝑏
• Ma questo era sui numeri reali. ECC usa curve su 𝑍 𝑃, e i coefficienti
hanno valori interi da 0, p-1.
• 𝑦2
𝑚𝑜𝑑 𝑝 = 𝑥3
+ 𝑎𝑥 + 𝑏 𝑚𝑜𝑑 𝑝
37. Quale è il »problema difficile»?
• Si consideri 𝑄 = 𝑘𝑃, dove 𝑄, 𝑃 ∈ 𝐸 𝑝 𝑎, 𝑏 , 𝑘 < 𝑝.
• Facile calcolare Q, dati k, P, complesso calcolare k, dati Q e P.
Crittografia
• Elementi globali pubblici: 𝐸 𝑞 𝑎, 𝑏 curva ellittica, 𝐺 punto sulla curva
• A sceglie 𝑛 𝐴 < 𝑛, e calcola 𝑃𝐴 = 𝑛 𝐴 × 𝐺. 𝑛 𝐴è la chiave privata
• B sceglie 𝑛 𝐵 < 𝑛, e calcola 𝑃𝐵 = 𝑛 𝐵 × 𝐺. 𝑛 𝐵è la chiave privata
• 𝐾 = 𝑛 𝐴 × 𝑃𝐵 = 𝑛 𝐴 × 𝑛 𝐵 × 𝐺 = 𝑛 𝐵 × 𝑛 𝐴 × 𝐺 = 𝑛 𝐵 × 𝑃𝐴
38. OpenSSL: lista curve
• root@massimo ~ $ openssl ecparam -list_curves
• secp384r1 : NIST/SECG curve over a 384 bit prime field
• secp521r1 : NIST/SECG curve over a 521 bit prime field
• prime256v1: X9.62/SECG curve over a 256 bit prime field
• Vediamo i parametri
• root@massimo ~ $ openssl ecparam -name secp521r1 -out
secp521r1.pem
39. Generiamo chiavi
• root@massimo ~ $ openssl ecparam -in secp521r1.pem -genkey -
noout -out massiec.key
• Pubblica: root@massimo ~ $ openssl ec -in massiec.key -pubout -out
massiecpub.key
Vediamo: root@massimo ~ $ openssl ec -in massiec.key -noout -text -
param_enc explicit
• Poi si derivano chiavi e si possono usare con e.g., AES.