You are on page 1of 6

CP pensareprogettareprogrammare n.

136 giugno 2004

Autenticazione SSL su Apache


di Massimo Nardone
In questarticolo mostreremo come autenticare un utente Web, munito di Certicato SSL, per una determinata risorsa del Server HTTP Apache

Massimo Nardone ` E laureato in Scienze dellInformazione presso ` lUniversita di Saler` no. Si e occupato di Sicurezza, Mobile ed implementazioni Web per molti anni come Security Chief Architect, Research and Software Engineer presso unazienda di Telecomunicazioni Finlandese. Ha collaborato inoltre come revisionatore tecnico per molti libri sulla sicurezza. Attualmente lavora come Technical Account Manager, Project Manager e Security Specialist per unazienda di servizi Mobile Finlandese. Si occupa inoltre di ricerca ed implementazione per la sicurezza dei protocolli come assistente e supervisore delle esercitazioni per lesame di Security of Communication Protocols presso lHelsinki University of Technology (HUT) in Finlandia.

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomedia


Infomedia
` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of Computer Programming, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2004 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2004 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di Computer Programming sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2004 Infome` dia e rilasciato con Licenza Creative Commons 2.5 BYNC-ND. Il contenuto Turing Club e 2004 Turing Club ` e rilasciato con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

web

Autenticazione SSL su Apache


In questarticolo mostreremo come autenticare un utente Web, munito di Certificato SSL, per una determinata risorsa del Server HTTP Apache
di Massimo Nardone

artiamo dal presupposto che la necessit di un protocollo sicuro sia ormai fondamentale in unepoca in cui Internet si talmente sviluppato da permettere agli utenti di svolgere innumerevoli operazioni. Bisogna ricordare che protocolli come HTTP per navigare e mostrarci pagine Web o protocolli come IMAP per leggere la nostra posta elettronica, utilizzano di base il protocollo TCP/IP, che fondamentalmente vulnerabile nel senso che i dati che vengono trasmessi sono in chiaro e quindi facilmente leggibili e intercettabili in fase di trasferimento.

FIGURA 1

Larchitettura del SSL

Introduzione allSSL
SSL (Secure Sockets Layer) permette di gestire lintegrit dei dati e la privacy delle informazioni trasmesse sul web e, come vedremo pi in dettaglio, lautenticazione di noi stessi e del server con cui ci colleghiamo. Internet, in fin dei conti, si basa su di uno scambio di dati tra un client (il nostro browser), ed un server (ovvero la macchina che contiene i dati di cui abbiamo bisogno). SSL non far nientaltro che crittare le informazioni (ovvero i dati) tra il server ed il nostro client. I pi importanti metodi di crittografia sono notoriamente quelli simmetrici e quelli asimmetrici. Tra i software pi utilizzati, soprattutto con il server HTTP Apache, ricordiamo OpenSSL ed il modulo mod_ssl, con cui possiamo creare le chiavi ed una richiesta di certificazione. Possiamo dire che SSL un protocollo a due livelli: SSL Record Protocol: questo protocollo verr utilizzato per lincapsulamento di tutti i dati, sia in ricezione che in trasmissione, e fornisce i servizi basilari di sicurezza ai vari protocolli di livello pi alto;

I tre pi alti livelli del protocollo sono definiti come parte di SSL e riguardano: SSL Alert Protocol: per comunicare i messaggi di errore SSL tra client e server; SSL Change Cipher Spec Protocol: per concordare la Cipher Suite per la sessione; SSL Handshake Protocol: per negoziare i vari parametri di sicurezza per una connessione SSL. Prevede una procedura suddivisa in diverse fasi, tra le quali: negoziare la Cipher Suite da utilizzare durante il trasferimento dati; creare e controllare la chiave di sessione tra client e server; opzionalmente autenticare il server per il client; opzionalmente autenticare il client per il server. Larchitettura del SSL mostrata in Figura 1. Alcuni tra tutti gli algoritmi utilizzati dal protocollo SSL possono essere: RC4 128 bit e MD5, RC2 128 bit CDC e MD5, DES 64 bit CBC e MD5, DES 192 bit EDE3 CBC e MD5. Tra le azioni principalmente utilizzate con il protocollo SSL ricordiamo lautenticazione del SSL server e lautenticazione del SSL client su cui si basa il nostro articolo.

Cos un certificato SSL


Massimo Nardone
mnardone@infomedia.it laureato in Scienze dellInformazione presso lUniversit di Salerno. Si occupato di Sicurezza, Mobile ed implementazioni Web per molti anni come Security Chief Architect, Research and Software Engineer presso unazienda di Telecomunicazioni Finlandese. Ha collaborato inoltre come revisionatore tecnico per molti libri sulla sicurezza. Attualmente lavora come Technical Account Manager, Project Manager e Security Specialist per unazienda di servizi Mobile Finlandese. Si occupa inoltre di ricerca ed implementazione per la sicurezza dei protocolli come assistente e supervisore delle esercitazioni per lesame di Security of Communication Protocols presso lHelsinki University of Technology (HUT) in Finlandia dove vive e lavora da pi di 7 anni.

In sostanza un certificato SSL un file che consente di crittografare qualunque informazione scambiata (una pagine web, la vostra posta elettronica, ecc.), nonch di offrire garanzia di identit verso il server web con cui stiamo interagendo. Un certificato digitale, pi in dettaglio una chiave pubblica che stata firmata da una CA. Il browser conosce le chiavi pubbliche di diverse CA, e pu quindi facilmente controllare che la firma sia corretta. Il certificato, quindi, ci permetter di effettuare transazioni sicure, indispensabili ad esempio nelle-commerce, specialmente per lutilizzo dei dati sensibili delle carte di credito, password e cos via. Il certificato contiene le seguenti informazioni:
Computer Programming n. 136 - Giugno 2004

42

PROGRAMMING
TABELLA 1
Contenuto del campo Distinguished Name

Campo Common Name Organization or Company Organizational Unit City/Locality State/Province Country Email Address

Abbreviazione CN O OU L SP C E

Descrizione Il Nome certificato Il Nome associato a questa Organizzazione Il Nome associato a questa unit di Organizzazione o dipartimento Localit o Citt del Nome certificato Stato o Provincia del Nome certificato La Nazione del Nome certificato (codifica ISO) Lindirizzo Email del Nome certificato

Esempio CN=Massimo Nardone O=LaMiaOrganizzazione OU=IlMioDipartimento L=Roma SP=Roma C=IT E=mnardone@netlab.hut.fi

Soggetto: Distinguished Name, Public Key Emittente: Distinguished Name, Signature Periodo di Validit: Not Before Date, Not After Date Informazioni Amministrative: Version, Serial Number Altre informazioni varie

my $key = $query->param(SPKAC);

Prima di tutto prendiamo il valore KEYGEN contenuto nel campo SPKAC.


my $count = 1.rand 1000;

Il campo Distinguished Name utilizzato per provare lidentit del certificato in qualche specifico contesto, come ad esempio per provare lidentit di un certo dipendente di unazienda o quella di un utente nellaccedere una certa risorsa della rete. Questo campo definito dallo standard X.509, il quale stabilisce i campi, le descrizioni e le abbreviazioni che lo compongono. Le informazioni relative al campo Distinguished Name sono riportate nella Tabella 1.

my $req_file = cert$count.req; # certificate request filename my $result_file = cert$count.result; # certificate filename my @req_names = (commonName, emailAddress, organizationName, organizationalUnitName, localityName, stateOrProvinceName,countryName, SPKAC);

Creazione di un certificato Client


Esistono molti metodi per creare i certificati SSL. Molto utilizzato ad esempio linterfaccia CA.pl contenuta in OpenSSL. Vogliamo mostrare, adesso, la creazione di un certificato client utilizzando un semplice script Perl chiamato da una pagina HTML. Partiamo creando una pagina HTML con i dati di cui il nostro certificato client ha bisogno. La nostra richiesta inizier creando la FORM di richiesta HTML di cui vi riportiamo alcuni passi principali:
<FORM NAME=GenerateForm ACTION=/cgi-bin/crea_cert.pl> <TABLE> <TR><TD>Nome da Certificare:</TD><TD> <INPUT TYPE=TEXT NAME=commonName VALUE=Massimo Nardone SIZE=30> </TD></TR> <TR><TD>Organizzazione:</TD><TD> <INPUT TYPE=TEXT NAME=organizationName VALUE=LaMiaOrganizzazione size=20> </TD></TR>

Prepariamo i file per la richiesta e per il risultato del certificato client da creare, nonch i valori da prendere dalla nostra FORM HTML:
open(REQ, >$req_file) or errore(Creazione file di richiesta certificato client fallita. $req_file: $!); my $name; foreach $name (@req_names) { my $value = $query->param($name); $value =~ tr/\n//d; print REQ $name = $value\n; } close(REQ);

FIGURA 2

Creazione della chiave privata

La FORM HTML include uno speciale TAG di nome <KEYGEN> , per far si che il browser generi la coppia di chiavi, pubblica e privata, e rimandi in output la chiave pubblica come valore della variabile SPKAC. Ricordiamo che ad ogni modo keygen un parametro specifico per il browser Netscape e quindi ignorato dal browser Internet Explorer. Definiamo questo TAG nella form HTML in questo modo:
<KEYGEN NAME=SPKAC CHALLENGE=Mychallenge>

La Figura2 mostra come il browser Netscape genera le chiavi. Si generer poi la richiesta che verr spedita al file script crea_cert.pl. Vediamone i punti principali.
Computer Programming n. 136 - Giugno 2004

43

web
Apriamo quindi il file di richiesta e scriviamoci i valori della FORM html, pi la chiave pubblica contenute nel campo SPKAC:
my $cmd = openssl ca -config $CONFIG -spkac $req_file -out $result_file -days 360; my $rc = system($cmd -key $CAPASS 2>errori); if($rc != 0) { errore($cmd<P>rc = $rc, errori); } RANDFILE = $dir/private/.rand

Con la prima riga qui sopra lanciamo quindi il comando openssl ca per la creazione del nostro certificato client. Se tutto va bene prender in input il file di richiesta e creer il file di risultato, altrimenti ci mostrer lerrore. Il file di richiesta generato avr questo contenuto:
commonName = Massimo Nardone emailAddress = mnardone@netlab.hut.fi organizationName = LaMiaOrganizzazione organizationalUnitName = IlMioDipartimento localityName = Roma stateOrProvinceName = Roma countryName = IT SPKAC = MIIBRTCBrzCBnzANBgkqhkiG9w0BAQEFAAOB

A questo punto apriamo il file risultato contenente il certificato, ovvero CERT, e lo spediamo direttamente, sotto forma di tipo application/x-x509-user-cert, al browser Netscape che lo inserir direttamente tra i certificati client che potremmo utilizzare pi tardi, per la nostra demo dautenticazione. La gestione degli eventuali errori assegnata ad una sub di nome errore. Il certificato client generato mostrato in Figura 3.
open(CERT, <$result_file) or errore(Apertura file risultato fallita $result_file<P>$!); print Content-Type: application/x-x509-user-cert\n; my $cert_data = join , <CERT>; close CERT; print Content-Length: , length($cert_data), \n\n$cert_data;

Il contenuto del campo SPKAC normalmente molto pi lungo e ne abbiamo riportato qui solo una parte per questioni di spazio. Come si vede utilizziamo il file di configurazione openssl.cnf che contiene informazioni sulla posizione dei certificati, le chiavi ed altro utilizzato per la creazione del nostro certificato client. Vediamone il contenuto per lopzione ca utilizzata nel nostro script:
[ ca ] default_ca [ CA_default ] dir certs crl_dir database new_certs_dir certificate serial crl private_key = C:/apache/test/demoCA/ = $dir/certs = $dir/crl = $dir/index.txt = $dir/newcerts = $dir/cacert.pem = $dir/serial = $dir/crl.pem = $dir/private/cakey.pem = CA_default

IIl protocollo SSL permette


di gestire lintegrit dei dati e la privacy delle informazioni trasmesse sul web
Installazione dei certificati
Abbiamo visto fin qui come creare certificati SSL. Adesso rapidamente vediamo come installarli nel nostro browser. Solitamente per installare i certificati SSL basta semplicemente aprire il certificato, che ha estensione ad esempio .crt, .cer o .der e seguire poi le istruzioni dinstallazione. Altre alternative possono essere quelle di richiedere linstallazione nel nostro browser dei certificati contenuti nel server http semplicemente e direttamente utilizzando un link in questo modo:
http://MioWebServer:80/certs/ca.crt

FIGURA 3

Certificato Client SSL

Per far questo per, verr utilizzato il HTTP ContentType application/x-x509-ca-cert ed avremo quindi bisogno di inserire la linea AddType application/x-x509-ca-cert .crt nel file di configurazione del web server Apache httpd.conf. Un altro modo per installare un certificato nel nostro browser quello di scrivere un semplice script che spedisca il certificato come tipo application/x-x509-ca-cert o application/x-x509-user-cert direttamente nel browser. Il Listato 1 ci mostra ad esempio come installare nel browser il certificato CA ca.crt precedentemente creato.

Configurazione di Apache e Autenticazione


Una volta creati ed installati nel Browser tutti i certificati e le rispettive chiavi, finalmente iniziamo a dimostrare come configurare Apache per realizzare una Autenticazione di una certa risorsa del server, utilizzando il nostro certificato client. Per la sua sicurezza, Apache si adatta perfettamente alla realizzazione di unapplicazione di autenticazione con certificato client su connessione SSL. Mostreremo come utilizzare, ad esempio, solo i certificati client firmati con il certificato della nostra CA o 44
Computer Programming n. 136 - Giugno 2004

PROGRAMMING
LISTATO 1
Script per linserimento di un certificato CA nel browser

#!/usr/bin/perl use strict; my $cert_dir = /demoCA/certs; my $cert_file = ca.crt; my $cert_path = $cert_dir/$cert_file; my $cert_data = ; open(CERT, <$cert_path); while(<CERT>) { $cert_data .= $_; } close(CERT); print Content-Type: application/x-x509-ca-cert\n; print Content-Length: , length($cert_data), \n\n$cert_data; 1;

come utilizzare qualsiasi certificato client. Prima di tutto configuriamo una nuova directory nel file httpd.conf di Apache in questo modo:
ScriptAlias /cert/ c:/apache/cert/ <Directory c:/apache/cert> AllowOverride None Options None Order allow,deny Allow from all </Directory>

Nel file ssl.conf iniziamo configurando il certificato Server e la sua chiave in questo modo:
SSLCertificateFile conf/ssl.crt/server.crt SSLCertificateKeyFile conf/ssl.crt/server.key

gurazione qui sopra vediamo che con la riga SSLVerifyClient require forzeremo il web server a richiedere un certificato client valido per accedere alla risorsa c:/apache/cert che abbiamo precedentemente configurato. Mentre, con SSLVerifyDepth 1, comunichiamo al server con quanta profondit deve ricercare e stabilire se il certificato client ricevuto pu essere accettato come valido per accedere alla risorsa. Il valore di default 1 indica che il certificato client pu essere un certificato self-signed o firmato con il certificato CA che abbiamo appena visto e che contenuto nel parametro SSLCACertificatePath, ovvero nella directory dove sono contenuti i certificati per la CA. Il parametro SSLCACertificateFile informa Apache dove si trova fisicamente il certificato CA da utilizzare. Utilizzeremo poi lopzione SSLOptions per definire e controllare alcune azioni di tipo run-time, per determinate directory. FakeBasicAuth , ad esempio, unopzione mediante la quale il campo Subject Distinguished Name (DN) del certificato X509 tradotto nel HTTP Basic Authorization username, in modo tale da poter utilizzare il metodo standard per fare autenticazione nel server http Apache. Il parametro SSLRequireSSL informa il server che tale risorsa accedibile solo ed esclusivamente con una connessione sicura (HTTPS) invece di HTTP. Penso sia il caso di soffermarci particolarmente sullultima opzione, ovvero SSLRequire, che ci permetter infine di determinare quali informazioni, sotto forma di variabili Apache standard CGI/1.0, sono strettamente richieste del web server Apache quando si cercher di accedere a questa risorsa con il nostro certificato client. Pi richieste possono essere inserite con riferimento Booleano. Nel nostro esempio abbiamo richiesto che il Subject Distinguished Name Organization del nostro certificato X509 contenuto nella variabile SSL_CLIENT_S_DN_OU abbia un valore uguale a LaMiaOrganizzazione e cos via con gli altri parametri.

Ora supponiamo che il nostro sia un esempio mediante il quale vogliamo accedere alla nostra risorsa con certificati client validi emessi, firmati ed accettati dal certificato della CA creato da noi pocanzi. Potremmo ad esempio configurare il file ssl.conf in questo modo:
SSLVerifyClient SSLVerifyClient SSLVerifyDepth none require 1

Conclusioni
chiaro che Internet ci permetter di fare sempre pi cose ed quindi di fondamentale importanza prenderci cura del livello di sicurezza nel trattare i nostri dati personali. Ci auguriamo di ritrovarvi presto, magari per il prossimo articolo quando ad esempio mostreremo come fare autenticazione utilizzando un LDAP Server. Ci auguriamo vivamente di avervi trasmesso linteresse per la crittografia ed il mondo dellinfrastruttura a chiave pubblica (PKI).

<Directory c:/apache/cert>

SSLCACertificateFile conf/ssl.crt/ca.crt SSLCACertificatePath conf/ssl.crt SSLOptions SSLRequireSSL SSLRequire ( %{SSL_CLIENT_S_DN_O} eq LaMiaOrganizzazione \ and %{SSL_CLIENT_S_DN_OU} in {Vendite, Sviluppo, Marketing}\ and %{SSL_CLIENT_S_DN_CN} eq Massimo Nardone and %{SSL_CLIENT_M_SERIAL} eq 1234567890 ) </Directory> +FakeBasicAuth

BIBLIOGRAFIA & RIFERIMENTI


[1] Klaus Schmeh, Cryptography and Public Key Infrastructure on the Internet, John Wiley & Sons, 2003 [2] Tom Austin, PKI: A Wiley Tech Brief, John Wiley & Sons, 2001 [3] Andrew Nash, et al., PKI: Implementing & Managing ESecurity, Osborne McGrawHill, 2001 [4] John Viega et al., Network Security with OpenSSL Cryptography for Secure Communications, Oreilly, 2002 [5] Mohammed J. Kabir, Apache Server 2 Bible, John Wiley & Sons, 2002 [6] Marco Ferrante, OpenSSL per la posta sicura, Computer Programming n. 117 [7] Public Key Cryptography Standards, RSA Lab. Tech. Notes, http://www.rsasecurity.com/rsalabs/pkcs/ [8] Kipp E.B. Hickman, The SSL Protocol, 1995. http://www.netscape.com/eng/security/SSL_2.html

A questo punto, quando cercheremo di accedere alla risorsa definita qui sopra, ad esempio scrivendo un link come https://localhost:443/cert/ il server http Apache ci richieder obbligatoriamente di identificare lidentit del nostro browser aprendo la finestra che coniene i nostri certificati client, per selezionare quale vogliamo spedire al server. Ricordiamo che https indica la connessione sicura http con lutilizzo del protocollo SSL. Dando unocchiata alla confiComputer Programming n. 136 - Giugno 2004

CODICE ALLEGATO
ftp.infomedia.it
AuthSSL

45

You might also like