Realizzazione di Web services per l’autenticazione Single ... · 10 Introduzione Questo lavoro di...
Transcript of Realizzazione di Web services per l’autenticazione Single ... · 10 Introduzione Questo lavoro di...
UNIVERSITÀ DEGLI STUDI DELLA CALABRIA
Facoltà di Ingegneria
Corso di Laurea in Ingegneria Informatica
Orientamento Elettronica e Telecomunicazioni
Realizzazione di Web services per l’autenticazione "Single
Sign On" su infrastruttura PKI/LDAP
Relatori:
Prof. Nicola FREGA
Prof. Antonio VOLPENTESTA
Tesi di Laurea di
Salvatore IACOMETTA
Matr. 25728
Anno Accademico 2003/2004
5
Sommario
INTRODUZIONE ..................................................................................................................... 10
CAPITOLO 1: LA SICUREZZA ............................................................................................ 11
1.1 INTRODUZIONE .................................................................................................................... 121.1.1. LA FIDUCIA NELLA “TERZA-PARTE” ................................................................................. 131.1.2. FIDUCIA SENZA INTERMEDIAZIONI .................................................................................. 141.1.3. VALIDITÀ DEI CERTIFICATI ............................................................................................... 141.1.4. CERTIFICATION AUTHORITY............................................................................................ 161.2. LA SICUREZZA..................................................................................................................... 181.2.1. CONCETTI BASE DI UN SERVIZIO DI SICUREZZA ............................................................. 191.2.2. TECNICHE CRITTOGRAFICHE .......................................................................................... 211.2.2.1. La crittografia simmetrica.......................................................................................... 221.2.2.2. La crittografia asimmetrica ....................................................................................... 231.2.2.3. L’utilizzo pratico della crittografia............................................................................. 241.2.3. LA FIRMA DIGITALE .......................................................................................................... 251.2.4. DISTRIBUZIONE SICURA DI CERTIFICATI DIGITALI ........................................................... 281.2.5. RICHIESTA DI UN CERTIFICATO DIGITALE ....................................................................... 301.2.6. IL “LATO” UTENTE ............................................................................................................ 321.3. SSL 3.0 ................................................................................................................................ 331.3.1. SEQUENZA DI HANDSHAKE.............................................................................................. 33
CAPITOLO 2: PKI ................................................................................................................... 35
2.1 PUBLIC KEY INFRASTRUCTURE.......................................................................................... 362.2 FUNZIONI ASSOLTE DA UNA PKI......................................................................................... 362.3 TIPI DI PKI ........................................................................................................................... 40
CAPITOLO 3: LDAP ............................................................................................................... 43
3.1 LDAP INTRODUZIONE......................................................................................................... 443.2 LDAP IN DETTAGLIO........................................................................................................... 473.2.1 COSA È UNA DIRECTORY .................................................................................................. 473.2.2 DIFFERENZE TRA LDAP E DATABASE RELAZIONALI ........................................................ 473.2.3 DIFFERENZE TRA LDAP E X.500 ...................................................................................... 483.2.4 LA RADICE DELL'ALBERO .................................................................................................. 483.2.5 ORGANIZATIONAL UNIT .................................................................................................... 483.2.6 I BACKEND......................................................................................................................... 493.2.7 CREARE GLI INDICI............................................................................................................ 493.2.8 ACCESS CONTROL LIST .................................................................................................... 493.2.9 REPLICA ............................................................................................................................ 503.2.10 INTEGRAZIONE DI LDAP .................................................................................................. 513.2.11 IL PACCHETTO LDAP-UTILS ............................................................................................ 513.2.12 SUPPORTO DELLA CRITTOGRAFIA ................................................................................. 52
6
3.2.13 STRUMENTI DI AMMINISTRAZIONE ................................................................................. 523.2.14 INTEGRAZIONE DI LDAP SUI CLIENT ............................................................................... 53
CAPITOLO 4: I WEB SERVICES ......................................................................................... 54
4.1 I WEB SERVICES................................................................................................................... 554.2 MOTORI DI RICERCA PER WEB SERVICES.......................................................................... 564.3 UN PO’ DI ESEMPI................................................................................................................. 564.3.1 UN PRIMO ESEMPIO: UN TRADUTTORE INGLESE-ITALIANO ........................................... 564.3.2 I PARAMETRI CHE SI DEVONO PASSARE: UDDI .............................................................. 584.3.3 LE INFORMAZIONI IN XML SCAMBIATE ............................................................................ 594.3.4 UN SECONDO ESEMPIO: LA JPG DI UN CODICE A BARRE ................................................ 594.3.5 DAL CLIENT AL SERVER: CREARE UN WEB SERVICES................................................... 604.3.6 UN ALTRO ESEMPIO: IL CODICE IN PHP PER INTERROGARE GOOGLE.......................... 62
CAPITOLO 5: INSTALLAZIONE E TEST DEL SERVER ................................................ 63
5.1 COME INIZIARE.................................................................................................................... 645.2 PROCEDURA PER AUTO-CERTIFICARE IL SERVER, PER CREARE CERTIFICATI-CLIENT EPER RICONOSCERE ALTRI CERTIFICATI-CLIENT ..................................................................... 645.3 COSA ABBIAMO OTTENUTO................................................................................................. 665.3.1 “OVER HTTPS”................................................................................................................... 675.4 PROVIAMO A FARE DEI TEST ............................................................................................... 715.4.1 MODIFICHIAMO IL FILE DI CONFIGURAZIONE ................................................................... 715.4.2 PRELEVARE CON PHP I DATI DEL CERTIFICATO ............................................................. 725.4.3 L’USO DI UNO “SNIFFER” .................................................................................................. 72
CAPITOLO 6: INTERFACCIAMENTO DELL'INFRASTRUTTURA CONTECNOLOGIA WEB SERVICES .......................................................................................... 73
6.1 LA MIA SCELTA: UTILIZZARE NUSOAP E CURL ............................................................ 746.1.1 INSTALLARE NUSOAP PER APPLICAZIONI SERVER-CLIENT SOAP IN PHP .................... 746.1.2 COS’È NUSOAP .............................................................................................................. 746.2 UN ESEMPIO BANALE: IL WEB SERVICES CHE CONCATENA DUE STRINGHE .................... 756.3 FUNZIONI CURL, CLIENT URL LIBRARY......................................................................... 786.4 UN ESEMPIO COMPLETO: WEB SERVICES SU HTTPS CHE INTERROGA LDAP.................. 796.4.1 LA STAMPA DI REQUEST E RESPONSE ............................................................................ 816.5 APPLICAZIONI PRATICHE REALIZZATE.............................................................................. 826.5.1 RIVISTA ON-LINE ............................................................................................................... 826.5.2 ASSISTENZA ON-LINE ....................................................................................................... 886.5.3 CONSULTAZIONE BILANCI ................................................................................................ 896.5.4 CONSULTAZIONE CODICI FISCALI .................................................................................... 906.5.5 APPLICAZIONE DA UN SERVER ESTERNO (ARUBA) ......................................................... 916.5.6 L’UTILITÀ DEL “SINGLE SIGN ON” .................................................................................... 936.5.7 IL WSDL DEL MIO WEB SERVICES .................................................................................. 936.6 USUFRUIRE DEI SERVIZI DI UN WEB SERVICES SOLO SE SI È IN POSSESSO DI UNCERTIFICATO-CLIENT VALIDO.................................................................................................. 93
7
APPENDICE A: DEFINIZIONI E ABBREVIAZIONI ........................................................ 95
APPENDICE B: SINTESI SULLA CERTIFICAZIONE DIGITALE ............................ 101
B.1 I PUNTI DA FISSARE ........................................................................................................... 102B.1.1 NECESSITÀ E SOLUZIONE .............................................................................................. 102B.1.2 CIFRATURA ..................................................................................................................... 103B.1.3 AUTENTICAZIONE ........................................................................................................... 105B.1.4 INTEROPERABILITÀ......................................................................................................... 107B.1.5 PKCS ............................................................................................................................. 107B.1.6 COMPOSIZIONE DI UN CERTIFICATO .............................................................................. 108B.1.7 REVOCA DEI CERTIFICATI .............................................................................................. 108B.1.8 COME SI OTTENGONO I CERTIFICATI ............................................................................. 109B.1.9 COME SI USANO I CERTIFICATI....................................................................................... 109B.1.10 APPLICAZIONI ............................................................................................................... 109B.2 UNA SEMPLICE OSSERVAZIONE SULLA CONNESSIONE SICURA ...................................... 110
APPENDICE C: INSTALLAZIONI E CONFIGURAZIONI ............................................ 112
C.1 INSTALLARE E CONFIGURARE MYSQL, APACHE CON SSL, PHP, LDAP.................... 113C.2 GENERAZIONE DEI CERTIFICATI...................................................................................... 120C.2.1 OSSERVAZIONI SUI CERTIFICATI.................................................................................... 120C.2.2 CREARE CERTIFICATI SSL AUTO-FIRMATI.................................................................... 121C.2.3 RILASCIARE CERTIFICATI CLIENT A SEGUITO DI UNA RICHIESTA. ................................ 122C.2.4 RICHIEDERE UN CERTIFICATO-CLIENT AD UN ENTE CERTIFICATORE UFFICIALE......... 123C.2.5 CONSIDERARE VALIDI I CERTIFICATI-CLIENT RILASCIATE DA ALTRE CA ..................... 123C.3 IL MIO WEB SERVICES....................................................................................................... 125C.3.1 INSTALLAZIONE DI NUSOAP ........................................................................................ 125C.3.2 INSTALLAZIONE DI CURL .............................................................................................. 125C.3.3 IL WSDL DEL MIO WEB SERVICES: COME UTILIZZARE IL SERVIZIO............................ 126
APPENDICE D: LE APPLICAZIONI IN PHP ................................................................... 128
D.1 I LISTATI DEI FILE IN PHP................................................................................................ 129D.1.1 VERIFICA L’ESISTENZA DI UN DOMINIO: “CHECKDOMAIN.PHP”..................................... 129D.1.2 CODICE IN PHP PER INTERROGARE IL WEB SERVICES DI GOOGLE............................ 131D.1.3 LA STAMPA DI REQUEST E RESPONSE DI UN WEB SERVICES CHE REPERISCE SULDAP INFORMAZIONI SU CERTIFICATI-CLIENT ........................................................................ 133D.2 UN SITO PER TESTARE LE APPLICAZIONI........................................................................ 135D.2.1 SCARICARE I CERTIFICATI PER I TEST ........................................................................... 135D.2.2 IL LINK AI SERVIZI OFFERTI ............................................................................................ 136D.2.3 INVOCARE IL WEB SERVICES SU HTTPS DA HTTP: “L’ESEMPIO 6.5.5” ........................ 137
CONCLUSIONI E SVILUPPI FUTURI .............................................................................. 139
8
BIBLIOGRAFIA ..................................................................................................................... 140
SOFTWARE UTILIZZATO .................................................................................................. 141
RINGRAZIAMENTI .............................................................................................................. 142
10
Introduzione
Questo lavoro di tesi nasce con l’intento di effettuare degli studi relativi alla
certificazione digitale e all’autenticazione su Internet.
Ha come primo scopo la realizzazione di un Web server che supporta la
connessione sicura “over https”.
Prevede uno studio sui certificati, sulle tecniche crittografiche, sulle PKI.
Si è inoltre voluto trattare un argomento fondamentale in questo campo: i servizi basati
su directory LDAP.
Il servizio basato su directory LDAP ha un’architettura client/server: uno o più
server LDAP contengono i dati che costituiscono l’albero di directory e un client può
connettersi ad un server LDAP per interrogarlo. Il server risponde inviando una risposta
e/o un puntatore verso risorse dalle quali il client potrebbe ottenere informazioni
addizionali (un altro server LDAP).
Il lavoro si completa con lo studio dei Web services, analizzando la loro
crescente importanza su Internet e la loro facilità di utilizzo e, ovviamente
realizzandone uno.
Le applicazioni realizzate hanno come obiettivo un’integrazione dei suddetti
argomenti.
12
1.1 Introduzione
Nel contesto dell’e-commerce e della sicurezza dei sistemi informatici, si può
dare una definizione di fiducia come l’aspettativa o la convinzione che la controparte di
una transazione si comporterà in accordo ad una data politica e senza intenti criminali;
una definizione di fiducia nei sistemi, invece, potrebbe essere l’aspettativa o la
convinzione che essi siano robusti, affidabili e resistenti di fronte agli attacchi. La
fiducia è quindi essenzialmente una convinzione e si assume che sia basata
sull’evidenza, sull’esperienza e sulla percezione.
Nel mondo fisico la fiducia nelle cose e in altre persone è basata
sull’esperienza, sull’apparenza e sulle informazioni raccolte: tutti questi aspetti
evidenziano il fatto che la fiducia è un fenomeno molto soggettivo. Un’altra
caratteristica del mondo fisico è che il numero di persone con cui si può entrare
potenzialmente in relazione è limitato dalla distanza e da altri limiti fisici, mentre su
Internet il limite è rappresentato solo dal numero di persone on-line in quel momento: la
sfida è quella di riuscire a stabilire la fiducia in ambito informatico. Il partner di una
transazione può essere qualcuno che si è già conosciuto, ma nella maggior parte dei
casi sarà qualcuno totalmente sconosciuto e con il quale non si è mai interagito prima:
le decisioni sulla fiducia devono essere basate su tutte le evidenze e le informazioni
che possono essere raccolte, perciò l’atto di decidere se fidarsi o no può essere
definito come l’attività di collezionare, codificare, analizzare e presentare evidenze
rilevanti con l’obiettivo di prendere decisioni.
La chiave della sicurezza è la fiducia.
Sia per uno sviluppatore sia per un fornitore di servizio, l’obiettivo è quello di
garantire il più alto grado di sicurezza possibile, in modo tale che l’utente possa essere
sicuro del fatto che le informazioni inviate e ricevute siano e si mantengano private e
veritiere; in una forma o nell’altra, comunque, ogni sistema di sicurezza si basa sulla
fiducia tra gli utenti di quello stesso sistema. Esistono differenti forme di fiducia, a
seconda dei problemi da affrontare e dei rischi da limitare, perciò la scelta su quale
forma di fiducia applicare viene determinata da scelte politiche. In particolare esistono
due importanti forme di fiducia che gli utenti di un sistema che implementa la sicurezza
devono essere in grado di capire: fiducia-nella-terza-parte (third-party trust) o indiretta
13
e fiducia personale o diretta. Cerchiamo di capire questi concetti e fornire alcune
informazioni addizionali.
1.1.1. La fiducia nella “terza-parte”
Il concetto di fiducia indiretta (third-party trust) si riferisce ad una situazione
nella quale due individui si fidano implicitamente l’uno dell’altro, anche senza aver
precedentemente stabilito una relazione personale: in questa situazione la reciproca
fiducia può sussistere, perché entrambi conoscono direttamente il medesimo terzo
individuo e quel terzo individuo garantisce ognuno dei due sulla affidabilità dell’altro.
La fiducia-nella-terza-parte è un requisito fondamentale per qualsiasi
implementazione su larga scala di un sistema di sicurezza basato sulla crittografia a
chiave pubblica, che prevede, cioè, l’accesso alle chiavi pubbliche degli utenti. Infatti,
in una rete su larga scala, è impraticabile e irrealistico aspettarsi che ogni individuo
abbia preventivamente stabilito relazioni con tutti gli altri; inoltre, per il fatto che le
chiavi pubbliche devono essere disponibili per tutti, l’associazione tra una chiave
pubblica e una persona deve essere garantita da una terza parte assolutamente
affidabile e irreprensibile, per prevenire «travestimenti». In effetti, gli utenti si fidano
implicitamente di una qualsiasi chiave pubblica certificata dalla terza parte, perché
l’organizzazione di quest’ultima è proprietaria e mantiene in modo sicuro l’associazione
tra la certificazione e l’oggetto della fiducia. In generale, l’agente di certificazione viene
chiamato «Certification Authority» (CA): si tratta di un’entità la cui principale
responsabilità è quella di certificare l’autenticità degli utenti e può essere vista come
analoga allo Stato che emette passaporti e carte di identità (identità cartacee). Ogni
altro Stato che si fidi dell’autorità del primo si fiderà anche del passaporto dell’utente:
questo è un buon esempio di fiducia-nella-terza-parte. Similmente ad un passaporto,
l’identità elettronica di un utente, emessa per lui da una CA, è la prova che l’utente ha
del fatto che una CA si fida di lui; per questo, attraverso la fiducia-nella-terza-parte,
chiunque ritenga la CA affidabile dovrebbe anche fidarsi dell’utente, per una sorta di
proprietà transitiva.
Sia l’ufficio di emissione passaporti sia la CA sono una combinazione di
strutture fisiche di controllo: nel caso dell’ufficio passaporti ci sono una serie di controlli
fissati dall’ordinamento giudiziario, che stabiliscono quali persone sono cittadini
14
rispettabili e le modalità per ottenere un passaporto; similmente, una CA può essere
pensata come un gruppo di persone facenti parte di un’organizzazione, le quali
determinano le politiche di sicurezza sulla rete e decidono quali individui possono
ricevere identità elettroniche, cioè certificati.
1.1.2. Fiducia senza intermediazioni
Il concetto di fiducia diretta si riferisce ad una situazione nella quale due
individui hanno stabilito una relazione di fiducia direttamente tra loro, senza
intermediazioni. Mentre la fiducia-nella-terza-parte permette agli individui di fidarsi
implicitamente l’uno dell’altro senza prima aver stabilito alcuna relazione personale, la
fiducia diretta si basa sulla conoscenza reciproca, prima dello scambio di informazioni
delicate. Per la sicurezza sulla rete è richiesta la fiducia diretta quando individui
provenienti da domini separati si scambiano informazioni sulle chiavi per rendere
sicure le comunicazioni, poiché le rispettive CA non hanno stabilito una relazione di
fiducia attraverso una certificazione incrociata. Senza una fiducia diretta, in questo
scenario lo scambio di chiavi non avrebbe alcun valore, perché l’informazione sulla
chiave stessa potrebbe essere non affidabile (non la chiave in sé, ma i dati del
proprietario).
Quando si applica la fiducia diretta per rendere sicure le comunicazioni,
solamente la responsabilità di ognuna delle parti può dare una qualche garanzia: se si
sceglie questa strada significa, probabilmente, che ognuna delle parti ritiene che la
fiducia personale sia sufficiente per il tipo di operazioni che si stanno portando avanti.
Comunque, quando è presente la fiducia diretta, lo scambio di chiavi tra
individui con un rapporto personale fornisce un potente meccanismo per assicurare
comunicazioni sicure.
1.1.3. Validità dei certificati
Il certificato di un utente della rete è l’equivalente elettronico del suo passaporto
e, in quanto tale, un certificato contiene informazioni sicure che possono essere usate
per verificare l’identità del proprietario: per esempio il certificato ne contiene il nome,
15
ma soprattutto la chiave pubblica, che rappresenta la parte critica di informazione per
quanto riguarda la sicurezza.
Volendo affrontare il problema in termini di fiducia, ci sono due aspetti centrali in
relazione ai certificati.
- Il primo riguarda la credibilità dell’informazione contenuta nel certificato. Come
si può pretendere che una persona si fidi del fatto che il nome e la chiave pubblica
contenuti in un certificato appartengano veramente a chi dichiara di esserne il
proprietario? Come si può essere sicuri che il certificato non sia stato falsificato? Senza
questo tipo di credibilità, la crittografia a chiave pubblica crollerebbe come un castello
di carte, perché nessuno sarebbe sicuro di crittografare dati per la persona giusta,
mentre un certificato sarebbe completamente inutile se non si potesse associarlo ad un
preciso individuo. Allora, per stabilire un rapporto di fiducia, deve esserci un
intermediario, la CA, che appone la propria firma digitale al certificato, garantendo così
l’integrità, l’autenticazione e il non ripudio dello stesso.
- Dopo aver appurato che un certificato è reso credibile dalla firma digitale della
CA, il secondo aspetto che porta a fidarsi di un certificato riguarda il lecito dubbio sulla
credibilità della CA in se stessa. Se, come prima, si mette in relazione di analogia
questo scenario con quello del mondo burocratico e giuridico, il corretto parallelo si
potrebbe fare su fino a che punto ci si può fidare dell’ufficio che ha emesso il
passaporto. Si prenda l’esempio di un cittadino che entra nello Stato A presentando un
passaporto apparentemente valido emesso da un ufficio dello Stato B: gli ufficiali dello
Stato A ospite dovranno valutare la credibilità dell’ufficio passaporti dello Stato B,
facendo riferimento ad una lista correntemente valida di Stati affidabili, redatta da un
gruppo di sorveglianza a livello superiore, che rientri, comunque, nei limiti di controllo
dell’agenzia.
L’analogia con la lista di Stati affidabili, nel contesto della sicurezza delle reti, è
riferita come «dominio di certificazione incrociata tra CA». La certificazione incrociata è
un processo grazie al quale due CA si scambiano, in modalità sicura, informazioni sulle
reciproche chiavi, in modo tale che ognuna delle due possa effettivamente certificare la
credibilità della chiave dell’altra. Essenzialmente, la certificazione incrociata è una
forma estesa di fiducia-nella-terza-parte, nella quale gli utenti appartenenti ad una rete
16
nel dominio di una CA si fidano implicitamente di tutti gli utenti appartenenti ai domini di
altre CA certificate in modo incrociato con la propria CA.
Da una prospettiva tecnica, la certificazione incrociata coinvolge la creazione di
certificati incrociati tra due CA: quando la CA X e la CA Y si certificano l’un l’altra, in
modo incrociato, la CA X crea e firma un certificato contenente la chiave pubblica della
CA Y, e viceversa. Di conseguenza, gli utenti appartenenti ad entrambi i domini sono
garantiti sul fatto che le relative CA si fidano l’una dell’altra; per questo gli utenti di un
dominio si possono fidare di quelli dell’altro attraverso una fiducia-nella-terza-parte
estesa.
Ci sono, naturalmente, molti più accordi da prendere nella certificazione
incrociata tra CA, piuttosto che nei dettagli tecnici che hanno a che fare con lo scambio
sicuro di chiavi ed informazioni analoghe tra utente e CA (cosa, in sé, abbastanza
facile da realizzare). In quanto la certificazione incrociata estende la fiducia-nella-terza-
parte, è importante, per ogni dominio CA, essere completamente sicuro delle strutture
di sicurezza degli altri partner. Riprendendo un’ennesima volta il parallelo del
passaporto, sarebbe inverosimile che uno Stato dichiarasse di avere fiducia nel
passaporto emesso da un altro Stato senza prima esaminarne a fondo la politica
adottata per creare e distribuire passaporti ai cittadini. Per esempio, prima di stabilire
un rapporto di fiducia, ogni Stato vorrà sicuramente capire in modo dettagliato il
processo con il quale la controparte verifica l’identità di un cittadino prima di conferirgli
un passaporto. Analogamente si presentano le cose quando si creano certificazioni
incrociate tra diversi domini CA: per esempio, prima di procedere, entrambi i domini CA
vorranno conoscere le altrui politiche di sicurezza, specialmente le modalità di accesso
alle funzioni di manipolazione della sicurezza all’interno del dominio. È anche
verosimile che gli accordi legali vengano firmati dai rappresentanti di entrambi i domini:
questi accordi dovrebbero precisare le politiche di sicurezza richieste in entrambi i
domini e fornire una garanzia controfirmata che le direttive saranno messe in pratica.
1.1.4. Certification Authority
Una CA può anche emettere un certificato per un’altra CA.
17
Nell’analisi di un particolare certificato, può sorgere il bisogno di esaminare
anche il certificato dell’emissario, eventualmente in modo ricorsivo per ogni CA
«madre», fino a raggiungere quella in cui riporre completa fiducia: si può anche
scegliere di fidarsi solamente di certificati con una catena limitata di emissari, per
ridurre il rischio di incontrare un anello debole (tutto ciò è generalmente trasparente
all’utente finale che, nella maggioranza dei casi, non avrebbe la preparazione per
comprendere ciò che avviene). Ogni certificato richiede un emissario che asserisca la
validità dell’identità del possessore del certificato stesso e ogni emissario richiede un
altro emissario che asserisca l’affidabilità del primo, fino ad arrivare al livello di CA che
ispiri fiducia, oppure al livello root, cioè alla radice dell’albero delle CA (possono
esistere diverse root per diverse strutture ramificate di certificati).
Qui sorge un problema: chi garantisce la validità del certificato della CA al livello
root, che per definizione non ha emissari? In questo caso particolare il certificato è
auto-assegnato, in modo tale che l’emissario del certificato ne sia anche il soggetto.
Come risultato vediamo che l’utente finale deve porre una grande attenzione nello
scegliere un certificato auto-assegnato, ma comunque la pubblicazione in grande stile
e con molta pubblicità della chiave pubblica della CA di livello root dovrebbe ridurre il
rischio: sarebbe facilissimo individuare un impostore che pubblicizzasse la propria
chiave proclamando di essere una CA a livello root.
Fondare una CA, anche non a livello di root, rappresenta comunque una grossa
responsabilità, che richiede una struttura interna estremamente solida dal punto di
vista amministrativo, tecnico e gestionale; le CA non hanno solamente il compito di
emettere certificati, ma anche quello di gestirli: questo significa anche decidere per
quanto tempo i certificati saranno validi, significa doverli rinnovare e mantenere delle
liste di certificati già emessi, ma non più validi (Certificate Revocation List, o CRL). Per
capire la funzione delle CRL, si provi ad immaginare un generico client, titolare di un
certificato in quanto impiegato di un’azienda; si immagini anche che questo stesso
certificato debba essere revocato quando l’impiegato lascia la compagnia: poiché i
certificati sono documenti che vengono distribuiti pubblicamente, non è possibile
stabilire, a partire dal certificato in sé, se questo sia stato revocato oppure no. Per
essere sicuri della validità del certificato, quindi, è necessario contattare la CA che lo
ha emesso, per procedere con il controllo delle CRL.
Si è parlato tanto e tanto si parlerà di certificati: a titolo di esempio si presenta
qui un esempio di certificato crittografato, per avere almeno un’idea del suo aspetto:
18
-----BEGIN CERTIFICATE-----
MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkx
FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUGA
1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhvcml0eTE
VMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBzbmFrZW9pb
C5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzELMAkGA1UEB
hMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjE
XMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxFzAVBgNVBAsTDldlYnNlcnZlciBUZWFtMR
kwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcNAQkBFhB3d3dAc25ha2
VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH9Ge/s2zcH+da+rPTx
/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8bvKR+yy5DGQiijsH1D/j8HlGE+q4TZ
8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaalWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2D
LbCTzLZyPwIDAQABoyYwJDAPBgNVHRMECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQ
QEAwIAQDANBgkqhkiG9w0BAQQFAAOBgQAZUIHAL4D09oE6Lv2k56Gp38OBDuILvwLg1
v1KL8mQR+KFjghCrtpqaztZqcDt2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4
LuKMJX15hxBam7dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==
-----END CERTIFICATE-----
1.2. La sicurezza
Poniamo il caso di un consumatore che desideri comprare qualcosa su Internet,
oppure quello di un uomo d’affari che cerca di vendere qualcosa su Internet : questi
due casi estremi enfatizzano la necessità di utilizzare comunicazioni sicure. A questo
scopo viene usata, ormai da qualche anno, la tecnologia Secure Sockets Layer (SSL)
per garantire una via sicura tramite la quale trasmettere informazioni delicate, come
quelle riguardanti acquisti con carta di credito, operazioni di borsa, invio e ricezione di
e-mail, trasmissione dei risultati di esami medici ed altre informazioni strettamente
personali.
In poche parole, SSL è una tecnologia che permette il trasferimento sicuro di
informazioni su Internet: consiste in un software installato su browser e server, che si
può facilmente ottenere sottoscrivendosi ad un Secured Service Provider (SSP) come
SSL.com, VeriSign, Entrust, Infinite Technologies, oppure ottenendo da esso un
Seller’s Certificate ed installandolo su un server sicuro preesistente; probabilmente,
comunque, una parte di esso è già contenuta sia nel Web browser sia nel Web server,
a priori: infatti, tutti i maggiori browser e server sono abilitati alla gestione di SSL.
19
La tecnologia SSL è stata sviluppata dalla Netscape Communications
Corporation ed è diventata presto la modalità industriale standard per proteggere le
comunicazioni sul Web: si tratta di un livello di protocollo che può essere posizionato
tra un protocollo di rete affidabile e connection oriented (ad esempio TCP/IP) ed un
protocollo a livello di applicazione (ad esempio HTTP): SSL garantisce una
comunicazione sicura tra client e server, tramite una mutua autenticazione, con l’uso
delle firme digitali per l’integrità e della crittografia per la privacy; è progettato per
supportare una rosa di specifici algoritmi crittografici, sia per il sunto matematico
(digest) sia per le firme digitali, permettendo di sceglierne di particolari per server
specifici, ma anche di supportare eventuali nuovi algoritmi: le varie decisioni su quali
algoritmi utilizzare sono prese durante la negoziazione tra il client e il server all’inizio
della sessione sicura.
Un protocollo è, essenzialmente, un insieme di regole e procedure ed, in quanto
tale, SSL applica ad un messaggio una serie di operazioni che lo manipolano
facendogli apparentemente perdere significato: queste operazioni sono portate avanti
in modo che il messaggio non possa essere letto mentre viene trasferito, o meglio: se
anche fosse intercettato durante la trasmissione, risulterebbe completamente
incomprensibile per chiunque, escluso il reale destinatario. Quando il messaggio
raggiunge il ricevente giusto, SSL si incarica di riportarlo al suo aspetto originale,
controllando che provenga dal mittente corretto (autenticazione) e che non sia stato
modificato nel frattempo (integrità).
1.2.1. Concetti base di un servizio di sicurezza
Sono quattro i concetti base che un servizio di sicurezza deve rispettare:
- Privacy: la privacy assicura che solamente il mittente ed il ricevente di un
messaggio crittografato possano leggerne i contenuti; per garantire la privacy,
una soluzione sicura deve, quindi, fare in modo che nessun altro possa vedere,
accedere o altrimenti usare le informazioni private trasmesse tramite Internet,
che potrebbero essere indirizzi, numeri di carte di credito, numeri di telefono,
ecc.
20
- Integrità: l’integrità assicura la rilevazione di qualsiasi cambiamento nel
contenuto di un messaggio, tra l’istante in cui viene inviato e l’istante in cui
viene ricevuto: per esempio, quando un utente ordina alla propria banca di
trasferire $ 1000 da un conto ad un altro, l’integrità garantisce che i numeri di
conto e l’ammontare della somma non possano essere alterati senza che la
banca o l’utente se ne accorgano; se il messaggio dovesse essere alterato in
un qualsiasi modo durante la trasmissione, il sistema di sicurezza deve
assolutamente avere un modo per scoprire e notificare l’alterazione: in molti
sistemi, quando viene riscontrata una alterazione, il sistema di ricezione impone
la ritrasmissione del messaggio.
- Autenticazione : l’autenticazione assicura che tutte le entità coinvolte in una
comunicazione siano in effetti chi dichiarano di essere: l’autenticazione del
server dà modo agli utenti di verificare di essere effettivamente in
comunicazione con il sito Web con cui sono convinti di essere connessi, mentre
l’autenticazione del client assicura che quest’ultimo sia proprio chi dichiara di
essere. Anche nel mondo reale esistono esempi di autenticazione: la
presentazione di una patente di guida o di una carta di identità garantisce che
l’acquirente che firma un assegno è proprio la persona nominata su
quell’assegno, mentre la presentazione di un distintivo o di una tessera di
riconoscimento dell’azienda dei telefoni, con annessa foto identificativa,
garantisce che la persona che si presenta alla porta è veramente l’addetto del
telefono…e questi sono solo alcuni dei tanti possibili esempi.
- Non ripudio (o non disconoscimento): il non ripudio fornisce un modo per
garantire che una parte coinvolta in una transazione non possa poi in seguito
falsamente dichiarare di non aver mai partecipato alla transazione stessa; nel
mondo reale questa funzione è svolta dalle firme apposte a mano in calce ai
documenti: quando un acquirente stacca un assegno, presentando la patente di
guida o la carta di identità assicura la controparte sulla propria identità
(autenticazione), mentre la firma sull’assegno assicura per il futuro che il
firmatario fosse di fatto presente e acconsentisse sull’importo e sul destinatario
dell’assegno stesso (non ripudio).
21
Nel mondo Internet, il protocollo SSL, i certificati digitali e la coppia
username/password sono usati in concomitanza per fornire tutti e quattro i livelli di
garanzia sopra citati.
1.2.2. Tecniche crittografiche
SSL comprende diverse tecniche crittografiche, qui elencate per sommi capi e
poi spiegate in modo approfondito.
- Crittografia con coppia di chiavi: la crittografia con coppia di chiavi (pubblica e
privata) è il metodo crittografico cruciale di SSL: utilizza due chiavi e sofisticati
algoritmi matematici per convertire un testo in chiaro in una serie di dati
crittografati e viceversa. La coppia di chiavi consiste in una chiave pubblica e
registrata, disponibile per chiunque, e in una chiave privata tenuta
rigorosamente segreta dal suo proprietario: un messaggio crittografato con la
chiave pubblica può essere decrittografato solamente da qualcuno in possesso
della corrispondente chiave privata (questo è fondamentale per la privacy);
analogamente, un messaggio crittografato con la chiave privata può essere
decrittografato solamente da qualcuno in possesso della corrispondente chiave
pubblica (questo è fondamentale per l’autenticazione con firma digitale). La
crittografia con chiave pubblica usa algoritmi molto avanzati per crittografare
una piccola quantità di informazioni, mentre non è applicabile per quantità di
dati più rilevanti.
- Algoritmi di bulk encryption: esistono, per contro, algoritmi di bulk encryption
(bulk = massa, grande quantità) che usano solamente una chiave segreta e
condivisa (bulk key) tra i due comunicanti per crittografare i messaggi: questi
algoritmi sono estremamente difficili da decodificare quando la bulk key
contiene un elevato numero di bit.
- Combinazione delle due tecniche : SSL utilizza, allora, la crittografia con coppia
di chiavi per scambiare tra il client e il server la bulk key, nelle primissime fasi di
una conversazione sicura in Internet, assicurando così che suddetta chiave
22
rimanga segreta per tutta la durata della conversazione; poi si serve di questa
chiave per crittografare la parte veramente sostanziale dei dati, cioè le
informazioni che rivestono importanza per i due comunicanti e che devono
essere scambiate. SSL utilizza la crittografia con coppia di chiavi e gli algoritmi
di bulk encryption per garantire la privacy in Internet.
- Algoritmi di hashing : SSL usa algoritmi di hashing per creare una piccola
«impronta digitale», matematicamente generata, di un messaggio: se una
qualsiasi parte del messaggio viene alterata, la sua impronta nuovamente
generata a partire dal messaggio ricevuto non coinciderà più con la prima,
quando il messaggio verrà controllato dal ricevitore: in questo caso viene
richiesto al mittente la ritrasmissione. Questo è il modo con cui SSL garantisce
l’integrità.
1.2.2.1. La crittografia simmetrica
La crittografia è la scienza di occultare le informazioni.
Per gran parte della storia dell’uomo è esistita solo una forma molto pratica e
semplice di crittografia: la crittografia simmetrica. Un esempio di crittografia simmetrica
è quella usata da Giulio Cesare, che spostava semplicemente in avanti ogni lettera di
un messaggio di un certo numero di lettere, secondo l’alfabeto. Per esempio,
spostando ogni lettera di tre posti in avanti, potremmo cifrare un messaggio in questo
modo:
«Questo è il messaggio», ottenendo: «Tahvzr h no phvvdllnr».
In questo caso, il testo «Tahvzr h no phvvdllnr» viene chiamato testo cifrato e il
numero 3 (il numero di posti di cui ogni lettera è stata spostata) è la chiave: chi riceve il
testo cifrato deve conoscere la chiave, cioè il numero 3 (per sapere di dover spostare
di 3 posti indietro le lettere).
Questo tipo di cifratura è ovviamente molto debole (ci sono solo 26 possibili
chiavi), ma è molto utile per spiegare a cosa assomiglia una cifratura simmetrica: è
simmetrica perché chiunque conosca la chiave per crittografare (muovere avanti le
lettere di tre posti) conosce anche la chiave per decrittografare (spostare indietro le
lettere di tre posti) e viceversa; tutte le cifrature simmetriche hanno questa proprietà,
23
anche se con quelle attuali si ha la possibilità di scegliere tra molte più chiavi di quante
ne avesse a disposizione Giulio Cesare.
1.2.2.2. La crittografia asimmetrica
Fino a poco tempo fa, si era soliti usare questa tecnica di crittografia simmetrica
per rendere sicura la trasmissione delle informazioni attraverso la rete pubblica, ma il
problema consisteva nel fatto che la chiave, per essere nota ad entrambi, doveva
essere trasmessa dall’uno all’altro in una trasmissione separata, rendendola
vulnerabile al furto durante il passaggio. Durante la seconda guerra mondiale, le spie e
le loro basi dovevano condividere un libro di codici; più tardi gli scienziati svilupparono
hardware specializzato che poteva operare all’interno di scatole a prova di
intromissione, spostato da luogo a luogo da corrieri fidati. Una volta che entrambe le
parti conoscevano la chiave, potevano comunicare in modo sicuro ogni qualvolta lo
desiderassero, ma stabilire la chiave all’inizio era dispendioso e rischioso. La
crittografia simmetrica rendeva possibile una comunicazione sicura tra persone che
veramente ne avessero le possibilità economiche e i mezzi (i governi, i militari, grosse
istituzioni finanziarie), ma non sarebbe mai diventata abbastanza semplice da utilizzare
per le persone comuni.
Più in particolare, supponendo di avere solo questo metodo di crittografia
simmetrica, in cui il client e il server conoscono entrambi la chiave A, sorgono
numerosi altri problemi: oltre al fatto che il client deve trovare un modo sicuro di
trasmettere la sua chiave segreta al server (se la chiave segreta venisse intercettata,
tutte le trasmissioni del client sarebbero compromesse), il client deve a maggior
ragione potersi fidare del server, per il fatto di usare sempre la medesima chiave: se il
server fa il doppio gioco, potrebbe dare la chiave segreta a qualcun altro, leggere altri
messaggi privati del client non indirizzati a lui dopo averli intercettati e addirittura
spacciarsi per il client! Inoltre, nel caso di un’organizzazione con persone che hanno
bisogno di scambiarsi messaggi segreti, ci sarebbe bisogno di tenere memorizzate
migliaia (per non dire milioni) di chiavi segrete, oppure utilizzarne meno (tipo
passpartout), compromettendo la sicurezza.
Negli ultimi anni’70, tre accademici di Stanford ebbero una brillante idea:
Whitfield Diffie, Martin Hellman e Ralph Merkle si chiesero cosa sarebbe successo se il
24
fatto di conoscere la chiave per crittografare non significasse conoscere
automaticamente la chiave per decrittografare. Cosa succederebbe se fosse così
difficile trovare la chiave per decrittografare a partire da quella per crittografare da
poter tranquillamente pubblicare quest’ultima di fronte al mondo intero? In questo
modo chiunque voglia comunicare con una persona in particolare potrebbe cercare la
sua chiave pubblica, con essa crittografare il messaggio e quindi inviarlo: solamente
quella persona conoscerebbe la corrispondente chiave per decrittografare e nessun
altro potrebbe leggere il messaggio, anche conoscendo la chiave pubblica. Questa fu
la geniale idea della crittografia a chiave pubblica, basata essenzialmente su una
crittografia ASIMMETRICA.
Certo che avere l’idea è una cosa, realizzarla nella pratica è un’altra: Diffie,
Hellman e Merkle cercarono di realizzare questo sogno con un metodo, chiamato
«Diffie-Hellman key agreement», attraverso il quale due persone potevano mettersi
d’accordo su una chiave simmetrica condivisa e segreta usando solo messaggi
pubblici, ma non si trattava della crittografia a chiave pubblica, che è tipicamente
asimmetrica.
L’invenzione di un vero e proprio sistema di crittografia asimmetrica a chiave
pubblica si deve a Ron Rivest, Leonard Adelman e Adi Shamir, che lavoravano al MIT
(Massachussets Institute of Technology): il loro sistema, chiamato «criptosistema
RSA» (prima fu messo il nome di Rivest, perché fu lui a colpire nel segno), era basato
sulla difficoltà nel trovare i divisori, cioè i due fattori primi, di numeri molto grandi (il
processo è noto come «fattorizzazione»). Questo metodo non solo permette di inviare
messaggi crittografati, ma possiede anche un’altra importante proprietà: una persona,
crittografando un messaggio con la propria chiave privata, può provare che un dato
messaggio proviene proprio da lui: questo è il concetto che sta alla base della «firma
digitale», che garantisce un modo per stabilire l’integrità di quanto inviato in un mondo
dove vengono scambiati solo bit e byte.
1.2.2.3. L’utilizzo pratico della crittografia
Con la crittografia a chiave pubblica vengono usate due chiavi separate per
crittografare e decrittografare un messaggio, in modo tale che nient’altro che messaggi
crittografati debbano attraversare la rete: la crittografia asimmetrica è utilizzata,
25
appunto, per risolvere il problema di consegnare la bulk key (usata nella crittografia
simmetrica) in modalità sicura. Per fare questo si cripta la bulk key con la chiave
pubblica del server al quale si vuole inviare il messaggio; dal momento che solo lui
conosce la corrispondente chiave privata e che solamente con la chiave privata si può
decriptare il messaggio, solamente quel server potrà ricavare la bulk key ed utilizzarla
per decriptare le successive trasmissioni.
Perché bisogna usare questa combinazione di crittografia asimmetrica e simmetrica?
La ragione è semplice: la crittografia a chiave pubblica è lenta ed è applicabile
solamente per crittografare piccole quantità di informazioni (la chiave simmetrica o bulk
key, per l’appunto), mentre la crittografia simmetrica è molto più veloce ed è adatta per
crittografare grandi quantità di dati.
1.2.3. La firma digitale
Una volta che si sia stabilita una connessione sicura tra due parti, qualsiasi
messaggio ricevuto da un’entità esterna alla connessione sicura viene rigettato, oppure
l’utente viene avvertito. SSL realizza ciò creando una specie di «impronta digitale»
univoca del messaggio (chiamata anche riassunto o digest) per entrambe le parti,
attaccandola in allegato ad ogni messaggio.
Vediamo meglio questo processo di firma digitale.
Prima di tutto, attraverso una one-way function, si realizza un riassunto
«matematico» del messaggio (chiamato anche «hash code» o «message digest) :se
anche un solo bit del messaggio dovesse variare, l’hash code cambierebbe in modo
drammatico. Più in particolare, l’hash code è la rappresentazione di messaggi lunghi e
di dimensione variabile attraverso loro riassunti più corti e con lunghezza fissa: gli
algoritmi di digest sono stati progettati per produrre riassunti univoci per ogni
messaggio, ognuno dei quali è strutturato in modo da rendere estremamente difficile
risalire al messaggio originale. È anche pressoché impossibile trovare due messaggi
differenti che generino lo stesso digest: questo fatto elimina la possibilità di sostituire
un messaggio con un altro mantenendo lo stesso digest.
Il secondo passo nel creare una firma digitale consiste nel crittografare l’hash
code insieme ad altre informazioni (come ad esempio un numero di sequenza), con la
chiave privata del mittente.
26
Anche se chiunque può decrittografare la firma usando la corrispondente chiave
pubblica, solamente il firmatario conosce la chiave privata: questo significa che
solamente lui può aver firmato il digest. Inoltre, includendo il digest nella firma,
quest’ultima risulterà valida solamente per quel messaggio: in questo modo si assicura
anche l’integrità del messaggio, in quanto nessun altro può cambiare il messaggio e
firmarlo nuovamente (con una chiave privata a lui ignota); inoltre, per essere tutelati
contro l’intercettazione e il riuso della firma da parte di un intruso in un istante
successivo, la firma contiene un numero di sequenza unico. Tutto questo meccanismo
protegge il server da un’eventuale falsa dichiarazione del client, che potrebbe dire di
non aver mai mandato il messaggio (non ripudio).
Il terzo passo consiste nell’appendere la firma digitale al messaggio, che si
comporta così alla stregua di una firma manuale in calce ad un assegno.
Infine il messaggio con apposta la firma digitale viene crittografato con la bulk
key , si unisce la bulk key crittografata con la chiave pubblica del server e si spedisce
il tutto.
Il ricevente del messaggio segue questi diversi passi a ritroso, per leggere il
messaggio: nella fase di apertura ricava, utilizzando la propria chiave privata, la bulk
key ; poi usa la bulk key per decriptare il resto del messaggio, che contiene anche la
firma digitale .
A questo punto, SSL verifica l’integrità del messaggio procedendo con un
ulteriore passo di autenticazione: verifica la firma digitale decrittografandola con la
chiave pubblica del mittente (è evidente che il mittente deve essere certificato, per
possedere una chiave pubblica), mettendo così in chiaro il ; allo stesso tempo viene
creato un nuovo hash code a partire dal messaggio ricevuto, posto poi a confronto con
l’originale decrittografato .
Se tra i due c’è un match, cioè se coincidono perfettamente, allora il ricevente
ha la conferma che il messaggio non è stato alterato, ma sa anche qualcosa in più:
solamente il mittente certificato con cui è convinto di parlare può aver inviato il
messaggio, perché solamente lui possiede la chiave privata che ha firmato l’hash code
originale, perciò la firma digitale garantisce sia l’integrità del messaggio, sia l’identità
del mittente, quindi l’autenticazione e il non ripudio. Se tra i due digest, invece, non si
verifica un match, SSL comprende che il messaggio è stato alterato e ne richiede la
ritrasmissione.
27
Una delle applicazioni più utili della firma digitale, a parte l’autenticazione dei
messaggi veri e propri, riguarda la conferma delle chiavi pubbliche di terze persone: la
crittografia a chiave pubblica, infatti, lascia scoperto un possibile punto debole. Nel
momento in cui si vuole comunicare con un particolare Web server, bisogna
determinarne la chiave pubblica e il modo migliore per ottenerla sarebbe quella di
ottenerla direttamente da lui: la maggioranza delle volte, però, questo non è possibile e
si è costretti ad ottenerla attraverso la rete.
Come abbiamo visto il sistema a doppia chiave risolve ogni problema rispetto
ad un’eventuale intercettazione della chiave lungo il tragitto, ma presta il fianco alla
possibilità che un terzo individuo malizioso, conoscendo la volontà di comunicare con
quel particolare Web server, si spacci per lui e spedisca una chiave pubblica
contraffatta. Se si cade nel tranello e si utilizza quella chiave, i successivi messaggi
saranno leggibili non dal Web server con cui si è convinti di comunicare, bensì dal
terzo individuo, titolare della vera corrispondente chiave segreta: quest’ultimo potrà poi
perfezionare il suo inganno rispedendo a sua volta tutti i messaggi al Web server, che
in questo modo non si accorgerà nemmeno dell’esistenza di una tappa in più lungo la
strada. Questo problema (chiamato problema «dell’uomo nel mezzo») è assolutamente
concreto e reale e la soluzione sta nel chiedere e ottenere che ogni nuova chiave
pubblica sia firmata da qualcuno che si conosce e di cui si dispone già con certezza
della rispettiva chiave pubblica. Se si è costretti a ottenere la chiave del Web server via
rete, si avrà cura di verificare che essa sia firmata da una CA che abbia magari contatti
quotidiani con il Web server stesso. Siccome si hanno tutte le ragioni per potersi fidare
di tale CA, si può dire di possederne con certezza la vera chiave pubblica. Con questa
chiave si può verificare la firma che la CA ha apposto sulla chiave pubblica del Web
server, potendo quindi verificare che la CA, considerata affidabile, garantisca che la
chiave pubblica appena arrivata sia effettivamente quella del Web server. A questo
punto è evidente che la certificazione delle chiavi può diventare rapidamente molto
complessa, consentendo, da un unico punto di partenza sicuro, di estendere la rete di
contatti a dismisura, comprendendo anche entità che non si incontreranno mai
direttamente. Con questa caratteristica il cerchio viene chiuso e diventa veramente
possibile stabilire un’infrastruttura comunicativa priva di contatti fisici che sia
doppiamente sicura, sia dal punto di vista della possibilità di leggere il contenuto della
comunicazione, sia da quello di poterne garantire la provenienza
28
1.2.4. Distribuzione sicura di certificati digitali
Dal momento che chiunque può generare coppie di chiavi (tutto sommato si
tratta di calcolare il prodotto di due numeri primi estremamente elevati: la sicurezza
deriva dal fatto che è estremamente difficile riuscire a ottenere i due fattori partendo dal
loro prodotto) sarebbe, in linea teorica, possibile per un individuo malizioso costruire un
sito Web, spacciarlo per quello, ad esempio, di una banca e quindi falsificare le
informazioni contenute in una transazione, fornendo una chiave pubblica agli utenti, i
quali sarebbero convinti di dialogare in modalità sicura con una banca, mentre in realtà
stanno sì comunicando in modo sicuro, ma con un individuo pericoloso: certamente
nessuno potrebbe intercettare le conversazioni che intercorrono tra loro, ma i clienti si
troverebbero nelle grinfie di una persona disonesta, alla quale, in buona fede,
comunicherebbero informazioni private e preziose.
Per prevenire questo tipo di frodi vengono utilizzati i certificati digitali, che
rappresentano un modo autenticato di distribuire le chiavi pubbliche (non quelle
private!): i certificati digitali sono usati per autenticare le parti di una conversazione in
Internet, in modo tale che entrambi (l’utente e il fornitore di contenuto) sappiano per
certo con chi ognuno di loro sta dialogando in quel momento. In particolare, SSL usa i
certificati digitali per collegare insieme importanti informazioni che servono per
identificare un client o un server (il nome dell’organizzazione, il suo indirizzo di email, il
paese di appartenenza, l’organizzazione che ha emesso il certificato, ecc.). Esistono
due tipi differenti di certificati digitali, presentati qui di seguito.
1) I certificati root:
le CA sono entità rispettabili, fidate e indipendenti che emettono chiavi e certificati in
favore di individui e società; esse utilizzano metodi molto seri e rigorosi, per sondare in
profondità le realtà che si trovano di fronte: avendo la responsabilità di garantire la
veridicità di quanto dichiarano i richiedenti il certificato, è loro preciso dovere capire se i
richiedenti sono veramente chi dichiarano di essere e sono, perciò, degni di fiducia. Le
CA rendono disponibili i propri certificati root per il download da parte di chiunque
(alcuni gratuiti di tipo «trial», cioè di prova, altri a pagamento), in modo che chiunque
voglia comunicare con loro in modo sicuro possa farlo; un certo numero di compagnie,
come VeriSign, Thawte, SSL.com o RSA Security, si sono pubblicamente proposte in
29
qualità di CA, fornendo servizi come la verifica e il trattamento delle richieste, e
l’emissione e la buona gestione dei certificati. È possibile per chiunque creare una
propria CA personale: anche se questo può risultare estremamente rischioso e
oneroso in Internet, nell’ambito di una rete Intranet potrebbe risultare utile, perché, in
questo ambiente ristretto, sarebbe più facile per l’organizzazione verificare l’identità
degli individui e dei server.
2) I certificati server e client :
i certificati server sono usati per autenticare un Web server (è facile trovare queste
realtà, in Internet), mentre i certificati client o personali sono usati per autenticare
l’identità di un singolo utente (per loro natura sono molto rari); entrambi i certificati
includono quattro componenti base:
- la chiave pubblica;
- informazioni che legano la chiave pubblica al suo possessore;
- informazioni su chi ha emesso il certificato;
- la firma digitale di chi ha emesso il certificato.
Più in particolare i campi di informazione tipici includono:
- il nome del possessore del certificato;
- l’indirizzo email del possessore del certificato;
- il numero di telefono del possessore del certificato;
- il nome della compagnia per cui il possessore del certificato lavora;
- le medesime informazioni per chi ha emesso il certificato;
- un identificatore univoco per il certificato (serial number);
- un indicatore del livello di fiducia che può essere posto nel certificato;
- la data di emissione del certificato
- a data di scadenza del certificato.
Ci si riferisce alle informazioni raccolte su un qualsiasi individuo come al suo
«Distinguished Name», o DN, perciò un certificato contiene due DN: quello del
possessore e quello dell’emissario del certificato. La cosa più importante, però, è che i
certificati server e client sono essi stessi crittografati con la CHIAVE PRIVATA della CA
30
e in questo modo si ha la sicurezza che sia veramente stata la CA ad emettere quel
certificato: quando un Web browser richiede di avere una conversazione sicura con un
Web server, il server spedisce al browser il proprio certificato (che contiene la propria
chiave pubblica) crittografato con la chiave privata di una determinata CA (è
praticamente lo stesso certificato che la CA ha inviato al Web server al momento della
certificazione); allora il browser autentica il Web server confermando che una CA fidata
ha crittografato il certificato CON LA PROPRIA CHIAVE PRIVATA E SEGRETA,
decrittografandolo con la chiave pubblica della CA stessa, pubblicamente disponibile e
da esso generalmente già conosciuta. A questo punto il browser usa la chiave pubblica
del Web server riposta nel certificato inviato per crittografare la bulk key (generata ex
novo tutte le volte che si stabilisce una nuova sessione sicura) da mandare e
condividere con il Web server: questa nuova chiave è ora usata per crittografare il
resto della conversazione. Usando il certificato server, il Web server e il browser
possono intrattenere una conversazione sicura privata e autenticata, con integrità
garantita: se ogni parte possiede un certificato che valida l’identità dell’altro, conferma
la sua chiave pubblica ed è «firmato» (=«crittografato con la chiave privata di …») da
un’agenzia fidata, allora entrambi saranno sicuri di comunicare con chi sono convinti di
star comunicando
1.2.5. Richiesta di un certificato digitale
Per ottenere un certificato si deve costruirne una richiesta, che contenga tutte le
informazioni personali che appariranno nel certificato stesso: esistono due tipi di
richieste di certificato largamente usate, note come PKCS#10 e RFC 2511.
Una richiesta di certificato PKCS#10 (di gran lunga la più semplice) consiste
internamente di quattro campi:
- un numero di versione (1-3);
- il nome dell’utente finale (DN o Distinguished Name);
- la sua chiave pubblica;
- gli attributi.
31
Il campo degli attributi contiene qualsiasi altra cosa si desideri codificare nel
certificato, come il numero di telefono, il numero di fax, l’indirizzo e-mail, lo scopo per
cui si intende usare la chiave e una moltitudine di altre proprietà.
Può essere difficile capire quali informazioni possano essere incluse ne l DN, che,
teoricamente, è una stringa univoca che identifica il possessore del certificato, e quali,
invece, debbano far parte degli attributi: la distinzione consiste nel fatto che un DN
dovrebbe possedere soltanto i seguenti campi:
- il codice del paese (due lettere), tipo «IT», «UK», ecc.;
- lo stato o la provincia;
- la località;
- l’organizzazione o la compagnia;
- la propria unità organizzativa;
- il proprio nome
La richiesta di certificati RFC 2511, invece, permette di includere altre informazioni
attraverso l’uso delle estensioni, che possono essere attributi addizionali, come il
numero di telefono, oppure istruzioni per l’uso del certificato. Per esempio, un
certificato auto-assegnato richiede un’estensione Key Usage per assicurare che possa,
tale chiave, firmare altri certificati; si può anche voler aggiungere qualche estensione
sulla politica del certificato.
Per quanto riguarda le chiavi, ci sono due differenti approcci per generarne una
coppia e creare un certificato a partire dalla chiave pubblica, come si è già avuto modo
di dire:
1) delegare alla CA il compito di generare la coppia di chiavi e il certificato;
2) generare la coppia di chiavi localmente, usando mezzi hardware o software,
creare la richiesta di certificato contenente la propria chiave pubblica e inviare
tutto alla CA. Nel caso si stia mantenendo una rete con molti server, è meglio
generare centralmente tutte le coppie di chiavi, certificarle tutte e distribuire tutti
i certificati simultaneamente.
32
Quando il certificato raggiunge la data di scadenza, si può generare una nuova
coppia di chiavi ed inviare la nuova chiave pubblica alla CA perché venga certificata,
oppure ricertificare la vecchia chiave inviandola alla CA: in generale, è meglio generare
una nuova coppia di chiavi. Sarebbe quello anche il momento giusto per cambiare la
frase che protegge (passphrase) la chiave privata.
Se altre persone hanno usato il vecchio certificato per inviare messaggi
crittografati e il ricevente li ha memorizzati in questa forma, allora quest’ultimo deve
mantenere una copia della vecchia chiave privata per poter poi leggere i vecchi
messaggi, ma se questo dovesse causare problemi, si può anche decrittografare i
messaggi e ricrittografarli con la nuova chiave pubblica.
1.2.6. Il “lato” utente
Piuttosto che sull’autenticazione dell’utente, la maggior parte delle applicazioni
Web attuali si basano semplicemente sull’immissione di uno username e di una
password da parte dell’utente, per cercare di garantire il non ripudio. Le applicazioni,
però, possono richiedere una firma digitale da parte del client, che implica che l’utente
autorizzi specificatamente una transazione e, in particolare, che possieda un certificato
client. L’autorizzazione è quindi crittografata con la chiave privata del client, che
quest’ultimo mantiene rigorosamente segreta. In ogni caso, però, l’adozione dei
certificati client per uso individuale su Internet ha avuto uno sviluppo molto scarso,
anche perché gli utenti non hanno né tempo né voglia di seguire il noioso iter
burocratico necessario per l’ottenimento di un certificato client.
Differenti combinazioni di tutte le tecniche di sicurezza sopra esposte sono
usate per diverse applicazioni, a seconda della tipologia di sicurezza necessaria e della
misura in cui la soluzione ha necessità di essere bilanciata con la convenienza per
l’utente finale. Proprio per questo i certificati client per la garanzia di autenticazione e
non ripudio non sono utilizzati in modo diffuso sul Web, attualmente, perché la
maggioranza degli utenti non vuole essere annoiata con pratiche amministrative e
burocratiche per ottenere e mantenere in modo sicuro un certificato client.
33
1.3. SSL 3.0
Esiste una serie di versioni del protocollo SSL: in particolare, uno dei maggiori
benefici di SSL 3.0 risiede nel fatto che questa versione aggiunge il supporto per il
caricamento automatico delle catene dei certificati, permettendo così ad un server di
inviare al browser un proprio certificato insieme ai certificati degli emissari. Il browser
che si utilizza per navigare su Internet supporta tipicamente un certo numero di CA ben
note, perciò, richiedendo una comunicazione sicura con un Web server, se questo
risultasse certificato da una di esse, si è automaticamente garantiti sulla tutela delle
trasmissioni. Se, invece, ci si trova a comunicare con un Web server certificato da una
CA non compresa nella lista contenuta nel browser, sarà necessario caricare il
certificato della CA in questione nel browser stesso, abilitando perciò quest’ultimo a
validare anche tutti i certificati server firmati da quella CA.; questo comportamento
potrebbe risultare alla lunga pericoloso, perché, una volta caricato il certificato, il
browser accetterà tutti i certificati firmati da quella particolare CA. Invece il caricamento
automatico delle catene di certificati che si ha con la versione 3.0 del protocollo SSL
permette al browser di validare il certificato del server anche se i certificati di alcune CA
intermedie non sono stati installati, in quanto essi fanno comunque parte della catena
di certificati . SSL 3.0 è la base del protocollo standard Transport Layer Security
(TLS), sviluppato ad opera della Internet Engineering Task Force (IETF).
1.3.1. Sequenza di handshake
La sessione SSL viene stabilita seguendo una sequenza di handshake tra il
client e il server, che può variare, a seconda che il server sia stato configurato per
fornire un certificato server, oppure per richiedere un certificato client. Anche se
possono esistere casi particolari in cui vengono richiesti passi addizionali di
handshake, ad esempio per la gestione delle informazioni sulla Cipher Suite, cioè il set
riguardante gli algoritmi da usare per la crittografia, qui di seguito si tratterà lo scenario
più comune, rimandando, per ulteriori dettagli, alle specifiche di SSL.
34
Una volta che una sessione SSL è stata stabilita (durante l’handshake sono
stati fissati il numero di versione del protocollo, l’identificatore di sessione, il set di
algoritmi crittografici e le tecniche di compressione), può essere utilizzata per più
comunicazioni richiesta/risposta consecutive, evitando così le penalizzazioni di
performance legate alla necessità di ripetere i numerosi passi necessari per iniziare
una sessione ex novo: per questo, il server assegna ad ogni sessione SSL un unico
identificatore di sessione (memorizzandolo in cache) che può essere usato dal client
nelle successive comunicazioni, per ridurre il tempo necessario per l’handshake
(perlomeno finché l’identificativo di sessione rimane memorizzato nella cache del
server e naturalmente finché il client non chiude il browser).
I passi della sequenza di handshake sono:
- negoziazione della Cipher Suite da usare durante il trasferimento dati;
- costituzione e distribuzione della chiave di sessione o bulk key tra client e server
(«exchange random values»);
- autenticazione del server nei confronti del client (opzionale);
- autenticazione del client nei confronti del server (opzionale).
Un modo comune di usare SSL è proprio quello di rendere sicure le comunicazioni
HTTP sul Web, tra un browser e un Web server. Questa possibilità non preclude l’uso
di comunicazioni HTTP non sicure. La versione sicura viene realizzata sovrapponendo
HTTP su SSL (protocollo HTTPS), ma con un rilevante differenza: usa lo schema URL
https piuttosto che http e una differente porta del server (per default la 443).
36
2.1 Public Key Infrastructure
Una buona soluzione per la sicurezza in rete impone che il fornitore di contenuti
ed il client gestiscano e mantengano segreti, in modo responsabile e attento, i rispettivi
certificati digitali ed altre informazioni riguardanti la sicurezza: le soluzioni di Public Key
Infrastructure (PKI) aiutano le compagnie nel difficile compito di gestire queste
informazioni, in modo da mantenerle sicure e facili da organizzare; infatti la crittografia
a chiave pubblica garantisce gli aspetti critici della sicurezza nelle transazioni
elettroniche, ma tutto ciò non può essere realizzato «sottovuoto», cioè rimanendo
all’interno degli algoritmi matematici.
Ad esempio si può aver bisogno di sapere:
- chi ha emesso il certificato;
- dove viene immagazzinata la chiave privata;
- dove si possono trovare i certificati.
2.2 Funzioni assolte da una PKI
Una PKI comprende comunemente le seguenti componenti funzionali:
- Certificate Authority (CA): hanno il compito di emettere, consegnare e revocare i
certificati (internamente o in outsourcing);
- Registration Authority (RA): hanno il compito di verificare il legame tra le chiavi
pubbliche e le identità dei possessori;
- Soggetti o possessori dei certificati: persone, organizzazioni, macchine o software
per i quali è stato emesso un certificato e che possono usarlo per firmare i propri
documenti;
- Clienti: questi validano le firme digitali e la propria catena di certificati attraverso la
chiave pubblica di una CA fidata;
- Repository: contenitore per le chiavi, i certificati e la lista dei certificati revocati o
Certificate Revocation List (CRL), mantenuto in una directory abilitata all’LDAP
(Lightweight Directory Access Protocol);
- Funzione di gestione: tipicamente implementata tramite una console di gestione;
37
- Politica di sicurezza: stabilisce e definisce la direzione che viene scelta, ad alto
livello, per l’organizzazione della sicurezza, così come tutti i processi e i principi per
l’uso della crittografia.
- In aggiunta a tutto ciò la PKI può fornire un servizio di recupero delle chiavi nel
caso in cui un utente dovesse perdere la propria chiave privata, a causa di un
crash hardware o di altri problemi.
Le seguenti sono alcune delle funzioni realizzate all’interno di una PKI:
- Registrazione: questo è il processo attraverso il quale il richiedente si presenta alla
CA, per cercare di ottenere un certificato: durante la procedura viene richiesto al
soggetto di fornire i propri attributi, come il nome, l’indirizzo di e-mail, il numero di
telefono ed altre informazioni, seguendo le specifiche CPS (Certification Practices
Statement) della CA; quindi la CA segue le linee guida specificate nel CPS, per
verificare che i dettagli forniti dal soggetto siano corretti, prima di emettere il
certificato;
- Certificazione: è il processo attraverso il quale la CA emette un certificato che
contiene la chiave pubblica del soggetto, lo consegna al soggetto stesso e lo
pubblica in un repository pubblico e accessibile a tutti;
- Generazione delle chiavi: in qualche caso, il soggetto genera la coppia di chiavi nel
proprio ambiente locale e poi passa la chiave pubblica alla CA per l’emissione del
certificato; se invece è la CA ad essere responsabile della generazione delle chiavi,
le stesse sono normalmente inviate al soggetto sottoforma di file crittografato,
oppure su un token fisico come una Smartcard. Per ragioni di sicurezza, è
considerata migliore la pratica di generazione della coppia di chiavi da parte
dell’utente, seguita dalla trasmissione della sola chiave pubblica alla CA, perché in
questo modo si è sicuri che la chiave privata sia memorizzata solo in un’unica
postazione;
- Recupero della chiave: alcune implementazioni PKI richiedono che di tutte le
chiavi, comprese quelle per la bulk encription, venga fatta una copia di backup
immagazzinata in una postazione sicura da parte dell’utente: in questo modo esse
38
sono recuperabili se il soggetto dovesse perderle, permettendo così di
decrittografare dati crittografati precedentemente inviati. Se invece è stato
implementato un altro sistema di recupero delle chiavi, la CA stessa o il sistema
dedicato per il recupero fa il backup di tutte le chiavi di tutti i soggetti: il compito
principale della CA è, in questo caso, quello di assicurare che una chiave possa
essere recuperata dal soggetto che ne è il proprietario, ma non da altre parti non
autorizzate;
- Aggiornamento delle chiavi: tutte le coppie di chiavi ed i certificati ad esse associati
devono essere aggiornati ad intervalli regolari; possono presentarsi essenzialmente
due scenari che rendono necessaria la sostituzione della coppia di chiavi di un
utente:
1) la data specificata nel certificato come data di scadenza è stata
raggiunta: in questo caso i differenti componenti della PKI devono
assicurare che l’aggiornamento sia quanto più possibile
trasparente, in modo da minimizzare il disturbo arrecato all’utente
quando la sua coppia di chiavi viene aggiornata;
2) la chiave privata (dell’utente o della CA) è compromessa: in questo
caso la transizione non è trasparente. La PKI deve avere un
meccanismo per annunciare pubblicamente che il vecchio
certificato, corrispondente alla chiave privata compromessa, non è
più valido e che un suo sostituto (eventualmente) è disponibile e
valido con effetto immediato. Lo scenario peggiore per una
qualsiasi PKI è la compromissione della chiave privata della sua
stessa CA . Un modo per limitare i danni di questo disastro è quello
di pregenerare e immagazzinare in una postazione sicura una
coppia di chiavi di riserva, da usare in una situazione di
emergenza; anche con questa coppia di riserva non si evitano
naturalmente le complicazioni, perché ogni utente della PKI deve
essere informato della sostituzione usando una qualche modalità
«off line», ad esempio tramite telefono, fax, lettera o un incontro
39
faccia a faccia con la controparte, per evitare di usare la
trasmissione elettronica e le conseguenti possibili intercettazioni;
- Certificazione incrociata: il processo di certificazione incrociata permette ad utenti
appartenenti al dominio amministrativo di una particolare CA di fidarsi dei certificati
emessi da una CA operante in un dominio amministrativo diverso. Si noti che la
certificazione incrociata può essere un processo ad una o due vie: se la CA X
emette un certificato in favore della CA Y, la CA Y può emettere a sua volta un
certificato in favore della CA X;
- Revoca o annullamento: nella maggior parte dei casi, un certificato rimane valido
fino a quando non viene raggiunta la data di scadenza. Ci sono comunque un certo
numero di situazioni in cui è necessaria una revoca prematura del certificato, che
includono i seguenti casi:
1) il soggetto ha cambiato nome;
2) un impiegato lascia la compagnia che ha emesso il certificato;
3) si è verificata una compromissione (o una sospetta
compromissione) della chiave privata.
Il metodo stabilito per la revoca dei certificati include l’uso di una Certificate Revocation
List (CRL), che raccoglie i certificati revocati (normalmente ogni certificato è identificato
da un numero seriale unico, assegnato nel momento dell’emissione) ed è firmata con
tanto di data dalla CA; la CA pubblica la CRL ad intervalli regolari, nello stesso
repository pubblico. Un punto critico che emerge dall’uso delle CRL è giudicare
l’intervallo più appropriato tra una pubblicazione e l’altra della CRL aggiornata: un
certificato la cui corrispondente chiave privata sia stata compromessa deve essere
revocato il più presto possibile, subito dopo che la compromissione è stata scoperta;
altrimenti, se la CRL non venisse pubblicata per molti giorni, dopo la revoca del
certificato, gli utenti non sarebbero a conoscenza del problema e potrebbero accettare
messaggi firmati da un intruso con la chiave privata rubata; comunque, anche se la
40
CRL fosse pubblicata immediatamente dopo la revoca, non ci sarebbe garanzia che gli
utenti ne vengano a conoscenza in tempo.
2.3 Tipi di PKI
I problemi, crittografici e non, di cui le PKI si devono fare carico, sono relativamente
ben compresi dal mondo che lavora utilizzando Internet: a causa di questi problemi la
realizzazione pratica di una PKI richiede grossi sforzi di gestione e per necessità di
specializzazione ne sono essenzialmente emersi due tipi:
1) root PKI;
2) PKI ordinarie.
Tutte le chiavi pubbliche delle CA a livello root sono inserite nei Web browser
pubblicamente disponibili sul mercato, sottoforma di certificati X.509 auto-assegnati (la
chiave pubblica è auto certificata con la corrispondente chiave privata della root CA):
l’unico scopo dell’autocertificazione è quello di semplificare la gestione dei certificati.
Essendo i certificati root distribuiti insieme ai browser, essi non possono essere
facilmente aggiornati, perciò la gestione di chiavi root segue il destino delle versioni e
delle distribuzioni dei browser stessi. Quindi, per tenere aggiornate le chiavi root, gli
utenti devono continuamente tenere allineati i loro browser alle versioni più nuove e
appena uscite; inoltre, dal momento che non è possibile, praticamente, modificare
centinaia di migliaia di copie di chiavi sparse sui browser di mezzo mondo, è anche
praticamente impossibile revocare i certificati root: per questo motivo le CA root si
distinguono dalle altre per la propria organizzazione, estremamente solida e a prova di
pirata informatico.
Una delle tante applicazioni dei certificati digitali è quella di firmare digitalmente
componenti software per autenticarne i produttori: infatti il problema della sicurezza che
gli utenti stanno affrontando, relativamente a componenti attivi come gli Applet Java e
gli Active-X Microsoft, è se tali programmi, importati dall’esterno e fatti eseguire sul
proprio computer, possano essere eseguiti in modo sicuro. Un modo di risolvere
questo problema potrebbe essere quello di accettare solo i componenti firmati
41
digitalmente dalla chiave pubblica dei relativi costruttori, ma così si avrebbe solamente
un modo per identificarne l’identità e, in linea di principio, questo non può garantire
nulla: anche una software house fidata e perfettamente in buona fede potrebbe, per
errore, costruire un componente pericoloso. L’esecuzione di componenti software
richiede molto più dell’autenticazione del produttore del software e della sua origine.
Questo è un problema cruciale dell’ingegneria del software in generale, ma è
particolarmente rilevante nell’e-commerce, dove i componenti che rendono semplice le
transazioni elettroniche sulla rete hanno una natura sempre più dinamica. Nei sistemi
tradizionali, il testing accresce la fiducia in un comportamento sicuro da parte del
sistema stesso, ma nei sistemi di e-commerce, i componenti software vanno e
vengono dinamicamente e l’opportunità per un testing integrato e immediato
diminuisce sempre di più, invece di aumentare.
Al contrario delle root PKI, una PKI ordinaria non distribuisce le proprie chiavi
pubbliche all’interno dei Web browser, ma attraverso procedure separate, controllate
dall’organizzazione della PKI stessa: questa organizzazione generalmente amministra
alcuni server dai quali possono essere scaricati i certificati. Le PKI ordinarie sono nate
per incontrare specifici bisogni all’interno di particolari organizzazioni o attività di
business; tali PKI avranno pieno controllo sulle politiche di fiducia all’interno della
propria gerarchia, ma, non potendo inserire le chiavi all’interno dei Web browser, non
riescono ad ottenere facilmente una copertura globale. Le PKI ordinarie possono
garantire grande affidabilità ed essere quindi adatte per transazioni di grande portata:
inoltre le organizzazioni che le gestiscono possono decidere, o possono essere
costrette dalle leggi di un particolare paese, a fare certificazioni incrociate con altre
PKI, ordinarie oppure root. In questo modo si formano diverse gerarchie di certificazioni
collegate ed un utente, che si trovi di fronte alla necessità di identificare in modo sicuro
un Web server certificato da una PKI ordinaria, può risalire la gerarchia fino a ritrovare
un certificato root.
La distribuzione sicura delle chiavi pubbliche è essenziale e una tipica soluzione
potrebbe essere anche quella di equipaggiare ogni utente con una Smartcard,
contenente le chiavi private dell’utente e le chiavi root pubbliche.
Il grado di fiducia nel legame tra una chiave pubblica e l’identità del possessore
memorizzata in un certificato dipende da molti fattori, incluse le pratiche seguite dalla
CA nel verificare l’identità del proprietario, la politica operativa della CA, le procedure e
i controlli di sicurezza, gli obblighi del proprietario (riguardanti ad esempio la
42
memorizzazione sicura della chiave privata) e gli obblighi legali della CA (ad esempio
le garanzie che deve fornire agli utenti). In accordo con X.509, una politica di
certificazione è un «insieme di regole che indicano l’applicabilità di un certificato a
particolari comunità e/o classi di applicazioni con requisiti comuni di sicurezza’’. È
interessante notare che una root PKI consiste di gerarchie isolate con una CA root
distinta al top: la ragione di questo è in parte dovuta alla difficoltà di confrontare il CPS
(Certificate Practices Statement) e renderle compatibili e alla conseguente difficoltà nel
creare certificazioni incrociate.
I modelli di sicurezza basati sulla politica sono utili, in quanto specificano regole
generali per il reperimento di gruppi di informazioni oggettive e verificate dalla CA, ma,
perché questi abbiano significato, la parte interessata dovrebbe effettivamente leggere
il CPS o i documenti riguardanti la politica ogni volta che accede ad un Web server
sicuro. Questa eventualità è di fatto estremamente remota in condizioni normali,
perché significherebbe leggere ogni volta un documento lungo almeno 10 pagine,
scritto in un linguaggio poco formalizzato, relativamente complesso e comprensibile
esclusivamente da esseri umani (anche se sono stati fatti vari tentativi per
standardizzarlo e quindi per automatizzarne la lettura).
44
3.1 LDAP Introduzione
Abbiamo visto che una PKI si occupa della gestione di una grande quantità di
informazioni particolarmente riservate e delicate: per poterle organizzare ha, quindi,
bisogno di un database; un database classico, però, non sarebbe di molta utilità, in
quanto dotato essenzialmente di una struttura centralizzata, mentre servirebbe un
database distribuito.
Una directory è, essenzialmente, un database specializzato e ottimizzato per la
lettura, la visualizzazione e la ricerca di dati memorizzati sottoforma di file. Le directory
contengono informazioni descrittive basate su attributi e, sfruttando questi, supportano
sofisticate funzioni di filtraggio, ma generalmente non possono gestire transazioni
complicate o schemi di rollback come quelli che sono all’ordine del giorno nei DBMS
(DataBase Management System), progettati, invece, per gestire grandi volumi di dati
sui quali eseguire complicati aggiornamenti e selezioni multiple. Gli aggiornamenti in
un file system sono tipicamente cambiamenti «tutto o niente» e la struttura delle
directory è stata appositamente pensata per fornire risposte veloci in seguito ad
operazioni di ricerca riguardanti anche grandi volumi di dati; esse permettono di
replicare informazioni ad ampio raggio, per aumentarne la disponibilità (information
sharing) e l’affidabilità (backup), riducendo nel contempo i tempi di risposta.
Ci sono molti modi differenti per fornire un servizio basato sulle directory; alcuni
permettono di immagazzinare nelle directory differenti tipi di informazione, stabilire
differenti requisiti su come tali informazioni possono essere referenziate, interrogate ed
aggiornate, come possono essere protette da accessi non autorizzati ecc. Alcuni di
questi servizi sono locali, dal momento che riguardano un contesto ristretto, mentre
altri sono globali, riguardando un contesto di gran lunga più vasto (ad esempio l’intera
rete Internet): i servizi globali sono generalmente distribuiti, il che significa che i dati
che contengono sono sparsi su diverse macchine, tutte cooperanti per fornire il servizio
nella sua interezza; il Domain Name System (DNS) di Internet è un esempio di servizio
basato su directory, ma distribuito su scala globale.
Un possibile modello globale basato su directory è LDAP (Lightweight Directory
Access Protocol): si tratta di un protocollo di accesso alle directory che si basa sul
TCP/IP e fu concepito inizialmente dai ricercatori dell’Università del Michigan.
Il modello di organizzazione delle informazioni è basato sulle «entry», attributi
che possiedono un Distinguished Name (DN) unico a livello globale usato per riferirsi
45
ad ogni entry in modo non ambiguo. Ogni entry possiede un tipo e uno o più valori: i tipi
sono generalmente mnemonici come «cn» (common name), oppure «mail» (indirizzi e-
mail), mentre la sintassi dei valori dipende dal tipo. Per esempio, l’entry cn può avere il
valore «Salvatore Iacometta», mentre mail può contenere il valore
«[email protected]» e jpegPhoto contiene obbligatoriamente una immagine
nel formato binario JPEG.
In LDAP, le entry delle directory sono organizzate in una struttura gerarchica ad
albero; tradizionalmente, questa struttura riflette quella geografica o organizzativa: le
entry rappresentanti Federazioni di Stati compaiono al livello radice, seguite dalle entry
rappresentanti Stati ed organizzazioni nazionali; proseguendo si trovano le entry che
rappresentano aziende, poi via via le unità organizzative, poi persone, stampanti,
documenti e qualsiasi altra entità del mondo informatico.
L’albero può essere anche strutturato sui nomi di domini Internet: questo
approccio sta diventando sempre più popolare, perché permette di localizzare i servizi
basati su directory usando il DNS (Domain Name System).
Una entry viene riferita attraverso il suo DN (Distinguished Name), che è
costruito prendendo il nome stesso della entry (chiamato RDN = Relative Distinguished
Name) e concatenandogli i nomi delle entry sue genitrici.
LDAP definisce operazioni per interrogare e aggiornare la directory: ci sono
operazioni per aggiungere e rimuovere una entry dalla directory, per cambiarne una
esistente e per cambiarne il nome. La maggior parte del tempo, comunque, LDAP è
usato per cercare informazioni in una directory: le sue operazioni di ricerca permettono
di cercare, in precise porzioni della directory, entry che rispettino determinati criteri
specificati da un filtro di ricerca, dopodiché si possono richiedere informazioni da una
qualsiasi delle entry che rispetti i criteri. Alcuni servizi basati su directory non
forniscono protezione, permettendo a chiunque di accedere alle informazioni; LDAP,
invece, fornisce meccanismi che permettono ad un utente di autenticarsi o comunque
di provare la propria identità, trovando così il modo di proteggere, attraverso un ricco
controllo dell’accesso, le informazioni contenute dal server. LDAP supporta anche
servizi di sicurezza che garantiscono privacy ed integrità.
Il servizio basato su directory LDAP ha una architettura client/server: uno o più
server LDAP contengono i dati che costituiscono l’albero di directory e un client può
connettersi ad un server LDAP per porgli una domanda; il server risponde inviando una
risposta e/o un puntatore verso risorse dalle quali il client potrebbe ottenere
46
informazioni addizionali (si tratta generalmente di un altro server LDAP). Non ha
importanza a quale server LDAP un client si connette, perché egli ha sempre la
medesima visuale della directory: un nome presentato come criterio di ricerca ad un
particolare server LDAP produce gli stessi risultati che si sarebbero ottenuti da un altro
server, perché referenzia comunque la stessa entry. Questa caratteristica riveste una
grande importanza, specie in un servizio globale basato su directory come LDAP.
Tecnicamente, LDAP è un protocollo di accesso ad un servizio di directory
X.500 (il servizio di directory OSI) e inizialmente i server erano Gateway tra LDAP e il
Directory Access Protocol (DAP) X.500.
DAP è un protocollo piuttosto pesante che opera al di sopra di uno stack di
protocolli OSI completo e richiede una significativa quantità di risorse computazionali.
Invece LDAP è progettato per operare su TCP/IP e fornisce molte delle funzionalità
DAP ad un costo molto minore. L’utilizzo di LDAP rende semplice accedere ad una
directory X.500, ma richiede ancora un servizio X.500 completo per fornire tutte le
funzionalità garantite da DAP.
Una directory, nella terminologia X.500, è una speciale forma di database
progettata per essere particolarmente adatta per l’uso su Internet ed altri sistemi
distribuiti e il DAP è uno dei quattro protocolli definiti dallo standard X.500 per
supportare servizi di directory aperti e standardizzati.
L’LDAP, come si è avuto modo di dire, semplifica l’accesso ai servizi della
directory modellati nello standard X.500 e ha funzionalità simili al DAP operando
direttamente sopra il TCP/IP, ma la «leggerezza» del protocollo LDAP viene realizzata
rimuovendo alcune delle caratteristiche definite in X.500 e, di conseguenza, le directory
LDAP non supportano funzionalità che sono molto importanti in un ambiente con
directory distribuite, come quello di una interconnessione tra directory server e duplicati
online. Un ulteriore inconveniente del protocollo LDAP è quello del processo di replica
delle informazioni tra una directory LDAP e una DAP (problema di migrazione dei
database): fino a quando i server con directory LDAP non supporteranno il protocollo
DISP (Directory Information Shadowing Protocol), la replica dovrà essere fatta usando
essenzialmente un processo manuale, anche se alcuni aspetti possono essere
automatizzati. La replica manuale è realizzata attraverso una serie di aggiornamenti
incrementali che contengono solo i cambiamenti avvenuti a partire dall’ultimo update,
seguiti ciclicamente da un aggiornamento completo, per assicurare che tutti i
47
cambiamenti siano inclusi: per ora si tratta di una serie di copie multiple (di un
certificato, nel caso di una PKI) scritte sulla directory.
L’IETF (Internet Engineering Task Force) sta correntemente lavorando su un
progetto per la replica delle informazioni tra server LDAP: lo standard proposto è noto
come LDAP Duplication-Replication/Update Protocols (LDUP).
3.2 LDAP in dettaglio
Dopo aver spiegato in modo generico cosa è e a cosa serve LDAP, possiamo
ora entrare più in dettaglio introducendo qualche informazione tecnica:
possiamo dire che LDAP è un protocollo per far comunicare più computer con un
directory server. Viene definito nelle rfc (Requests For Comments, documentazione
tecnica di Internet) 1777 e 2251. Ldap è stato disegnato per permettere un accesso
leggero ad alberi derivati da directory X.500 OSI Directory Access
3.2.1 Cosa è una directory
E' una collezione gerarchica di oggetti e di diritti associati agli oggetti stessi, un
po' come le directory di un filesystem.
Non è una base di dati intesa come sql. In sql i dati sono organizzati in tabelle, in ldap i
dati sono organizzati in una struttura ad albero.
3.2.2 Differenze tra ldap e database relazionali
Ldap è stato progettato per basi di dati che devono essere letti spesso e
aggiornati meno frequentemente. E' quindi ottimizzato per permettere letture veloci,
anche a discapito della velocità di scrittura.
I dati sono organizzati in una struttura gerarchica e non in tabelle.
48
3.2.3 Differenze tra ldap e X.500
Programmi basati su X.500 erano particolarmente pesanti e consumavano molte
risorse ed erano quindi inadatti all'esecuzione su macchine client.
Ldap mantiene le stesse caratteristiche principali, si basa su tcp/ip invece che sullo
stack osi, tutti i dati sono stringhe e non binari.
IETF prevede per ldap in più rispetto ad X.500 la replicazione multimaster.
Esempio di directory
dc=crotone,dc=calabria,dc=it
3.2.4 La radice dell'albero
Nel corso degli anni ci sono state evoluzioni dell'ldap e la radice può essere
specificata in più modi:
o=gruppostudenti, c=IT (X.500)
dc=crotone.calabria.it
dc=crotone,dc=calabria,dc=it (rfc 2247)
La terza formulazione riflette la struttura dei dns, con tutti i vantaggi che ne
conseguono.
3.2.5 Organizational Unit
Sono i nodi interni dell'albero ldap. Permettono una divisione in sottoparti dei
dati raggruppandoli in gruppi logici.
La divisione dei dati in ou permette di restringere le ricerche a sottoporzioni
dell'albero, diminuendo quindi i tempi di ricerca.
49
Tutti i dati e gli oggetti che compongono l'albero ldap vengono descritti dagli
schemi, in cui per ogni oggetto vengono definiti i campi che lo compongono e i tipi dei
dati.
Per aumentare gli oggetti salvabili all'interno degli alberi ldap è necessario
includere gli schemi necessari.
3.2.6 I backend
Openldap può salvare i dati in molti formati. I più importanti sono:
- ldbm (formato predefinito, basato su bdb)
- bdb (vecchio formato basato su bdb)
- ldap (il server funziona in modalità proxy)
- sql (serve come gateway tra applicazioni e db)
3.2.7 Creare gli indici
Gli indici vengono definiti nel file slapd.conf:
index objectClass eq index mail,mailAlternateAddress,uid eq index givenName,sn eq
index uidNumber,gidNumber eq
Dopo averli dichiarati gli indici devono essere creati col comando slapindex,
ricordandosi prima di fermare il server ldap.
3.2.8 Access control list
L'accesso ai dati può essere ristretto ad un particolare insieme di utenti, e si
può limitare l'accesso in lettura e scrittura alle porzioni dell'albero.
access to attribute=userPassword by dn="cn=admin,dc=salvatore,dc=crotone,dc=it"
write by anonymous auth by self write by * none
50
3.2.9 Replica
Openldap prevede due demoni slapd e slurpd. Il primo è il demone del server
ldap, mentre il secondo è il demone di replicazione. Si occupa di inoltrare le modifiche
dell'albero a tutti i server di replica.
In caso di interruzione della connettività tra master e slave le modifiche vengono
cachate per essere poi inoltrare al ripristino della stessa.
Esempio di replica
Configurazione della replica sul server di backup
rootdn "cn=admin,dc=qualcosa" rootpw "passwordcopia"
updatedn "cn=admin,dc=qualcosa" updateref "ldap://serveroriginale"
Configurazione della replica sul master
replogfile /var/lib/ldap/replog
replica host=servercopia:389 binddn="cn=admin,dc=qualcosa" bindmethod=simple
credentials=passwordcopia
Replica multimaster
51
Sebbene le rfc di ldap prevedano la replica multimaster, questa è implementata ma
non supportata da openldap.
Il codice c'è, si può abilitare, ma gli sviluppatori ne sconsigliano l'uso perché
potrebbero esserci dei rischi di corruzione dei dati.
3.2.10 Integrazione di ldap
Ldap può essere integrato con molti servizi per permettere una loro gestione
centralizzata:●
posta (postfix, courier-imap, pop3, squirrelmail e openwebmail)●
web server (libapache-auth-ldap)●
ssh●
server ftp (proftpd-ldap)●
application server (zope-ldapuserfolder)●
client (samba e pam)
3.2.11 Il pacchetto ldap-utils
Contiene tutti i programmi base per la gestione dell'albero ldap.
I programmi devono essere configurati con il file /etc/ldap/ldap.conf, in cui si
specificano l'indirizzo del server ldap e il suffisso.
Il pacchetto contiene ad es. ldapsearch:
è il programma base con cui fare le interrogazioni all'albero.
Per vedere il contenuto di tutto l'albero si usa il comando
Ldapsearch –x -D»cn=admin,dc=salvatore,dc=crotone,dc=it» -W objectclass=*
Opzioni di ldapsearch
52
-x implica l'uso dell'autenticazione semplice (al posto di sasl)
-D è il binddn (se omesso la connessione è di tipo anonimo)
-W richiede la password da riga di comando
objectclass=* richiede di mostrare gli oggetti di tutte le classi.
3.2.12 Supporto della crittografia
Per permettere una consultazione sicura dei dati contenuti all'interno di un
albero ldap è possibile utilizzare la crittografia.
Openldap supporta:
- ssl v3
- tls v1
- sasl
3.2.13 Strumenti di amministrazione
I programmi del pacchetto di ldap-utils sono utili ma non intuitivi. Ci sono un paio di
programmi interessanti:
- gq è un client basato su gtk 1
- phpldapadmin è un programma scritto in php che gira su apache dall'interfaccia
molto intuitiva.
Tramite phpldapadmin si possono importare dei file con estensione “ldif” con contenuti
simili a ciò che segue:
dn: cn=Iacometta,dc=my-domain,dc=com
cn: Iacometta
sn: Iacometta
53
objectClass: top
objectClass: person
3.2.14 Integrazione di ldap sui client
Ldap non prevede l'uso esclusivo sul lato server. Può essere usato anche sui
client per la gestione delle rubriche (netscape e mozilla) e dei bookmarks (netscape).
55
4.1 I Web services
In questo periodo si fa un gran parlare dei Web Services che sembra
diventeranno la nuova frontiera del Web. Attorno ruotano molti termini nuovi come
SOAP, WSDL, UDDI. Al di là di queste parole i Web Services sono però
semplicemente un sistema standardizzato per scambiare dati fra applicazioni e per
l'uso di procedure in remoto da parte di altri programmi.
Mentre i siti Web sono costruiti fondamentalmente per condividere informazioni
tra le persone e sono pensati per essere visualizzati con un browser, i Web Services
sono invece costruiti per lo scambio e la condivisione di dati tra programmi. Il modo in
cui i dati saranno visualizzati non ha niente a che fare con i Web Services, sarà
compito del programmatore mostrarli sul browser, stamparli o manipolarli come meglio
crede.
Semplificando un po' possiamo affermare che non è niente di così
rivoluzionario, le stesse cose che si fanno con i Web Services le facciamo già da
qualche tempo, anche se non le chiamiamo così.
Quando interroghiamo la Banca per verificare che un numero di carta di credito
sia valido è un simile ad usare un Web Services. Stessa cosa quando facciamo il
parsing di una pagina con gli orari dei treni per poi visualizzarli sul nostro sito, o ancora
quando ci mettiamo d’accordo con un sito d’informazioni per poterle pubblicare anche
sul nostro. TCP/IP e HTTP sono sempre alla base di tutto e con i Web Services è la
stessa cosa.
Qual è allora la differenza? La differenza è che adesso non esiste un modo
standard per effettuare tutte queste operazioni. Dobbiamo sempre accordarci su come
scambiare i dati, su come chiamare la pagina remota e se passare i parametri via URL
(Get) o via Form (Post). Magari poi capita che il sito remoto cambi il lay-out della
pagina ed a noi tocca rifare tutto il parser.
Se poi vogliamo utilizzare servizi messi a disposizione da più siti per incorporarli
nel nostro, ogni volta dobbiamo scrivere qualcosa di completamente diverso.
Con i Web Services, invece, abbiamo un file che descrive le operazioni
supportate dal Web Service, i parametri richiesti per funzionare ed il tipo di dati che
vengono restituiti. Questi sono i file WSDL (Web Services Description Language).
Normali file XML che possono essere chiamati direttamente dal browser in modo da
56
visualizzare la descrizione della struttura delle interfacce di chiamata e risposta.
Provate a visualizzare quello di Google andando qui:
http://api.google.com/GoogleSearch.wsdl
Poi abbiamo SOAP, uno standard per definire come i dati devono essere
incapsulati e strutturati.
Infine, troviamo UDDI che in pratica sono una serie di specifiche per creare un
motore di ricerca per Web Services.
Conoscere nel dettaglio questi protocolli e specifiche non è necessario. Usare i Web
Services, è molto più semplice di quello che sembra.
4.2 Motori di ricerca per Web services
Abbiamo parlato fino ad ora di Web services, ma non sappiamo se ne esistono,
cosa fanno, dove trovarli e se sono gratis. Dunque come per tutte le cose esistono dei
motori di ricerca per Web services. Ad esempio http://uddi.microsoft.com oppure
http://www-3.ibm.com/services/uddi/ o ancora www.xmethods.net o
www.salcentral.com.
4.3 Un po’ di esempi
Sono stati raccolti un po’ di esempi per fare un po’ di chiarezza sulla
realizzazione e sull’uso dei Web Services.
Da questo momento in poi il linguaggio di programmazione che utilizzeremo per
la realizzazione delle nostre applicazioni sarà PHP.
4.3.1 Un primo esempio: un traduttore Inglese-Italiano
Il primo esempio che vedremo è un Web services che consente di tradurre un
documento da una lingua all'altra in modo automatico. Passeremo al servizio la stringa
da tradurre, il linguaggio da utilizzare per la traduzione, ed il gioco è fatto! Se avessimo
dovuto scrivere noi un'applicazione del genere, senza utilizzare un Web services,
avremmo dovuto raccogliere i dati dei vocabolari e scrivere gli algoritmi di traduzione,
57
invece in questo modo possiamo semplicemente invocare un Web services che fa il
lavoro per noi, e potremo offrire ai visitatori del nostro sito un servizio di traduzione
simultanea.
Vediamo come funziona:
<?
require_once('nusoap/nusoap.php');
$parameters = array(
"translationmode"=>"en_it",
"sourcedata" =>"Hello World - this is Italian"
);
$soapclient = new soapclient
('http://www.xmethods.net/sd/2001
/BabelFishService.wsdl','wsdl');
$result = $soapclient->call('BabelFish',$parameters);
print "$result";
?>
La prima riga è fondamentale. Abbiamo detto che il linguaggio che utilizziamo
deve avere come unico requisito quello di essere compatibile con SOAP.
Una volta inclusa nusoap.php abbiamo definito i parametri dal passare al Web
services. Lo abbiamo fatto per comodità utilizzando un array. I due parametri sono
"translationmode" e "sourcedata", rispettivamente contengono il tipo di traduzione che
deve essere effettuata e la stringa da tradurre.
Infine instanziamo un oggetto di tipo soapclient con la riga
$soapclient = new soapclient
('http://www.xmethods.net/
sd/2001/BabelFishService.wsdl','wsdl');
e richiamiamo la funzione BabelFish del Web services passandogli i parametri definiti
sopra.
Il Web Services esporrà il risultato della funzione BabelFish nella variabile
$result che noi prontamente stamperemo a video tramite un print. Ovviamente quello
che vedremo è la nostra stringa tradotta dall'inglese all'italiano. Pensate se avessimo
58
dovuto implementare noi il servizio di traduzione per i nostri clienti! Usando un Web
services possiamo scrivere applicazioni potenti, servendoci del lavoro che altri ci hanno
messo a disposizione. A nostra volta scrivendo le nostre applicazioni, esponendo dei
Web services, potremo contribuire al lavoro di altri.
4.3.2 I parametri che si devono passare: UDDI
E’ stato dato per scontato:
1)Di conoscere l'indirizzo del Web services da richiamare
2)Di sapere quali parametri passargli
3)Di sapere quale funzione richiamare per la traduzione.
Queste informazioni sono note perché è stato usato UDDI per trovare il Web services.
UDDI pubblica:
1)L'indirizzo del Web services da richiamare
2)Una breve descrizione del suo funzionamento (opzionale)
3)Le funzioni esposte (opzionale)
4)I parametri da passare (opzionale)
Esporre un Web services significa anche corredarlo di un file in formato WSDL
che ne descrive in XML perfettamente il funzionamento. Per cui se proprio ci sono
dubbi su come funziona il Web services che è stato trovato, basta dare uno sguardo al
file WSDL che lo descrive e se ne saprà di più. Anche WSDL (come tutto il resto
quando si parla di Web Services) è uno standard. L'acronimo di WSDL è Web Services
Description Language.
59
4.3.3 Le informazioni in XML scambiate
Come già detto ci pensa SOAP a trasformare la nostra richiesta in una richiesta
XML compatibile. Ovviamente anche per SOAP esiste un sito ufficiale che descrive il
protocollo http://www.w3.org/TR/SOAP/.
Quali sono state le informazioni in formato XML che si sono scambiati client e
server? Aggiungendo un paio di righe al codice:
echo 'Request: <xmp>'.$soapclient->request.'</xmp>';
echo 'Response: <xmp>'.$soapclient->response.'</xmp>';
chiediamo che vengano stampate in chiaro la richiesta effettuata dal client e la risposta
data dal server.
Si potrà notare che la richiesta e la risposta sono state effettuate entrambe in
formato XML. Usando SOAP ad un livello più alto, poco ci importa di come siano
composte domande e risposte (a meno che non stiamo facendo il debug
dell'applicazione). L'importante è sapere che questo modo di scambiarsi i dati, ci astrae
totalmente dal conoscere i dettagli di come è implementato il Web services dal lato
server. Non sapremo mai cosa fa per tradurre la nostra stringa , ne su che architettura
gira, non dovremo preoccuparci di niente, se non di passargli i dati corretti, per il resto
ce la caveremo con un semplice print $return.
4.3.4 Un secondo esempio: la jpg di un codice a barre
Questo secondo esempio invia ad un Web services un numero e ottiene come
risposta un'immagine che rappresenta il codice a barre di quel numero. Vediamo come
funziona
<?php
require_once('nusoap/nusoap.php');
$parameters = array(
"username" =>"any",
60
"password" =>"any",
"num" =>"123456",
"imgtype" =>"JPG"
);
$soapclient = new soapclient('http://www.flash-db.com
/services/ws/barCodes.wsdl', 'wsdl');
$barCodeHex = $soapclient->call('doBarCodes',$parameters);
if ($imgtype == "jpg") {
header("Content-type: image/jpg");
} else {
header("Content-type: image/png");
}
$binaryBarCode = base64_decode($barCodeHex);
print $binaryBarCode;
?>
In questo caso la tecnica è assolutamente identica a quella usata in
precedenza.
A seconda di come il Web services è stato implementato, potrebbe avere
bisogno di qualche parametro in più o in meno (occorre leggere sempre bene la
documentazione relativa al Web services e se è il caso, il suo file wsdl). Il metodo Call
dell'oggetto soapclient ha due parametri obbligatori e tre opzionali. I due obbligatori
sono il nome della funzione da richiamare è un array di parametri, opzionalmente
possono seguire il namespace, la SOAPaction, e un array di headers.
4.3.5 Dal Client al Server: creare un Web Services
Se normalmente si inizia con il “lato” client, per scoprire come funziona il
meccanismo e per scovare web services interessanti, il successivo passo logico è
scrivere un proprio web services e, magari, pubblicarlo.
Creiamo un Web services che mette a disposizione un servizio che determina
se l’indirizzo di un sito Web, che gli passiamo come variabile, esiste o no.
Partiamo subito con un esempio di codice:
61
“checkdomain.php”
ed è possibile visualizzare il listato completo nell’Appendice D:
“D.1.1 checkdomain.php”
Si può notare, analizzando il listato, che viene inclusa, ovviamente, l'onnipresente
libreria nusoap.php
Viene inizializzato un nuovo oggetto di tipo soap_server.
Viene registrata la funzione selectomaincheck che è quella esportata dal Web services.
Infine il metodo service è quello che fisicamente invia la risposta al client.
Il nostro primo Web services è terminato: completo, operativo e funzionante!
Ritorniamo al client.
Il client che usa questo Web services è il seguente( il seguente esempio va salvato con
il seguente nome: controlladominio.php ):
<?php
require_once('nusoap/nusoap.php');
$parameters = array(
"domain" =>"salvatoreiacometta",
"domainextension" =>".it"
);
$soapclient = new soapclient('http://il-nostro-webservices/checkdomain.php');
$result = $soapclient->call('selectdomaincheck',$parameters);
print $result;
?>
Questa funzione del Web services ci restituisce “0” se il dominio che gli
passiamo, esiste, mentre ci restituirà “1” altrimenti.
Salvando il precedente file (checkdomain.php) sul server da noi realizzato e il
file controlladominio.php su un qualunque sito dal quale vogliamo usufruire del servizio
messo a disposizione dal nostro Web services, caricando la pagina
controlladominio.php, otterremo la risposta del Web services.
62
4.3.6 Un altro esempio: Il codice in PHP per interrogare Google
Il Web services di Google mette a disposizione una funzione grazie alla quale,
passandogli una chiave di ricerca (tramite la variabile 'q'), restituisce un array con gli
indirizzi dei siti che contengono la chiave specificata.
Possiamo, cioè, “inglobare” in un nostro sito il motore di ricerca di Google e
metterlo a disposizione ai nostri visitatori.
C’è qualche piccola restrizione: ad es. non si possono fare più di 1000 richieste
al giorno e l’array non può contenere più di 10 indirizzi di siti.
Nell’Appendice D è possibile trovare il “Codice in PHP per interrogare il Web
services di Google”.
64
5.1 Come iniziare
Dopo essermi documentato, ho ritenuto opportuno testare personalmente tutto
ciò che riguarda questi argomenti per fare poi delle applicazioni pratiche.
L’azienda per la quale lavoro come analista programmatore, mi ha dato la
possibilità di utilizzare una macchina alla quale è stato assegnato un indirizzo pubblico
(raggiungibile anche dall’esterno) sulla quale fare delle prove.
Ho installato Linux (Debian 30R2) e poi ho proceduto come descritto
nell’Appendice C al paragrafo 1: “Installare e configurare MySQL, Apache con SSL,
PHP, LDAP”.
In questa procedura è interessante sottolineare il fatto che non sono state usate
le locazioni standard che vengono proposte quando si installa qualche pacchetto, ma
sono state definite dei percorsi per ogni pacchetto da installare.
L’unica accortezza che bisogna avere è che durante l’installazione di un
pacchetto che richiede altri pacchetti, si deve specificare esplicitamente il percorso.
5.2 procedura per auto-certificare il server, per creare certificati-client e perriconoscere altri certificati-client
Nell’Appendice C al paragrafo 2 “Generazione dei certificati” è possibile trovare
la procedura per creare un certificato per il server appena realizzato , la procedura per
creare certificati per i clienti e quella per considerare validi i certificati-client rilasciati da
altre CA.
Una volta seguita la procedura che ci permette di generare un certificato-server
e dopo averlo installato sul nostro server, questo certificato ci viene esibito ogni volta
che effettuiamo una connessione di tipo “https”.
Sul browser “Internet Explorer” è possibile visualizzare questo certificato
cliccando sul lucchetto in basso a destra.
Per quanto riguarda i certificati-client, dopo aver eseguito la procedura per
crearne uno e una volta installato sul client, sarà possibile visualizzarlo semplicemente
andando sul browser (da es. Internet Explorer) nel menu
65
strumenti opzioni Internet contenuto certificati
Di seguito le informazioni generali del certificato-client:
e il dettaglio:
66
5.3 Cosa abbiamo ottenutoUna volta che avremo seguito le istruzioni contenute nei precedenti due
paragrafi, avremo ottenuto un Web server che supporta il protocollo https.
Questo vuol dire che, aprendo il nostro browser e digitando
http://81.118.52.132/
(dove 81.118.52.132 è l’indirizzo IP pubblico assegnato al server), verrà visualizzata la
pagina di default (ad es. index.html) che si trova nella cartella
“/usr/www/htdocs_senza_crittografia/”,
mentre digitando
https://81.118.52.132/
verrà visualizzata la pagina di default (ad es. index.html) che si trova nella cartella
“/usr/www/htdocs_con_crittografia/”.
Entrando un po’ di più nel dettaglio, si può affermare che la crittografia SSL
nell'ambito del protocollo HTML, viene applicata utilizzando una porta diversa da quella
standard. Di solito si tratta del numero 443, a cui si abbina la definizione ‘https’, mentre
sappiamo che la porta che in genere viene usata (‘http’) è la 80.
Inoltre, con questo tipo di installazione, visto che abbiamo installato PHP, sarà
ovviamente possibile realizzare pagine non solo .html ma anche .php.
E’ stato installato anche MySql, che non verrà utilizzato perché abbiamo
installato anche LDAP e quindi ogni informazione verrà archiviata tramite strutture
gerarchiche.
Personalmente in questo lavoro ho utilizzato MySql soltanto per immagazzinare
informazioni relative ai visitatori di questo server.
Infatti all’inizio di alcune pagine, ho incluso il seguente codice:
<? include ("connmysql.php");?>
<?
$ip=getip();
$host=gethostbyaddr($ip);
$pagina='index.php di http';
$query ="insert into visite (ip,host,data_visita,pagina) values ('$ip',
'$host', now(),'$pagina')" ;
$risultato=mysql_query( $query, $csql );
?>
67
cioè si inseriscono nella tabella “visite” l’ip e l’host del visitatore per avere la “storia”
delle visite.
Di “ PhpLDAPadmin” si è fatto, invece, un uso più intensivo.
Ricordo che PhpLDAPadmin è un browser LDAP scritto interamente in PHP, per
gestire un LDAP Server.
Tramite questo strumento sono stati creati dei profili, sono stati aggiunti,
modificati, cancellati degli attributi, ecc…
5.3.1 “Over https”
Vediamo cosa succede se scriviamo nel browser
https://81.118.52.132/
La prima cosa che potremo notare è la comparsa di questo avviso:
che ci garantisce che “navigando over https”, le informazioni scambiate con il sito non
possono essere visualizzate da altri utenti via Web.
Cliccando su “Ulteriori informazioni”, si legge che “…questo sito Web fornisce
una comunicazione protetta e dispone di un certificato valido. Comunicazione protetta
significa che le informazioni inviate al sito, quali il nome o il numero di carta di credito,
sono crittografate in modo da non poter essere lette o intercettate da altre persone. Il
certificato è una dichiarazione che garantisce la protezione di un sito Web. Un
certificato contiene informazioni che garantiscono che un sito Web è attendibile e che
nessun altro sito può assumere la sua identità. ”
Cliccando su OK, comparirà questa finestra:
68
Tramite questa finestra il client potrà scegliere quale dei suoi certificati-client in
suo possesso potrà esibire al server al quale si sta connettendo.
Si ricorda che il "certificato personale" attesta l'identità dell'utente. Questi dati
vengono utilizzati quando l'utente invia informazioni personali su Internet a un sito Web
che richiede un certificato attestante l'identità dell'utente. È possibile controllare
l'utilizzo che può essere fatto della propria identità tramite una chiave privata, che solo
l'utente conosce e che si trova esclusivamente nel suo computer.
Cliccando su “Ulteriori informazioni” si potrà leggere che “ Un certificato di
protezione, sia esso un certificato personale o un certificato di un sito Web, associa
una "chiave pubblica" a un'identità. Solo il proprietario del certificato conosce la
corrispondente "chiave privata". La "chiave privata" consente al proprietario di creare
una "firma digitale" o di decrittare informazioni crittografate con la corrispondente
"chiave pubblica". Inviando il proprio certificato ad altri utenti, si invia in realtà la propria
chiave pubblica e si consente ad essi di trasmettere informazioni crittografate, che
potranno essere decodificate e lette solo con la propria chiave privata.”.
Cliccando su “Visualizza certificato…” sarà visibile il certificato in dettaglio come
visto nel paragrafo 5.2
Cliccando su OK comparirà un’altra finestra:
69
cioè un’applicazione (Internet Explorer) sta tentando di accedere a dei dati protetti (i
dati del nostro certificato-client) e perciò richiede all’utente la possibilità di accedere a
questi dati.
Continuiamo cliccando su OK. Comparirà quest’altra finestra:
Qui ci sono dei messaggi di avviso.
Il primo ci informa che la società che ha rilasciato il certificato al server che
stiamo per visitare non è attendibile. Infatti bisogna tenere presente che il nostro server
è stato “auto-certificato”, cioè la società che lo ha certificato (il server stesso !) è
evidentemente non riconosciuta dal nostro browser (Internet Explorer). Per fare in
modo che questo primo messaggio di errore non compaia più, occorre installare sul
client con il quale stiamo navigando, il certificato della società che certificato il nostro
server (cioè il certificato del server stesso!).
Il secondo ci dice che il certificato-server non è scaduto.
Il terzo ci dice che il nome del certificato non coincide con il nome del sito. Infatti
il sito è “81.118.52.132” (il mio server non ha un DNS, cioè non ha un nominativo
alfabetico), mentre il nome del certificato è “CERT SITO CIOCCOLATO E AFFINI”.
70
Il primo è il terzo messaggio, comunque, non ci impediscono di continuare la
navigazione.
Cliccando su OK, finalmente siamo in grado di visualizzare la pagina richiesta.
In basso a destra (almeno nel browser Internet Explorer), compare il “rassicurante”
lucchetto:
Facendo doppio click sul lucchetto è possibile visualizzare il certificato-server.
Qui cliccando su “Installa certificato…” possiamo installare il certificato sul client e
quindi considerarlo attendibile in futuro.
Si ricorda che il certificato-server garantisce che nessun altro sito Web possa
assumere l'identità del sito originale.
Infine, se abbandoniamo la connessione sicura (cioè ci spostiamo da https a
http), il browser ci avvisa con il seguente messaggio:
71
cioè il sito Web al quale si desidera accedere non utilizza un protocollo di protezione e
le informazioni inviate e ricevute non saranno protette. Il sito non dispone di un
certificato e non è possibile verificarne l'identità.
5.4 Proviamo a fare dei testOra che abbiamo visto in pratica cosa succede, proviamo a fare qualche
variazione.
5.4.1 Modifichiamo il file di configurazione
Proviamo a modificare leggermente il file di configurazione di Apache.
Ricordo che con il tipo di installazione vista nei precedenti paragrafi, il file di
configurazione si trova nel seguente percorso:
/usr/www/conf/httpd.conf
Cerchiamo la riga
SSLVerifyClient……
Modificando questa riga è possibile scegliere se rendere obbligatorio o opzionale la
verifica del certificato-client.
Scriviamo
SSLVerifyClient optional
e riavviamo il server.
Ora proviamo ad andare di nuovo con il browser su
https://81.118.52.132/
E’ immediato constatare che anche se ora il client non esibisce nessun certificato, avrà
ugualmente la possibilità di visualizzare le pagine che si trovano in
“/usr/www/htdocs_con_crittografia/”.
Se, invece, scriviamo
SSLVerifyClient require
E riavviamo il server, se il client non esibisce un certificato-client valido, non avrà la
possibilità di visualizzare nessuna pagina !
72
5.4.2 Prelevare con PHP i dati del certificato
Ora che siamo su una connessione protetta e abbiamo la certezza che il client
ha esibito un certificato-client valido, può essere interessante sapere come prelevare i
dati del suo certificato e utilizzarli per un qualunque scopo (fare delle ricerche su un
data base, immagazzinarli per scopi futuri, ecc…).
Ci sono delle semplici istruzioni in PHP che ci permettono di fare questo:
<?php
//----------------- DATI CERTIFICATO CLIENT -----------------------------
$sslversion = getenv("SSL_VERSION_LIBRARY"); //SSL Version used
$sslcaname = getenv("SSL_CLIENT_I_DN_CN"); //Your Certificate are signed by
$sslusername = getenv("SSL_CLIENT_S_DN_CN"); //Your Name
$ssluserdetails = getenv("SSL_CLIENT_S_DN"); //Your Certificate details
$sslexpire = getenv("SSL_CLIENT_V_END"); //Your Certificate will expire on
//----------------------------------------------------------------------------
-----------
?>
Ad esempio nella variabile “$sslusername ” troveremo il CN (Common Name) del
certificato-client esibito, in “$sslexpire ” la data di scadenza, ecc…
5.4.3 L’uso di uno “Sniffer”
Una ultima considerazione su questo test si può fare utilizzando uno “sniffer” ,
cioè un programma che analizza e monitorizza il traffico di rete.
Se si avvia lo sniffer durante una normale connessione (cioè “over
http”),qualunque dato il client invia al server, compare in chiaro nei pacchetti e quindi
può essere banalmente letto e utilizzato per “svariati” scopi.
Nell’Appendice B al paragrafo “B.2 Una semplice osservazione sulla
connessione sicura”, lo sniffer è stato avviato mentre ci si apprestava a consultare la
posta sul Provider “Libero”.
Se la stessa operazione si fa su una connessione sicura (“over https” ), il
contenuto dei pacchetti è crittografato e quindi illeggibile e, ormai lo sappiamo bene,
tutto ciò che il client cifra con la chiave pubblica del destinatario, il destinatario (server)
decifra con la propria chiave privata.
74
6.1 La mia scelta: Utilizzare NUSOAP e CURL
Per la mia tesi ho ritenuto opportuno orientarmi su strumenti utilizzabili con
PHP. Di seguito il dettaglio delle mie scelte.
6.1.1 Installare nusoap per applicazioni server-client SOAP in PHP
Come si è già detto, SOAP (Simple Object Access Protocol) e' un protocollo di
comunicazione basato su XML che permette lo scambio di informazioni tra programmi
scritti anche in linguaggi differenti.
Solitamente le informazioni relative a SOAP "viaggiano" sulla stessa porta
utilizzata dai server web (porta 80), per cui non e' necessario cambiare le impostazioni
dei firewall presenti sulla rete.
Nel caso generale, il sistema e' composto da un programma client che esegue
delle richieste SOAP e da un server che risponde alle richieste SOAP.
6.1.2 Cos’è NUSOAP
NUSOAP è un insieme di classi sviluppate da Dietrich Ayala's SOAPx4
(http://dietrich.ganx4.com/nusoap/). Esistono molte implementazioni di SOAP per PHP,
tuttavia nusoap sembra essere piuttosto affidabile e sta diventando nel tempo uno
standard di fatto.
Nusoap permette la costruzione di applicazioni server e client in PHP basate sul
protocollo SOAP.
Tramite nusoap e' possibile creare e utilizzare in modo facile e rapido delle
funzionalità utilizzabili mediante protocollo SOAP.
75
6.1.3 Come funziona PHP + NUSOAP
Nel caso di PHP + NUSOAP, il server viene implementato mediante l'utilizzo di
Apache Server e PHP a cui vengono aggiunte le funzionalità SOAP tramite la libreria
nusoap.
Nusoap consiste del file nusoap.php da importare negli script PHP che creano il
servizio lato server, e negli script che implementano (eventualmente) il lato client in
PHP.
Nusoap può essere scaricato dal sito
http://dietrich.ganx4.com/nusoap/
L'installazione di nusoap e' banale, in quanto consiste unicamente nella copia
del file scaricato in una directory scelta a piacere, ad esempio in /usr/www/strumenti e
nell'importazione del file stesso negli script PHP mediante l'istruzione
require_once('/var/www/strumenti/nusoap.php');
6.2 Un esempio banale: il web services che concatena due stringhe
Per cominciare a capire come realizzare praticamente un Web services,
occorre realizzare sia il file che viene utilizzato per invocare il Web services, sia il file
da caricare sul Web services e che viene richiamato da chi vuole usufruire dei servizi
messi a disposizione del Web Services.
Vogliamo realizzare un Web services che fornisce il servizio di
“concatenamento di due stringhe”, cioè riceve due stringhe e restituisce una stringa
composta dal concatenamento delle due (!).
Ovviamente è un servizio banalissimo, ma lo realizziamo semplicemente a
scopo didattico: i Web services in genere mettono a disposizione servizi molto più
complessi !
Di seguito il file da caricare su un sito dal quale si vuole richiamare il nostro
Web services:
76
"esempio-client.php"
<?php
require_once('./nusoap/nusoap.php');
$parameters = array(
"primo" =>"abcde",
"secondo" =>"fghil"
);
$soapclient = new soapclient('http://xx.xxx.xx.xxx/webservices/esempio-
server.php');
$result = $soapclient->call('esempio_funzione',$parameters);
echo 'Il risultato è : ';
print $result;
echo '<br>';
echo '----------------------------------------------------------------';
echo '----------------------------------------------------------------';
echo 'Request: <xmp>'.$soapclient->request.'</xmp>';
echo '----------------------------------------------------------------';
echo '----------------------------------------------------------------';
echo 'Response: <xmp>'.$soapclient->response.'</xmp>';
echo '----------------------------------------------------------------';
echo '----------------------------------------------------------------';
echo '----------------------------------------------------------------';
echo 'debug_str: <xmp>'.$soapclient->debug_str.'</xmp>';
echo '----------------------------------------------------------------';
echo '----------------------------------------------------------------';
?>
Si può notare che viene inclusa la libreria nusoap.
Le due stringhe che passeremo al Web services sono “primo” (abcde) e “secondo”
(fghil).
Nella variabile “$result” il Web services restituirà il risultato, cioè la
concatenazione delle due stringhe che “esempio-client.php” gli passa.
77
A scopo didattico abbiamo stampato a video (tramite una serie di “ echo ”) la
richiesta (request) e la risposta (response) (si potrà notare che è tutto in XML: merito di
NUSOAP).
La funzione che il Web services mette a disposizione si chiama
“esempio_funzione”.
Questa funzione si trova in:
“http://81.118.52.132/webservices/esempio-server.php”
Di seguito il file da caricare sul nostro Web services:
"esempio-server.php"
<?
function esempio_funzione ($primo,$secondo)
{
$risultato=$primo.$secondo;
return $risultato;
}
require_once('./nusoap/nusoap.php');
$server=new soap_server;
$server->register('esempio_funzione');
$server->service($HTTP_RAW_POST_DATA);
?>
E’ presente la funzione “esempio_funzione” che concatena le due stringhe
passate.
E’, inoltre, presente la onnipresente libreria NUSOAP.
Il risultato (il valore della funzione) viene restituito a chi ha invocato il Web
services.
Quindi, riassumendo, tramite "esempio-client.php" richiamiamo la function
“esempio_funzione” messa a disposizione dal Web services e gli passiamo:
"primo" =>"abcde",
"secondo" =>"fghil"
Il Web services ci restituirà : "abcdefghil"
78
6.3 Funzioni CURL, Client URL Library
Ho provato a realizzare l’esempio illustrato al Capitolo 4 relativo al paragrafo
“4.3.5 Dal Client al Server” (ricordiamo che il servizio offerto dal Web services così
realizzato, fornisce “0” se il dominio che gli passiamo esiste, “1” altrimenti).
Relativamente ai due file checkdomain.php e controlladominio.php, è stato
copiato il primo in
/usr/www/htdocs_senza_crittografia/checkdomain.php
dove “htdocs_senza_crittografia” è la cartella di default, del server che abbiamo
realizzato, raggiungibile tramite la porta 80, cioè tramite http,
e il secondo in
www.salvatoreiacometta.it/tesi/controlladominio.php
ed è stato constato che tutto funziona.
Quando, però si sposta il primo file in
/usr/www/htdocs_con_crittografia/checkdomain.php
(dove “htdocs_con_crittografia” è la cartella di default raggiungibile tramite la porta 443,
cioè tramite https)
il servizio non è più utilizzabile !
Infatti il problema è che per far viaggiare XML su https, occorre caricare una
libreria in PHP: Client URL Library.Ora il problema è che il PHP messo a disposizione da Aruba (dove risiede il sito
www.salvatoreiacometta.it) non ha queste librerie. Questo vuol dire che da
www.salvatoreiacometta.it/tesi non si possono fare chiamate tramite soap a un Web
79
services ATTRAVERSO HTTPS (cioè utilizzando curl ! ) ma si possono fare chiamate
tramite soap a un Web services solo attraverso HTTP.
Quindi per fare questa ulteriore prova (cioè richiamare una funzione di un Web
services attraverso https), si fa fungere il server da noi realizzato, sia da server Web
(che ospita la pagina che interroga il Web services) che da Web services stesso.
Ritornando alla Client URL Library, c’è da dire che PHP supporta libcurl, una libreria
creata da Daniel Stenberg, che permette di collegarsi e comunicare con parecchi tipi di
server e con parecchi tipi di protocolli. Libcurl al momento supporta i protocolli http,
https, ftp, gopher, telnet, dict, file, e ldap. libcurl supporta anche i certificati HTTPS,
HTTP POST, HTTP PUT, l'upload via FTP (questo può essere ottenuto anche con
l'estensione ftp di PHP), upload attraverso una form HTTP, proxy, cookie e
autenticazione con utente e password.
6.4 Un esempio completo: web services su https che interroga LDAP
Un esempio che abbraccia un po’ tutto quello che si è studiato fino ad ora è il
seguente:
Tramite il “Web-based LDAP browser” (l’applicazione in php per gestire LDAP
server) creiamo un utente che abbia come CN (common name) il CN del certificato-
client che abbiamo rilasciato al cliente.
Inoltre, l’attributo: “description” lo settiamo a “ABILITATO”.
Creiamo una funzione in PHP che effettua una ricerca in LDAP partendo da un
CN e restituisce il valore dell’attributo “description”.
Creiamo un file php che richiama questa funzione (messa a disposizione dal
nostro Web services) e, in base al valore dell’attributo “ description ” decide di far
proseguire o meno il client che si trova a visitare il sito.
Ovviamente questo file php deve essere salvato in
/usr/www/htdocs_con_crittografia/daticlient.php
altrimenti non sarà in grado di prelevare il CN del certificato-client.
80
Ecco il file “daticlient.php”:
<?phprequire_once('./nusoap/nusoap.php');
//----------------- DATI CERTIFICATO CLIENT -----------------------------$sslversion = getenv("SSL_VERSION_LIBRARY"); //SSL Version used$sslcaname = getenv("SSL_CLIENT_I_DN_CN"); //Your Certificate are signed by$sslusername = getenv("SSL_CLIENT_S_DN_CN"); //Your Name$ssluserdetails = getenv("SSL_CLIENT_S_DN"); //Your Certificate details$sslexpire = getenv("SSL_CLIENT_V_END"); //Your Certificate will expire on//---------------------------------------------------------------------------------------
$parameters = array( "CN" => $sslusername);
$soapclient = newsoapclient('https://81.118.52.132/webservices/restituisciclient.php');
$result = $soapclient->call('estraidati',$parameters);
echo 'STATO CLIENT: ';echo '<br>';
print $result;echo '<br>';?>
ed ecco il file da salvare sul Web services (nel nostro caso su
/usr/www/htdocs_con_crittografia/ restituisciclient.php)
<?function estraidati ($CN){
$ldap_server = "ldap://81.118.52.132/";$auth_user = "cn=Manager,dc=my-domain,dc=com";$auth_pass = "nutella";
// Set the base dn to search the entire directory.$base_dn = "DC=my-domain, DC=com";
$filter = "(cn=$CN)";
// connect to serverif (!($connect=@ldap_connect($ldap_server))) { die("Could not connect to ldap server");}
// bind to serverldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3); //senzaquesto,ldap_bind dà errore
81
if (!($bind=@ldap_bind($connect, $auth_user, $auth_pass))) { die("Unable to bind to server");}
// search active directoryif (!($search=@ldap_search($connect, $base_dn, $filter))) { die("Unable to search ldap server");}
$number_returned = ldap_count_entries($connect,$search);$info = ldap_get_entries($connect, $search);
//echo "The number of entries returned is ". $number_returned."<p>";$conteggio=$number_returned;
for ($i=0; $i<$info["count"]; $i++) {
$Description=$info[$i]["description"][0]; }
return $Description;}
require_once('./nusoap/nusoap.php');
$server=new soap_server;$server->register('estraidati');$server->service($HTTP_RAW_POST_DATA);?>
Quindi in questo modo potremo sapere se il client che sta visitando il nostro sito
è “ABILITATO” per un determinato servizio, fornendo il CN del certificato, che ci sta’
esibendo, al Web services e analizzando il risultato che il Web services, dopo che ha
fatto dei controlli su una struttura LDAP, ci restituisce.
6.4.1 La stampa di Request e Response
Per curiosità, nell’Appendice D (“D.1.3 La stampa di Request e Response”)
viene riportato il risultato dell’applicazione precedente.
Si potrà notare che “STATO CLIENT” assume il valore “ABILITATO”, questo
vuol dire che il Web services, in LDAP ha trovato il CN del certificato-client esibito dal
cliente e il valore del campo “Description” è “ABILITATO”.
Questo risultato verrà restituito a chi ha invocato il Web services.
Da notare, inoltre “ Request ” e “ Response” convertiti in XML dalla libreria
NUSOAP.
82
6.5 Applicazioni pratiche realizzate
La applicazioni pratiche realizzate sono visibili all’indirizzo:
http://81.118.52.132
questo, infatti, è l’indirizzo pubblico assegnato al server da me realizzato (a proposito: il
suo nome è “nutella” !).
A questo indirizzo si trova un sito web realizzato in Swish formato da alcune pagine:
- nella home page è possibile visionare la mia tesi
- nella pagina “L’obiettivo” è spiegato molto brevemente il senso di queste
applicazioni
- nella pagina “Certificati” è possibile scaricare certificati-client da usare per le prove
- nella pagina “Servizi” ci sono quattro servizi offerti dal sito
- nella pagina “Altro” c’è un servizio leggermente diverso rispetto ai primi quattro
Questo sito web è illustrato un po’ più in dettaglio nell’Appendice D al paragrafo “D.2
Un sito per il test”.
Di seguito una sintesi delle cinque applicazioni pratiche realizzate sul sito.
Si ricorda che il certificato-client rimane attivo per tutta la sessione, quindi se si
vogliono testare più servizi con diversi certificati-client, occorre chiudere e riaprire il
browser andando di nuovo sul sito web.
6.5.1 Rivista on-line
La prima applicazione realizzata consiste nel mettere a disposizione degli
articoli di una rivista solo ad alcuni “visitatori”.
Per testare questa applicazione occorre scaricare e installare un certificato-
client (dal nome “certificato rivista”) abilitato a questo servizio, reperibile nella sezione
“Certificati”.
83
Ovviamente questo certificato è scaricabile solo perché siamo in fase di test. La
procedura reale consisterebbe nel richiederlo ad un ente certificatore che, dopo i dovuti
controlli, rilascia il certificato (vedere Appendice C al paragrafo “ C.2 Generazione dei
certificati”).
Nella sezione “Servizi” è presente un link a questo servizio.
Tra i vari servizi offerti, si sceglie “RIVISTA ON LINE”.
84
Questa è la videata che compare:
Da notare che siamo ancora “su http” (vedere indirizzo in alto a sinistra), e che è
comparsa la finestra che ci informa che stiamo per andare su una connessione protetta
(“over https”).
Cliccando su OK, il browser ci chiederà quale dei nostri certificati-client vogliamo
esibire al server:
85
Qui sceglieremo il certificato “CLIENT RIVISTA” precedentemente scaricato.
In effetti qui stiamo fornendo la nostra CHIAVE PUBBLICA al server.
Subito dopo tocca al server:
86
Ci sono i soliti avvisi analizzati nel capitolo 5 al paragrafo “5.3 Cosa abbiamo ottenuto”.
In questa fase è il server che ci sta fornendo la sua CHIAVE PUBBLICA.
Ora siamo in “https”.
Con delle semplici istruzioni in PHP ( viste nel capitolo 5, paragrafo “5.4
Proviamo a fare dei test ”), preleviamo il CN (Common Name) del certificato esibito.
Ora entra in gioco il Web Services realizzato.
Si ricorda che il servizio consiste nel ricevere il CN, fare delle ricerche su un
LDAP Server usando come filtro proprio il CN, rilevare alcune informazioni relative al
certificato e restituirle al sito che ha invocato il web services (vedere Appendice C,
paragrafo “C.3.3 Il WSDL del mio Web Services: come utilizzarlo.”).
Il certificato-client è valido (altrimenti non saremmo riusciti ad arrivare a questo
punto del sito), occorre vedere se è abilitato.
Invochiamo il Web Services passandogli il CN.
Sia la richiesta che la risposta è in XML (vedere Appendice D, paragrafo “D.1.3
La stampa di Request e Response”).
Con l’ausilio di “PhpLDAPAdmin”, seguiamo ciò che sta facendo il web
services.
87
Tra i CN in LDAP individua quello uguale a “CLIENT_RIVISTA”, legge il valore
dell’attributo “description” e lo restituisce al sito che lo ha invocato.
Se l’attributo ha il valore che ci si aspetta (ad es. “abilitato”, oppure “abilitato alla
rivista”), si dà la possibilità al “cliente” di proseguire e quindi di leggere gli articoli.
In caso contrario, il “cliente” termina la sua navigazione.
Di seguito una figura esplicativa di tutto quello che accade:
88
6.5.2 Assistenza on-line
Con un procedimento simile a quello esposto nel paragrafo precedente, diamo
o meno la possibilità a un “cliente” di poter compilare un form e quindi di inviare un
messaggio di aiuto a un team di tecnici per ottenere un’assistenza on-line.
Ecco la figura che illustra il processo:
1 Il browser effettua una connessione “over https” con il web server 81.118.52.132
2 Il client esibisce il suo certificato
3 Il server invoca il web services con stringhe in xml…
4 …e gli fornisce il CN del certificato client
5 Il web services interroga il server LDAP utilizzando come filtro il CN
6 Il server LDAP raccoglie informazioni relative al client e le fornisce al web services
7 Queste informazioni vengono restituite al server che ha invocato il servizio del web services
8 Il server da la possibilità al client di compilare un form di “richiesta assistenza on-line”
9 I tecnici ricevono la richiesta
89
6.5.3 Consultazione Bilanci
Anche qui il procedimento è analogo a quello precedente.
Se il certificato esibito dal client è abilitato a questo servizio, sarà possibile visualizzare
un bilancio riservato.
La figura seguente chiarisce il procedimento che è molto simile a quello
illustrato nel paragrafo 6.5.1:
90
6.5.4 Consultazione Codici Fiscali
Questo servizio può nascere dall’esigenza di determinare se un codice fiscale
esista veramente. Infatti anche se un codice fiscale e' valido (il check-sum e' corretto),
non si può affermare con certezza che esiste. Questo servizio mette a disposizione
una lista di codici fiscali esistenti ma solo ai clienti che sono in possesso di un
certificato valido e che sia abilitato a questo servizio.
Nella figura che segue viene chiarito questo procedimento:
91
6.5.5 Applicazione da un server esterno (Aruba)
Questa applicazione nasce dai problemi derivati dalla seguente prova:
dal mio sito (www.salvatoreiacometta.it) ho provato a invocare la funzione messa a
disposizione dal mio web services. Si ricorda che questa funzione, passando il
Common Name del certificato Client, fornisce delle informazioni relative al certificato
stesso (o, più precisamente, il nome dei servizi ai quali è abilitato).
Mi sono reso subito conto che non era possibile fare questo perché ARUBA non
mette a disposizione il pacchetto CURL (la libreria di PHP che permette di far
"viaggiare" le informazioni XML su HTTPS).
Ho allora pensato di aggirare questo problema chiamando una pagina del mio
server (il server “nutella” o “81.118.52.132”) da www.salvatoreiacometta.it e poi
spostarmi su HTTPS all'interno del mio server per invocare il mio web services.
Solo così è possibile ricevere informazioni relative al certificato-client.
Alla fine ritorneremo sul sito di partenza richiamando cioè, dal server “nutella”,
una pagina che si trova su www.salvatoreiacometta.it/tesi :
arrivando su questa pagina, non sappiamo cosa sia successo nel server (“nutella”), ne
tantomeno nel web services.
Non conosciamo nemmeno i dati relativi al certificato che il cliente ha esibito.
Sappiamo solo che il web services, analizzando i dati in LDAP, ha determinato il o i
servizi per i quali è abilitato il cliente e quindi posso procedere o non procedere nel mio
sito (in funzione della risposta ottenuta).
Nella figura seguente si cerca di chiarire questo procedimento che è un pò
diverso rispetto a quelli visti precedentemente:
92
1 Il browser si collega al sito www.salvatoreiacometta.it tramite una connessione http
2 Questo sito non è in grado di richiedere un certificato-client perche il server sul quale risiede non è
abilitato. Il client viene, allora, indirizzato “over https” su una pagina che risiede su un altro server.
3 Il nuovo server (81.118.52.132) si fa riconoscere
4 Il client invia il suo certificato
5 Il server invoca il servizio offerto dal web services…
6 …e gli passa il CN del client
7 Il web services interroga il server LDAP facendo una ricerca per CN
8 Il server LDAP invia le informazioni relative al client al web services
9 Il web services restituisce al server 81.118.52.132 i dati richiesti
10 Si ritorna a una pagina che si trova sul sito www.salvatoreiacometta.it residente sul server Aruba
93
6.5.6 L’utilità del “Single Sign On”
Osservando le applicazioni precedenti si può dedurre che possiamo abilitare il
client ad altri servizi o bloccarlo su alcuni servizi per i quali è già abilitato,
semplicemente modificando il contenuto del campo “description” relativo al suo CN
presente nel server LDAP (che il servizio del Web Services consulta per reperire
informazioni relative al client).
Il client non deve quindi richiedere altri certificati per poter usufruire di altri
servizi né deve preoccuparsi di iscriversi presso altri enti che erogano altri servizi (cioè
non occorre che duplichi i suoi dati).
6.5.7 Il WSDL del mio Web Services
Il web services realizzato fornisce un servizio ben preciso:
riceve il CN (Common Name) del certificato-client di un visitatore di un determinato
sito, effettua una ricerca su un LDAP Server utilizzando come filtro appunto il CN
ricevuto, determina alcune informazioni relative a questo certificato ( ad es. “cliente
inaffidabile”, “cliente sicuro”, ecc…) e le passa al sito che ha invocato il web services.
Ora il sito, in base a ciò che il web services ha restituito, può decidere se far continuare
o meno nella navigazione il suo “visitatore”.
Per capire come utilizzare il servizio offerto dal mio web services, occorre
consultare il paragrafo “C.3.3 Il WSDL del mio Web Services: come utilizzarlo”
dell’Appendice C.
6.6 Usufruire dei servizi di un web services solo se si è in possesso di uncertificato-client valido
Ho voluto fare questo test:
Ho preso il file “esempio_server.php” che, ricordo, rappresenta il servizio del mio Web
services che restituisce la concatenazione delle due stringhe passate come variabili, e
l'ho spostato su https.
Ho invocato questo servizio con una pagina che risiede su http.
Questo esperimento non porta a nessun risultato!
94
Infatti, le pagine di un servizio non possono risiedere su un server dove è obbligatorio
l’esibizione di un certificato-client.
Questo perché nusoap, per convertire in XML la Request e la Response, richiama i
seguenti link:
http://schemas.xmlsoap.org/soap/encoding/
http://schemas.xmlsoap.org/soap/envelope/
http://www.w3.org/2001/XMLSchema
http://www.w3.org/2001/XMLSchema-instance
http://soapinterop.org/xsd
http://testuri.org
Quando questi siti forniscono i dati richiesti da nusoap, ovviamente non
esibiscono nessun certificato-client ! Se il Web services ne esige uno (perché le sue
pagine sono “over https” con “verifica-client” obbligatoria), questi dati non possono
essere forniti e l’esperimento fallisce.
L’unico modo per usufruire dei servizi di un Web services solo dopo aver esibito
un certificato-client valido, è quello adottato nell’esempio “6.5.5 Applicazione da un
server esterno (Aruba)”, cioè, prima di invocare il Web services, si viene indirizzati su
una pagina (over https) che obbliga l’esibizione di un certificato valido.
96
AIPA: Autorità per l’Informatica nella Pubblica Amministrazione.
Venne posta in essere dal decreto legislativo del 12 febbraio 1993, n. 196, il quale
fissava "Norme in materia di sistemi informativi automatizzati delle amministrazioni
pubbliche".
Soppressa nel 2003, sostituita da un organismo simile, ma forse meno indipendente
dal Governo: la CNIPA
Apache: è un web server per il protocollo HTTP, designato per girare come un
processo standalone, senza cioè chiedere l'appoggio ad altre applicazioni o
direttamente all'utente. Per fare ciò, Apache, una volta che sia stato avviato, crea dei
sottoprocessi (comunemente e meglio detti "children processes") per poter gestire le
richieste: questi processi, comunque, non potranno mai interferire con il processo
maggiore, ma può succedere l'opposto: mandando un segnale di stop a questo, anche
i children saranno terminati.
Client: Un client e’ il programma che, in un sistema client/server, inoltra le richieste
dell’utente ad un programma server. L’esempio più comune e’ sicuramente il browser
che l’utente utilizza per inviare richieste ai web server cosi da poter visionare le pagine
che interessano.
CNIPA: Centro Nazionale per l’Informatica nella Pubblica Amministrazione.
CURL: Client URL Library. PHP supporta libcurl, una libreria creata da Daniel
Stenberg, che permette di collegarsi e comunicare con parecchi tipi di server e con
parecchi tipi di protocolli. Libcurl al momento supporta i protocolli http, https, ftp,
gopher, telnet, dict, file, e ldap. libcurl supporta anche i certificati HTTPS, HTTP POST,
HTTP PUT, l'upload via FTP (questo può essere ottenuto anche con l'estensione ftp di
PHP), upload attraverso una form HTTP, proxy, cookie e autenticazione con utente e
password.
Debian: è un sistema operativo (OS) libero (free). Utilizza Linux come kernel (la parte
centrale di un sistema operativo), ma molti dei programmi di utilità vengono dal GNU
project.
97
Debian GNU/Linux fornisce più di un semplice OS: viene distribuito con oltre 8710
pacchetti, programmi già compilati e impacchettati in modo tale da permettere
installazioni facili sulla macchina.
Firma elettronica: insieme dei dati in forma elettronica, allegati oppure
connessi tramite associazione logica ad altri dati elettronici, utilizzati come metodo di
autenticazione informatica.
Firma elettronica avanzata: firma elettronica ottenuta attraverso una procedura
informatica che garantisce la connessione univoca al firmatario e la sua univoca
identificazione, creata con mezzi sui quali il firmatario può conservare un controllo
esclusivo e collegata ai dati ai quali si riferisce in modo da consentire di rilevare se i
dati stessi siano stati successivamente modificati.
Hash: Tecnicamente la firma digitale è basata su una funzione di hash non invertibile
ed uno schema di cifratura a chiave pubblica. La funzione di hash non invertibile (detta
anche valore di controllo o checksum) verifica l’eventuale modifica dei dati durante la
trasmissione, accodando al messaggio un valore di controllo ottenuto effettuando
alcune operazioni sui dati protetti. Scopo di tale funzione è quello di fornire al
destinatario del messaggio un mezzo per individuare le eventuali alterazioni dei dati
trasmessi. La funzione hash produce una sorta di impronta digitale del messaggio, di
dimensioni molto più piccole del messaggio stesso.
HTTP: (Hyper Trasport Protocol). Protocollo con cui file ipertestuali vengono trasmessi
lungo la WWW.
HTTPS: (Hyper Trasport Protocol Secure). La crittografia SSL nell'ambito del
protocollo HTML, viene applicata utilizzando una porta diversa da quella standard. Di
solito si tratta del numero 443, a cui si abbina la definizione `https'.
Interoperabilità: Il concetto di interoperabilità indica la possibilità per un sistema di
protocollo informatico ricevente di una certa amministrazione di trattare
automaticamente le informazioni trasmesse dal sistema di protocollo informatico
98
mittente di un’altra amministrazione al fine di automatizzare le attività e i processi
sottostanti.
LDAP: Il protocollo LDAP (Lightweight Directory Access Protocol) è costituito da una
serie di protocolli utilizzati per accedere ai servizi sullo standard X.500 per la
condivisione di directory. organizza le informazioni in ordine gerarchico servendosi di
directory che sono in grado di immagazzinare numerose informazioni e possono anche
essere utilizzate a mo' di NIS (Network Information Service), permettendo a chiunque
di accedere al loro account da qualsiasi macchina presente sulla rete LDAP abilitata.
Mysql: è il database open source per eccellenza. Cresciuto molto in questi anni, è
diventato il DBMS più utilizzato dalla comunità open source e apprezzato anche da chi
scrive pagine con tecnologie diverse da PHP e su server diversi da Linux.
NUSOAP: Nusoap e' una libreria che permette la costruzione di applicazioni server e
client in PHP basate sul protocollo SOAP.
Tramite nusoap e' possibile creare e utilizzare in modo facile e rapido delle funzionalità
utilizzabili mediante protocollo SOAP.
OpenSSL: Il progetto OpenSSL è uno sforzo collaborativo per lo sviluppo di un tool
robusto per l'implementazione del Secure Sockets Layer (SSL v2/v3) e Transport
Layer Security (TLS v1) così come anche una libreria per la crittografia per ogni
settore.
PHP: è un modulo aggiuntivo per web servers che permette di creare delle pagine web
dinamiche.
In pratica, una pagina in Php è composta sia da tag html, sia da parti in codice di
programmazione Php. Ogni porzione di codice, limitato entro i tag "<?php" e "?>",
viene eseguito prima di essere inviato all'utente che ne fa richiesta.
PhpLDAPadmin: è un browser LDAP per gestire un LDAP Server. E’ scritto
interamente in PHP.
99
Phpmyadmin: è uno strumento scritto in PHP per poter amministrare MySql attraverso
il Web.
PKCS: Public Key Cryptography Standards
RA: Registration Authority (Centro di Registrazione)
Entità responsabile dell'identificazione e dell'autenticazione dei soggetti della
certificazione, ma che non è una CA e, pertanto, non firma né emette certificati. La RA
procede al riconoscimento delle persone che si recano fisicamente ai propri sportelli e
ne raccoglie dati anagrafici, tipo di servizio, etc., comunicandoli in modalità protetta alla
CA.
Server: e’ un programma che fornisce dei servizi ad altri programmi dello stesso (ma
anche di altri) computer ma è anche il computer in cui e’ operativo il programma server.
Nei sistemi client/server un server e’ un programma che elabora e processa le richieste
che gli arrivano dal client.
Single Sign On: In un'applicazione "Single Sign On" l'utente deve autenticarsi una
volta sola e poi i vari client si occuperanno di ricevere dall'applicazione con cui l'utente
si è autenticato le credenziali necessarie per verificare l'identità dell'utente.
Una applicazione di questo tipo è fondamentale per evitare problemi di sicurezza
riguardanti la diffusione della password degli utenti. Con questo sistema infatti nessuna
applicazione ha bisogno della password dell'utente per verificarne l'identità.
Sniffer: Programma che monitorizza e analizza il traffico di rete.
SOAP: (Simple Object Access Protocol) e' un protocollo di comunicazione basato su
XML che permette lo scambio di informazioni tra programmi scritti anche in linguaggi
differenti.
Ad esempio, tramite SOAP e' possibile creare delle funzioni in PHP e utilizzarle in
Visual Basic 6.
Solitamente le informazioni relative a SOAP "viaggiano" sulla stessa porta utilizzata dai
server web (porta 80), per cui non e' necessario cambiare le impostazioni dei firewall
presenti sulla rete.
100
Nel caso generale, il sistema e' composto da un programma client che esegue delle
richieste SOAP e da un server che risponde alle richieste SOAP.
Policy o Certificate Policy
Definizione delle regole generali che indicano in che contesto, a che dominio e con
quali modalità di servizio un certificato viene utilizzato. Tutte le regole di servizio
vengono poi definite, nel dettaglio, dal documento di Certification Practice Statement (o
CPS).
Web Server: e’ un programma che, utilizzando il modello client/server e il protocollo
HTTP, fornisce i file che costituiscono una pagina web agli utenti che ne fanno richiesta
utilizzando un programma client: il browser. Ogni computer che contiene un sito web
deve avere un programma web server.
Tra i programmi web server i più utilizzati sono: Apache e Microsoft Internet
Information Server (IIS).
Web Services: è un'interfaccia che descrive una collezione di operazioni, accessibili
attraverso una rete mediante messaggistica XML
WSDL: file che descrive le operazioni supportate dal Web Service, i parametri richiesti
per funzionare ed il tipo di dati che vengono restituiti. Questi file WSDL (Web Services
Description Language) sono normali file XML che possono essere chiamati
direttamente dal browser in modo da visualizzare la descrizione della struttura delle
interfacce di chiamata e risposta
XML: L'Extensible Markup Language è una tecnologia che serve a creare linguaggi di
markup che descrivono i dati di qualsiasi tipo e in modo strutturato. Xml è quindi un
metalinguaggio cioè un sistema linguistico per mezzo del quale è possibile analizzare i
simboli e le strutture del linguaggio ordinario, consentendo così di creare dati
intelligenti.
102
B.1 I punti da fissare
B.1.1 Necessità e soluzione
Necessità:
• Riservatezza: la comunicazione è stata intercettata?
• Autenticazione: l’utente è veramente chi dice di essere?
• Autorizzazione: ogni utente può accedere solo alle risorse cui ha diritto.
• Integrità: i dati ricevuti sono proprio quelli spediti?
• Non ripudio: il mio interlocutore può ritrattare quello che ha detto?
• Disponibilità: il mezzo di comunicazione è stato reso inutilizzabile?
Crittografia:
La crittografia risponde alle necessità di sicurezza.
– Riservatezza: cifratura.
– Autenticazione: firma digitale e certificati.
– Integrità: one-way hash(message digest).
– Non ripudio: integrità e autenticazione.
103
B.1.2 Cifratura
Cifratura a chiave privata:
• Richiede una chiave segreta nota solo ai corrispondenti.
• La stessa chiave serve per cifrare e decifrare il messaggio.
104
Cifratura a chiave pubblica:
Ogni utente ha due chiavi: una privata ed una pubblica:
– dalla chiave pubblica è praticamente impossibile scoprire quella privata;
– quello che si cifra con una, si può decifrare solo con l’altra.
Non è necessario nessuno scambio di chiavi segrete: il mittente cifra con la chiave
pubblica del destinatario e il destinatario decifra con la propria chiave privata;
105
A è il client
B è il server
- Nella prima figura in alto a sinistra la chiave è quella PUBBLICA DI B
- Nella seconda figura in alto a destra la chiave è quella PRIVATA DI B
- Nella terza figura in basso a sinistra la chiave è quella PRIVATA DI A
- Nella quarta figura in basso a destra la chiave è quella PUBBLICA DI A
A prende la chiave pubblica di B dal certificato server (visibile cliccando sul lucchetto
nel browser)
B.1.3 Autenticazione
• A calcola l’hash del messaggio e lo cifra con la sua chiave privata: l’hash cifrato è la
firma digitale.
• A invia il messaggio firmato a B.
• B ricalcola l’hash sul messaggio e lo confronta con quello inviato, dopo averlo
decifrato con la chiave pubblica di A.
• Se i due hash sono uguali, il messaggio non è stato modificato e A non può
ripudiarlo.
106
La firma digitale rende sicuro un messaggio se:
- la chiave privata di A non è stata compromessa;
- B è in possesso della chiave pubblica di A;
ma come può B essere certo di possedere la vera chiave di A?
La convalida dell’abbinamento tra dati anagrafici e chiavi pubbliche viene fatta tramite i
Certificati Digitali: un’autorità esterna (Certification Authority) che garantisce
l’autenticità delle chiavi pubbliche.
A e B devono fidarsi della Certification Authority.
107
B.1.4 Interoperabilità
Il concetto di interoperabilità indica la possibilità per un sistema di protocollo
informatico ricevente di una certa amministrazione di trattare automaticamente le
informazioni trasmesse dal sistema di protocollo informatico mittente di un’altra
amministrazione al fine di automatizzare le attività e i processi sottostanti.
E’ la condizione necessaria per la diffusione della firma digitale, e per l'utilizzo
friendly da parte dell'utente (librerie software diverse, dispositivi diversi, …).
AIPA, in attesa di standard a livello europeo/internazionale, ha sviluppato una
soluzione concreta, semplice ed immediata sul tema dell'interoperabilità relativamente
a:
- la struttura dei certificati e la loro estensione
- la rappresentazione dei dati dei certificati
- la struttura ed il formato delle CRL ovvero CSL
- la struttura e la rappresentazione dei documenti firmati
- la marcatura temporale
Si è quindi passati da una fase che vedeva una CA compatibile soltanto con se
stessa, ad una situazione in cui ogni CA inscritta all'elenco pubblico CNIPA è in grado
di leggere e gestire certificati emessi da altre CA.
B.1.5 PKCS
Di seguito gli standard di crittografia delle chiavi pubbliche:
- PKCS#1 : RSA Cryptography
- PKCS#3 : Diffie-Hellman Key Agreement
- PKCS#5 : Password Based Cryptography
- PKCS#7 : Digital Envelope
- PKCS#8 : Private Key Information Syntax
- PKCS#9 : Selected Attribute Type
108
- PKCS#10 : Certificate Request
- PKCS#11 : Cryptographic Token Interface
- PKCS#12 : Personal Information Exchange Syntax
- PKCS#15 : Cryptographic Token Information Format
- #2,#4,#6 obsoleti, #13 e #14 in sviluppo
Ulteriori informazioni : http://www.rsasecurity.com/rsalabs/PKCS
B.1.6 Composizione di un certificato
Un certificato è composto fondamentalmente da:
- informazioni sul proprietario;
- la data di scadenza;
- la chiave pubblica del proprietario;
- informazioni sull’autorità garante (la Certification Authority o CA);
- la firma della CA.
I certificati sono pubblicati in una directory pubblica (ad es. LDAP o
WWW) gestita dalla CA.
B.1.7 Revoca dei certificati
Normalmente il legame tra identità e chiave pubblica vale per l’intero periodo di
validità del certificato. Può essere necessario rescindere questo legame in anticipo (ad
es. la chiave privata è stata persa).
Una CA può (e deve) revocare un certificato non più valido.
I browser contengono preinstallati alcuni root certificates, visibili sotto
Certificates nel menu Tools/Internet Options.
Si possono aggiungere, eliminare e modificare i certificati.
109
B.1.8 Come si ottengono i certificati
- A sceglie una Certification Authority e se ne procura il certificato;
- A genera una coppia di chiavi: pubblica e privata;
- A sottopone una richiesta di certificato alla CA scelta;
- la CA verifica che la richiesta provenga veramente da A;
- la CA emette il certificato per A e lo pubblica.
B.1.9 Come si usano i certificati
B vuole scambiare messaggi «sicuri» con A:
- si procura il certificato di A (e i certificati della catena di CA di A che ancora non
possiede);
- verifica la validità del certificato di A (una tantum):
- decifra l’hash del certificato di A con la chiave pubblica della CA di A (ricavata del
certificato di quest’ultima);
- calcola l’hash del certificato di A;
- controlla che i due hash, quello calcolato e quello decifrato, siano uguali;
- controlla la data di scadenza;
- verifica che il certificato di A non sia revocato o sospeso;
- usa il certificato di A per:
verificare la firma dei messaggi che riceve da A;
cifrare i messaggi per A.
B.1.10 Applicazioni
– autenticazione di un server web da parte dei clienti e cifratura dei dati trasmessi:
– pagamenti online;
– autenticazione dei clienti da parte del server web e cifratura dei dati trasmessi:
– accesso a dati riservati senza dover digitare password;
110
– autenticazione e cifratura di messaggi.
B.2 Una semplice osservazione sulla connessione sicura
Per una semplice curiosità, viene allegata un’analisi di un comune sniffer su un
pacchetto mentre ci si apprestava a consultare la posta su www.libero.it.
Si può notare che la password di accesso è facilmente visibile (cancellata per
ovvie ragioni di privacy).
Questo non sarebbe accaduto se tra client e il provider ci fosse stata una
connessione sicura.
Infatti “over https” tutto ciò che il client invia al server viene criptato dal client
con la chiave pubblica del server (che il server ha fornito al client nel momento della
connessione e dopo la fase dell’autenticazione) e decriptato dal server con la sua
chiave privata.
111
Se, in questo caso, dovessimo “sniffare” un pacchetto in uscita, non vedremmo
nessuna stringa comprensibile (come nell’esempio precedente) ma solo dei dati senza
significato.
113
C.1 Installare e configurare MySQL, Apache con SSL, PHP, LDAP
Occorre avere un accesso alla macchina come superuser. Ogni cosa in questo
esempio può essere fatta per via remota usando ssh o telnet, così come localmente
operando sulla macchina.
Punto 1:
Per prima cosa, serve una struttura di directory per installare e compilare il
tutto. Alcune persone usano le locazioni standard quando installano. Se si
amministrano poche macchine, o se si usa un solo S.O., non c'è nulla di sbagliato. Si
Può mettere tutto in /usr/bin o /usr/local/bin, oppure /export/home/web o dovunque il
sistema decida di mettere le cose.
Usare uno schema di directory generale per le installazioni complesse è una
cosa buona che sicuramente semplifica di molto il lavoro.
In questo modo, non occorre andare in giro a caccia delle cose, tentando di
ricordare lo schema delle directory di ogni sistema operativo.
Per cui creiamo le seguenti directory:
# mkdir /usr/www
# mkdir /usr/db
# mkdir /usr/berkeley
# mkdir /usr/ldap
Inoltre occorre creare directory per ogni cosa che verrà compilata in Apache:
# mkdir /usr/www/php
# mkdir /usr/www/mod_ssl
# mkdir /usr/www/openssl
# mkdir /usr/www/mm
# mkdir /usr/www/curl
# mkdir /usr/www/logs
114
È ora di prelevare i sorgenti del software che bisogna installare.
Bisogna trovare sulla rete i seguenti pacchetti:
Per mysql:
mysql-3.22.32
phpmyadmin 2.2.7 (interfaccia in PHP per gestire mysql)
Per Apache:
apache_1.3.31
Per il protocollo SSL
mm-1.1.3
mod_ssl-2.8.19-1.3.31
openssl-0.9.6
Per PHP
php-4.3.7
Per LDAP:
db-4.1.25 (il database backend per ldap)
openldap-2.1.16
phpldapadmin-0.9.4b (interfaccia in PHP per gestire LDAP)
Per le prove relative alla realizzazione di un webservices:
nusoap.0.6.4 (per xml)
curl-7.12.1 (per xml su https)
Si scompattano i sorgenti nelle relative cartelle create.
A questo punto, si può iniziare la compilazione di MySQL.
# cd /usr/db/mysql-3.22.32/
115
Si configurano i sorgenti in modo che compilino sul sistema.
# configure --prefix=/usr/db
Si compila il sorgente:
# make
Si installa MySQL:
# make install
Ora si installa il database MySQL.
In /usr/db/mysql-3.22.32/.
# cd scripts
# make install
# chmod +x mysql_install_db.sh
# ./mysql_install_db.sh
Ora si può avviare il server MySQL e impostare la relativa password di root:
# cd /usr/db/bin
# ./safe_mysqld &
# ./mysqladmin -u root password 'new-password'
Punto 2:
Ora si compilerà tutto il software SSL. A differenza di PHP, mod_ssl è compilato
direttamente nel server Apache, invece di girare come modulo. La prima cosa da fare è
installare MM, la Shared Memory Library:
# cd /usr/www/mm-1.1.3
si configura il makefile:
# ./configure --prefix=/usr/www/mm
Si compila il sorgente:
# make
Una volta compilato, si test la compilazione:
# make test
Infine:
# make install
Punto 3:
Ora si compilerà OpenSSL.
# cd /usr/www/openssl-0.9.6
116
# ./config --prefix=/usr/www --openssldir=/usr/www/openssl
# make
# make test
# make install
Punto 4:
Ora verrà compilato mod_ssl.
# cd /usr/www/ mod_ssl-2.8.19-1.3.31
Ora bisogna specificare le opzioni richieste per configurare il Makefile.
# ./configure --with-apache=/usr/www/apache_1.3.31 --with-ssl=/usr/www/openssl-
0.9.6 --with-mm=/usr/www/mm --prefix=/usr/www --enable-shared=ssl --
prefix=/usr/www --enable-module=rewrite --enable-shared=rewrite --enable-
module=speling --enable-module=so
Una volta configurato, è la volta di compilare il sorgente.
# cd /usr/www/apache_1.3.31
Ora bisogna compilare il sorgente.
# make
Ora bisogna creare un certificato. Verranno chieste le informazioni necessarie
per creare un certificato auto-firmato, che si può usare al posto di uno firmato, o per lo
sviluppo finché non se ne ottiene uno.
# make certificate
Ora verranno chieste delle informazioni necessarie per creare il certificato:
-Stato
-Città
-common name
-ecc…
117
occorre fornire tutte queste informazioni.
Ora, finalmente, si installerà il server.
# make install
Al termine, si vedrà un messaggio che confermerà l'avvenuta installazione.
Non avviamo il server.
Si installeranno ora i moduli per gestire gli altri servizi che vogliamo.
Punto 5:
Installiamo LDAP.
Occorre prima installare Il “Barkeley DB”:
# cd /usr/berkeley/db-4.1.25/build-unix/
#../dist/configure –prefix=/usr/berkeley
# make
# make install
Installiamo ora LDAP:
# cd /usr/ldap/openldap-2.1.16
# env CPPFLAGS=”-I/usr/www/mod-ssl/include –I/usr/berkeley/include” LDFLAGS=”-
L/usr/www/lib –L/usr/berkeley/lib” ./configure –prefix=/usr/ldap –enable-slurpd
# make depend
# make
# make install
startiamo LDAP:
# /usr/ldap/libexec/slapd
118
Punto 6:
Installiamo CURL.
Curl verrà utilizzato relativamente alla fase di realizzazione di un web services perché
è necessario a nusoap per connessioni di tipo SSL (con protocollo https):
# cd /usr/www/curl-7.12.1
# ./configure –with-ssl=/usr/www –prefix=/usr/www/curl
# make
# make install
Punto 7:
Si installerà ora PHP dentro Apache.
# cd /usr/www/php-4.3.7
# ./configure --prefix=/usr/www/php --with-mysql --with-apxs=/usr/www/bin/apxs –with-
ldap=/usr/ldap –with-curl=/usr/www/curl –enable-track-vars
# make
# make install
Una volta installato, si può verificare che il modulo sia stato caricato ispezionando
/usr/www/conf/httpd.conf.
Dovrebbe esserci:
LoadModule php4_module libexec/libphp4.so
AddModule mod_php4.c
nella sezione DSO del file.
Bisogna togliere i commenti alle linee che seguono:
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
119
E’ possibile modificare il file di configurazione di Apache,
Si trova in
/usr/www/conf/httpd.conf
Ad es. è possibile scegliere se rendere obbligatorio o opzionale la verifica del
certificato-client modificando la seguente riga
SSLVerifyClient optional
con
SSLVerifyClient require
oppure
SSLVerifyClient none
Oppure si possono fare altre modifiche.
A questo punto, si può partire.
Per avviare Apache
# cd /usr/www/sbin
# ./apachectl startssl
Sarà chiesta la SSL passphrase (scelta quando è stato creato il certificato
digitale).
A questo punto il server partirà.
Sarà possibile accedere via telnet alla porta 80 della macchina localhost,
richiedere l'header http, e vedere la pagina di benvenuto di Apache .
Sarà anche possibile potersi connettere alla porta 443 (digitando nel browser
https:\\indirizzodelserver) .
E’ stato ottenuto un singolo processo Apache che può soddisfare entrambe le
richieste http e https, analizzare PHP4, mentre dialoga con un database MySQL o
mentre utilizza LDAP.
120
C.2 Generazione dei certificati
Di seguito è possibile trovare la procedura per creare un certificato “auto-
firmato” con il quale un server afferma di “essere effettivamente chi dice di essere” e,
inoltre, la procedura tramite la quale è possibile rilasciare dei certificati-client.
In questo modo i certificati-client rilasciati non sono validi per il “mondo esterno”
a meno che il certificato-server che utilizziamo non sia auto-firmato ma sia rilasciato da
una Certification Autority.
Prima di vedere queste due procedure è quindi opportuno fare una distinzione
tra un certificato-server auto-firmato e uno rilasciato da una CA:
C.2.1 Osservazioni sui certificati
La certificazione si può ottenere in uno dei due modi seguenti.
1) Inviare la richiesta di certificazione ad un ente certificatore (Certificate Authority)
come, ad esempio, EuroPKI http://www.europki.org. L'ente certificatore dopo un
certo periodo manda il certificato desiderato e lo si può installare sul un web server
per utilizzare SSL. Questa procedura non è gratuita e richiede parecchio tempo. Il
maggior vantaggio è quello di ottenere un certificato universalmente riconosciuto.
2) Si ottiene il proprio certificato utilizzando il software Openssl validando la richiesta
di certificazione. l vantaggio di questa metodologia è di ottenere un certificato, da
utilizzare con SSL in poco tempo ed in maniera gratuita. Lo svantaggio è che il
browser, sia Netscape sia MS Explorer, avvertirà l'utente che la CA (Certificate
Authority) non è fra quelle riconosciute e gli chiederà una conferma prima di
iniziare il collegamento sicuro.
121
C.2.2 Creare certificati SSL auto-firmati
Spostiamoci nella seguente directory:
cd /usr/www/bin
e digitiamo la seguente riga:
./openssl req -new > new.cert.csr -config /usr/www/openssl/openssl.cnf
./openssl rsa -in privkey.pem -out new.cert.key
./openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 999
la chiave e il certificato appena ottenuti vanno spostate nelle opportune directory:
cp new.cert.key /usr/www/conf/ssl.key/server.key
cp new.cert.cert /usr/www/conf/ssl.crt/server.crt
Riavviare APACHE altrimenti il certificato non risulterà valido !
Attenzione a un probabile errore che è possibile commettere (e che io ho
commesso) : il certificato server appena creato (e che mi veniva esibito nel momento in
cui invocavo il server via https) risultava “non valido”. Dopo moltissime prove ho capito
che risultava “non valido ” perché l’orologio interno del server era di un paio di ore più
avanti rispetto a quello del client che stavo utilizzando, perciò il certificato non era
ancora entrato nel periodo di validità !!
Un client può richiedere un certificato-client al nostro server.
Ecco di seguito come può fare
122
C.2.3 rilasciare certificati client a seguito di una richiesta.
Passi che un client deve seguire:
1) scaricare l'applicativo openssl.exe (che può essere messo a disposizione sul server
e pronto per essere scaricato oppure può essere scaricato da internet)
2) Unzipparlo
3) Doppio click su openssl.exe
4) digitare la seguente riga
genrsa -out client.key 1024
5) digitare la seguente riga
req -new -key client.key -out client.csr -config openssl.cnf
In questo modo è stato generato un file "client.csr" che rappresenta una richiesta di un
certificato client.
Prendere questo file e inviarlo in qualche modo (ad es. via e-mail) al server (o
meglio al responsabile del rilascio dei certificati).
Dopo che è stato accertato che la richiesta arriva da una fonte attendibile, verrà
elaborata e verrà spedito al mittente il certificato "client.crt"
6) salvare il certificato nella stessa cartella in cui risiede openssl.exe
7) doppio click su openssl.exe
8) digitare la seguente riga
pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
9) scegliere una password
10) verrà generato un file "client.p12". Basta fare un doppio click per installarlo.
Tra il passo 5) e il passo 6) si noterà che c’è un intervento sul server.
Ecco quello che succede:
bisogna prendere il file "client.csr" inviatoci dal cliente, metterlo in /usr/www/bin
e digitare:
./openssl x509 -req -days 900 -CA /usr/www/conf/ssl.crt/server.crt -CAkey
/usr/www/conf/ssl.key/server.key -CAcreateserial -in client.csr -out client.crt
123
il file "client.crt" deve essere mandato al cliente.
C.2.4 Richiedere un certificato-client ad un ente certificatore ufficiale
Prendiamo come esempio la EuroPKI.
La richiesta deve essere mandata presso
Indirizzo:EuroPKI Italian Certification Authority
c/o prof. Antonio Lioy
Dip.Automatica e Informatica
Politecnico di Torino
corso Duca degli Abruzzi 24
10129 - TORINO
phone:+39 0115647021 / +39 0115647054
fax:+39 0115647099
URL:http://www.europki.org/ca/it/it_index.html
e-mail:[email protected]
Bisogna compilare il modulo scaricabile dal loro sito e mandarlo via fax.
Inoltre bisogna presentarsi in una delle loro Registration Authority (Torino,
Bologna o Catanzaro) per l'identificazione (un incontro "de visu") con una copia di un
documento di identità (C.I. o passaporto)
C.2.5 Considerare validi i certificati-client rilasciate da altre CA
Per ogni CA per la quale dobbiamo considerare validi i certificati-client da essa
rilasciati, occorre installare il suo certificato sul nostro server.
124
Prendendo come esempio sempre la EuroPKI, al seguente link
http://www.europki.org/ca/it/ca_cert/it_index.html
è possibile trovare il certificato della CA EuroPKI. Occorre scaricarlo e installarlo sul
nostro server.
Scarichiamo quello in formato PEM:
ca_cert.pem
Ora, se vogliamo che il nostro server consideri validi sia i certificati-client da
esso rilasciato, sia i certificati-client rilasciati dall’EuroPKI, occorre concatenare i due
certificati delle due CA in un unico file e specificare il path del file tramite la direttiva
SSLCACertificateFile
che si trova nel file di configurazione di Apache “httpd.conf”.
Vediamo come fare.
Innanzi tutto bisogna trasformare il certificato del nostro server
server.crt
nel formato PEM.
Creiamo prima la cartella /usr/www/conf/ssl.pem
poi:
cd /usr/www/bin
cat /usr/www/conf/ssl.key/server.key /usr/www/conf/ssl.crt/server.crt >
/usr/www/conf/ssl.pem/server.pem
abbiamo così ottenuto il certificato
server.pem
Ora occorre concatenare i due .pem:
cd /usr/www/bin
cat /usr/www/conf/ssl.pem/server.pem /usr/www/conf/ssl.pem/ca_cert.pem >
/usr/www/conf/ssl.crt/concatenati.crt
In questo modo abbiamo ottenuto il certificato
concatenati.crt
dato dalla concatenzione dei due.
Modifichiamo infine il file di configurazione di Apache (che si trova in
“/usr/www/conf/httpd.conf “ ) “httpd.conf” .
125
In corrispondenza di
SSLCACertificateFile
Scriviamo:
SSLCACertificateFile /usr/www/conf/ssl.crt/concatenati.crt
Abbiamo, quindi, concatenato tutti i certificati in un unico file e abbiamo specificato il
path del file tramite la direttiva SSLCACertificateFile.
Al termine delle modifiche occorre riavviare il server.
In questo modo ora il nostro server riconoscerà anche i certificati-client rilasciati calla
CA "EuroPKI".
C.3 Il mio web services
Per costruire un web services, è stato visto che bisogna tenere conto che si deve avere
a che fare con un insieme di messaggi inviati tramite Soap (o meglio, NUSOAP, visto
che è stata preferita questa scelta), questo perché sfruttano XML per garantire
l'indipendenza dalle piattaforme utilizzate.
C.3.1 Installazione di NUSOAP
NUSOAP non si installa ! Basta solo copiare l’intera cartella in un punto
qualunque e poi includere il file “nusoap.php” in tutti i file php che si realizzano. Ad es.:
include("./nusoap/nusoap.php");
C.3.2 Installazione di CURL
Sappiamo che Curl viene utilizzato perché è necessario a nusoap per
connessioni di tipo SSL (con protocollo https). L’installazione è illustrata al Punto 6 nel
paragrafo “C.1 Installare e configurare MySQL, Apache con SSL, PHP, LDAP”.
Dopo l’installazione occorre includerlo, successivamente, durante
l’installazione di PHP.
126
C.3.3 Il WSDL del mio Web Services: come utilizzare il servizio.
Una volta realizzato il web services, occorre spiegare agli “utilizzatori” del o dei
servizi offerti
- come richiamarlo
- cosa passargli
- quale funzione invocare per ottenere ciò che si vuole
- cosa restituirà
Queste informazioni sono racchiuse nel “WSDL” che dovrà essere pubblicato nel
momento in cui il web services si metterà on-line.
Cioè se decideremo di iscrivere il nostro Web services ad un motore di ricerca,
occorrerà corredarlo, oltre che di una descrizione sui servizi offerti, anche del suo
WSDL.
Il web services che io ho realizzato, riceve il CN (Common Name) del certificato-
client di un visitatore di un sito, fa una ricerca su un LDAP server, rileva alcune
informazioni relative al CN e le restituisce al sito che ha invocato il web services.
Ad es. può restituire la stringa “sicuro” oppure “inaffidabile” ecc…e il sito potrà
decidere di far continuare o meno il suo “cliente” nella navigazione.
Ecco il WSDL del mio web services:
https://81.118.52.132/webservices/restituisciclient.php
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-
ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-
ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-
ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:si="http://soapinterop.org/xsd"><SOAP-ENV:Body><ns1:estraidatixmlns:ns1="http://testuri.org">
<CN xsi:type="xsd:string">VALORE DEL COMMON NAME</CN></ns1:estraidati></SOAP-ENV:Body></SOAP-ENV:Envelope>
127
dove:
- la prima riga rappresenta l’indirizzo del mio web services
- “estraidati” rappresenta la funzione da chiamare
- CN rappresenta la variabile da passare.
Se “l’utilizzatore” del mio web services decidesse di richiamarlo tramite una pagina
PHP, allora dovrebbe banalmente scrivere:
<?phprequire_once('./nusoap/nusoap.php');
//----------------- PER PRELEVARE IL CN DEL CERTIFICATO CLIENT -------------$sslusername = getenv("SSL_CLIENT_S_DN_CN");//-----------------------------------------------------------------------------------------------------------
//------- IL PARAMETRO DA PASSARE ------------------------------------------$parameters = array( "CN" => $sslusername);
//--------L’INDIRIZZO DEL MIO WEB SERVICES -------------------------------$soapclient = newsoapclient('https://81.118.52.132/webservices/restituisciclient.php');
//------------RICHIAMA LA FUNZIONE PASSANDO I PARAMETRI---------$result = $soapclient->call('estraidati',$parameters);
//----IN $result CI SARA’ CIO’ CHE IL WEB SERVICES RESTITUIRA’-----
?>
129
D.1 I listati dei file in PHP
D.1.1 Verifica l’esistenza di un dominio: “checkdomain.php”
Il seguente file deve essere copiato sul web services.
In pratica rappresenta una funzione che il web services mette a disposizione.
Viene chiamata passando un dominio e la sua estensione, e restituisce “0” se
l’indirizzo passato esiste, “1” altrimenti:
<?function selectdomaincheck ($domain,$domainextension){Switch ($domainextension) { case ".it": case ".at.it": case ".co.it": case ".go.it": case ".is.it": case ".me.it": case ".to.it": case ".tv.it": $domainexists = checkinextension($domain,$domainextension); break; case ".net": case ".com": case ".biz": case ".info": case ".org": $domainexists = checkoutextension($domain,$domainextension); break; } return $domainexists; }
function checkinextension ($domain,$domainextension) {if ($domain) {
if (trim($domain) <> "") { $domain = trim($domain); $domain .= $domainextension; $fp = fsockopen("whois.nic.it", 43, $errno, $errstr, 30); if (!$fp) { $server="-1"; } else { fputs($fp, "$domain\r\n"); $server = "0"; while (!feof($fp)) { $buf = fgets($fp,128); if (ereg("No entries found ", $buf))
130
{ $server = "1"; } } fclose ($fp); return $server; } }}}
function checkoutextension ($domain,$domainextension) {if ($domain) {
if (trim($domain) <> "") { $domain = trim($domain); $domain .= $domainextension; $fp = fsockopen("whois.networksolutions.com", 43, $errno, $errstr, 30); if (!$fp) { $server="-1"; } else { fputs($fp, "$domain\r\n"); $server = "0"; while (!feof($fp)) { $buf = fgets($fp,128); if (ereg("NO MATCH", $buf)|| ereg("NOT FOUND", $buf)|| ereg("No Match", $buf)|| ereg("Not found", $buf)|| ereg("not found", $buf)|| ereg("no match", $buf)) { $server = "1"; } } fclose ($fp); return $server; } }}}require_once('nusoap/nusoap.php');$server=new soap_server;$server->register('selectdomaincheck');$server->service($HTTP_RAW_POST_DATA);?>
Il client invocherà il Web services tramite il seguente codice :
<?php
require_once('nusoap/nusoap.php');
$parameters = array(
"domain" =>"salvatoreiacometta",
"domainextension" =>".it"
);
131
$soapclient = new soapclient('http://il-nostro-webservices/checkdomain.php');
$result = $soapclient->call('selectdomaincheck',$parameters);
print $result;
?>
D.1.2 Codice in PHP per interrogare il web services di Google
Si ricorda che prima di provare il seguente esempio, occorre registrarsi per
poter ottenere una chiave necessaria per poter utilizzare i servizi del web services di
Google. La registrazione si effettua su questo sito:
http://www.google.it/apis/index.html:
<?php/*include la classe base (il file nusoap.php)*/INCLUDE("./NUSOAP/NUSOAP.PHP");
/*crea un istanza del client SOAP e indica l'indirizzo del servizio*/$soapclient = new soapclient("http://api.google.com/search/beta2");
/*decommenta la riga seguente per vedere i messaggi di debug*/// $soapclient->debug_flag = 1;
/*Google vuole che la request venga confezionata con il seguente namespace*/$namespace = 'urn:GoogleSearch' ;
/*L'array con i parametri da passare alla procedura remota*/$parametri = array(
//la chiave di accesso fornitaci con l'iscrizione//'key' => 'XXX-TUA_CHIAVE_ACCESSO-XXX',
'key' => 'mL+nrSVQFHJF5ev2AaCAz9XivPzQLqdb',
//i parametri per la ricerca
'q' => '"salvatore iacometta',
//Il risultato da cui iniziare la visualizzazione
132
'start' => 0,
//Il numero di risultati da restituire (max 10)'maxResults' => 8,
//Elimina i duplicati'filter' => true,
//Circoscrive in base all'argomento//o al TLD (top level domain, es .it)'restrict' => '',
//Elimina i siti per adulti'safeSearch' => false,
//Seleziona il linguaggio (si può omettere)'lr' => 'lang_it',
//Codifica usata per la request (default UTF-8)'ie' => '',
//Codifica usata per la risposta (default UTF-8)'oe' => '');
/*Invoca la procedura remota "doGoogleSearch"*/$risposta = $soapclient->call("doGoogleSearch", $parametri, $namespace);
/*Se riceve una risposta SOAP di errore la stampa*/if($soapclient->fault){
echo('ERRORE! '.$soapclient->faultstring."\n<br>") ;
}
else{
/*DIMOSTRATIVOStampa l'array completo con il risultato della ricerca*/
echo('<pre>') ;
print_r($risposta);
echo('</pre>') ;
}
/*DIMOSTRATIVOStampa la richiesta in XML, la risposta e la stringa di debug*/
echo '----------------------------------------------------------------';
133
echo '----------------------------------------------------------------';echo 'Request: <xmp>'.$soapclient->request.'</xmp>';echo '----------------------------------------------------------------';echo '----------------------------------------------------------------';echo 'Response: <xmp>'.$soapclient->response.'</xmp>';echo '----------------------------------------------------------------';echo '----------------------------------------------------------------';echo '----------------------------------------------------------------';echo 'debug_str: <xmp>'.$soapclient->debug_str.'</xmp>';echo '----------------------------------------------------------------';echo '----------------------------------------------------------------';
?>
D.1.3 La stampa di Request e Response di un Web Services che reperisce suLDAP informazioni su certificati-client
Per curiosità, qui di seguito viene riportato il risultato dell’applicazione relativa al
paragrafo “6.4 Un esempio completo: web services su https che interroga LDAP ”:
STATO CLIENT:ABILITATO
RequestPOST /webservices/restituisciclient.php HTTP/1.0User-Agent: NuSOAP/0.6.6Host: 81.118.52.132:443Content-Type: text/xml; charset=ISO-8859-1SOAPAction: ""Content-Length: 568
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:si="http://soapinterop.org/xsd"><SOAP-ENV:Body><ns1:estraidatixmlns:ns1="http://testuri.org"><CN xsi:type="xsd:string">CLIENTE-DEL-SITO-CIOCC-E-AFFINI</CN></ns1:estraidati></SOAP-ENV:Body></SOAP-ENV:Envelope>
ResponseHTTP/1.1 200 OKDate: Tue, 26 Oct 2004 17:46:36 GMTServer: Apache/1.3.31 (Unix) mod_ssl/2.8.19 OpenSSL/0.9.6 PHP/4.3.7X-Powered-By: PHP/4.3.7Status: 200 OKContent-Length: 528Connection: closeContent-Type: text/xml; charset=ISO-8859-1
134
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:si="http://soapinterop.org/xsd"><SOAP-ENV:Body><estraidatiResponse><soapValxsi:type="xsd:string">attivo</soapVal></estraidatiResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Debugsoapclient: call: estraidati, Array, , , ,soapclient: endpointType:soapclient: in serialize_val: CLIENTE-DEL-SITO-CIOCC-E-AFFINI, CN, , , , ,encodedsoapclient: endpoint: https://81.118.52.132/webservices/restituisciclient.php,soapAction: , namespace: http://testuri.orgsoapclient: sending msg (len: 568) w/ soapaction ''...soapclient: transporting via HTTPsoapclient: sending message, length: 568soapclient: transport debug data...soap_transport_http: scheme = httpssoap_transport_http: host = 81.118.52.132soap_transport_http: path = /webservices/restituisciclient.phpsoap_transport_http: entered send() with data of length: 568soap_transport_http: connect using httpsoap_transport_http: cURL connection set upsoap_transport_http: set cURL payloadsoap_transport_http: send and receive with cURLsoap_transport_http: No cURL error, closing cURLsoap_transport_http: found proper separation of headers and documentsoap_transport_http: cleaned data, stringlen: 528soap_transport_http: end of send()
soapclient: got response encoding: ISO-8859-1soapclient: got response, length: 528 use encoding: ISO-8859-1soapclient: Entering parseResponse(), about to create soap_parser instancesoapclient: soap_parser: Entering soap_parser(), length=528, encoding=ISO-8859-1soap_parser: found root struct estraidatiResponse, pos 2soap_parser: inside buildVal() for estraidatiResponse(pos 2) of type structsoap_parser: parsed successfully, found root struct: 2 of nameestraidatiResponse
soapclient: sent message successfully and got a(n) array back
Osservando Request e Response noteremo le stringhe XML (la conversione in
XML è realizzata dalla libreria NUSOAP).
135
D.2 Un sito per testare le applicazioni
Per poter testare tutte le applicazioni realizzate in questa tesi, è stato costruito
un sito web utilizzando Swish, visibile al seguente indirizzo:
http://81.118.52.132/
Si presenta più o meno così:
D.2.1 Scaricare i certificati per i test
Nella sezione “Certificati”, è possibile scaricare dei certificati-client da utilizzare
per effettuare dei test.
136
D.2.2 Il link ai servizi offerti
Nella sezione “Servizi”
è possibile scegliere uno delle applicazioni da testare, illustrate nel capitolo 6 al
paragrafo “6.5 Applicazioni pratiche realizzate”.
137
D.2.3 Invocare il Web services su https da http: “L’esempio 6.5.5”
Infine, nella sezione “Altro”, è possibile seguire passo passo l’applicazione
illustrata nel capitolo 6 paragrafo “6.5.5 Applicazione da un server esterno (Aruba)”.
In questa ultima applicazione è interessante notare come, partendo dal sito
http://www.salvatoreiacometta.it/TESI/applicazione_tesi.php
si richiama una pagina che si trova su
https://81.118.52.132/…….
Da qui viene invocato il Web services, che restituisce le informazioni relative al
certificato-client.
Ora si richiama la pagina
http://www.salvatoreiacometta.it/TESI/esito.html
e si prosegue di conseguenza.
Questa ultima applicazione fa ben comprendere che il gestore del sito
“www.salvatoreiacometta.it”, ignora completamente i dati del certificato-client di un suo
“visitatore”; la responsabilità di far procedere il “visitatore” nel sito è lasciata
interamente al Web services.
139
Conclusioni e sviluppi futuri
Una volta che sono stati portati a termine tutti gli studi relativi a questo lavoro di
tesi e dopo aver concluso la realizzazione pratica di tutti gli applicativi, si può senza
dubbio concludere che sono molti gli argomenti che fino a poco tempo fa ignoravo e su
cui ora sento di avere una discreta padronanza.
Anche se da anni lavoro come analista programmatore in un’azienda di servizi,
questo lavoro di tesi mi ha portato a documentarmi su cose che fino ad ora non avevo
mai trattato.
Grazie all’azienda per la quale lavoro, ho avuto la possibilità di fare delle prove
pratiche importanti per comprendere a pieno alcuni concetti.
Il fatto di avere avuto a disposizione un indirizzo pubblico da poter assegnare
alla macchina sulla quale ho fatto tutto il lavoro di tesi, mi ha permesso di simulare
perfettamente ogni situazione reale.
Il mondo dell’autenticazione su Internet che guardavo fino a poco tempo fa con
molto sospetto e che etichettavo in modo spietato come inaffidabile mi trova oggi più
fiducioso.
Infine la creazione di un Web services che mette a disposizione un servizio
legato all’autenticazione e alla connessione sicura, conclude il mio lavoro di tesi che
completa il percorso che era partito con l’intento di realizzare un server che
supportasse la connessione sicura.
La realizzazione di un Web Services che può essere invocato a seguito
dell’esibizione di un certificato oppure che mette a disposizione servizi che hanno
come input alcuni dati del certificato esibito, ne mette in risalto l’utilità e apre la strada a
una più frequente realizzazione di Web Services per l’autenticazione su infrastruttura
PKI/LDAP.
140
Bibliografia
[1] Morena Bonezzi "Le tecnologie WWW in ambito wireless: una applicazionepush/pull sicura WAP integrata con SMS" (Sicurezza informatica)
[2] http://security.fi.infn.it/CA/istruzioni.pdf (Autenticazione e crittografia)
[3] http://www.campana.vi.it/ottavio/Vari (LDAP )
[4] http://www.ziobudda.net/Recensioni/vedi_recensione.php?ff=35 (Installazioni econfigurazioni)
[5] http://www.vaisulweb.it/index.php?/vaisulweb/content/view/full/438/ (PHP & WebServices )
Software utilizzato
Sistema operativo: Linux (Debian 30R2)
Database: MySQL 3.22.32 PhpMyAdmin 2.2.7 (interfaccia in PHP per gestire mysql)
Server:
Apache 1.3.31
mm 1.1.3
mod_ssl 2.8.19 -1.3.31
Openssl 0.9.6
Ambiente di sviluppo: PHP 4.3.7
Protocollo LDAP:
Berkeley Db 4.1.25 (database backend per ldap)
OpenLDAP 2.1.16
PhpLDAPAdmin-0.9.4b (interfaccia in PHP per gestire LDAP)
Classi in PHP per consumare Web Services: Nusoap.0.6.4
Tool per il trasferimento over https di dati in XML: Curl-7.12.1
Client ssh: Putty 0.53b
Sniffer: Sniff’em
HTML editing e web management program: Macromedia Dreamweaver MX 6.0
Applicativo per animazioni su Web: Swish 2.0
141
142
Ringraziamenti
Per questo lavoro di tesi mi preme molto ringraziare il Prof. Ing. Nicola Frega
per il suo supporto, i suoi consigli, i suoi suggerimenti, i suoi chiarimenti, le sue
spiegazioni e soprattutto per la sua pazienza e disponibilità.
Un grande ringraziamento va al Prof. Antonio Volpentesta per avermi dato la
possibilità di lavorare su un argomento così stimolante che ha contribuito ad arricchire
molto la mia esperienza professionale.
Ringrazio i responsabili del reparto sviluppo dell’azienda Datel s.p.a. di Crotone
per la quale lavoro da sette anni come analista programmatore per avermi dato la
possibilità di poter usufruire delle strutture aziendali per portare a termine questo lavoro
di tesi.
Il mio più grande ringraziamento va ovviamente alla mia famiglia e in particolar
modo ai miei genitori che mi hanno costantemente incoraggiato e sostenuto in questa
lunga carriera universitaria.
La conclusione degli studi vuole essere soprattutto un piccolo riconoscimento
per il loro smisurato e insostituibile amore nei miei confronti.
E’ ovvio, però, che questi ringraziamenti non avrebbero alcun senso se non mi
rendessi conto che l’unico a cui rendere davvero grazie è coLui che continuamente e
incondizionatamente mi dona il Suo Amore. Ringrazio Dio per avermi fatto incontrare
nella mia vita delle persone che testimoniano il Suo Amore per me.