Apache e SSL: configurazione https e creazione certificati

In questo articolo vedremo come configurare Apache per lavorare sul protocollo HTTPS sfruttando le potenzialità di OpenSSL su un qualunque sistema Linux (per i miei test ho utilizzato Ubuntu 9.04, Apache 2.2.11, OpenSSL 0.9.8g).
Per prima cosa installeremo OpenSSL, poi attraverso la console genereremo una CA (Certificate Authority) e successivamente il certificato server, poi configureremo Apache per funzionare sul protocollo https. Infine vedremo come creare un’area il cui accesso è riservato solo a coloro che possiedono un certificato client.

Installare OpenSSL

Aprite la console e scrivete il seguente comando:

$ sudo apt-get install openssl

e il gioco è fatto!

Generare una C.A.

Al mondo esistono numerose e affidabili Certificate Authority che rilasciando certificati con un alto livello di sicurezza, ma richiedono un pagamento, ma per sistemi intranet o altri che non richiedono un altissimo livello di sicurezza è possibile creare e utilizzare una propria CA.

Di seguito i comandi per effettuare l’operazione:
con i primi due comandi creiamo una directory in cui posizioneremo i certificati
il terzo comando crea la chiave privata
il quarto genera un certificato X.509 con 10 anni di vita
l’ultimo comando permette di vedere le informazioni sul certificato

E’ fortemente consigliato di conservare la password in un posto sicuro, inoltre sarà necessario digitarla ogni volta che si vuole firmare un nuovo certificato.

# mkdir /root/ca
# cd /root/ca/
 
# openssl genrsa -des3 -out my-ca.key 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
....................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for my-ca.key:
Verifying - Enter pass phrase for my-ca.key:
 
# openssl req -new -x509 -days 3650 -key my-ca.key -out my-ca.crt
Enter pass phrase for my-ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [SM]:SM
State or Province Name (full name) [San Marino]:San Marino
Locality Name (eg, city) []:
Organization Name (eg, company) [VenCom]:VenCom
Organizational Unit Name (eg, section) []:Certificate Authority
Common Name (eg, YOUR name) []:VenCom CA
Email Address []:info@example.com
 
# openssl x509 -in my-ca.crt -text -noout

Generare la chiave e il certificato per il Web server

I passi che seguiremo sono i seguenti:
generare la chiave privata
creare una richiesta di certificatione
firmare il certificato con la CA precedentemente generata
rimuovere la password dalla chiave privata
visualizzare le informazioni del certificato

E’ importante tenere presente che il certificato server deve essere a 512 o 1024 bits per evitare problemi di supporto con alcuni browser.

# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..........++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
 
# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [SM]:SM
State or Province Name (full name) [San Marino]:San Marino
Locality Name (eg, city) []:
Organization Name (eg, company) [VenCom]:VenCom
Organizational Unit Name (eg, section) []:Web Services
Common Name (eg, YOUR name) []:www.test.local  <== questo deve essere il vero URL del sito
Email Address []:info@example.com
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
 
# openssl x509 -req -in server.csr -out server.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 365
Signature ok
subject=/C=SM/ST=San Marino/O=VenCom/OU=Web Services/CN=www.test.local/emailAddress=info@example.com
Getting CA Private Key
Enter pass phrase for my-ca.key:
 
# cp server.key server.key.org
# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
 
# openssl x509 -in server.crt -text -noout

E’ sempre buona abitudine impostare i permessi alla chiave:

# chmod 0400 *.key

NOTA: rimuovere la password dalla chiave privata è una tecnica sconsigliata, ma la più veloce per evitare che il server web richieda la password ad ogni avvio. Infatti, se si mantiene la chiave protetta, ad ogni avvio, Apache non sarà in grado di accedervi, bloccando l’operatività, finchè un utente non inserisce la password manualmente. Sono presenti altre tecniche per aggirare il problema, ma questo argomento esula dagli scopi dell’articolo.

Configurare Apache

Controllate la directory di installazione di Apache (in Ubuntu dovrebbe essere in /etc/apache2/) e creiamo una cartella dove mantenere i certificati:

# mkdir /etc/apache2/ssl
 
# cp my-ca.crt /etc/apache2/ssl/
# cp server.key /etc/apache2/ssl/
# cp server.crt /etc/apache2/ssl/

Creiamo una directory dove posizionare il sito:

# mkdir /var/www/ssl
# chmod 0775 /var/www/ssl

per testare il funzionamento, all’interno di questo cartella create un file chiamato index.html e contenuto a piacere.

Passiamo ora alla configurazione vera e propria di Apache (/etc/apache2/sites-available/default-ssl), cercate le seguenti direttive e modificate i valori:

ServerName www.test.local
 
DocumentRoot /var/www/ssl
 
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
 
SSLCertificateFile      /etc/apache2/ssl/server.crt
SSLCertificateKeyFile   /etc/apache2/ssl/server.key
 
SSLCertificateChainFile /etc/apache2/ssl/my-ca.crt
 
SSLCACertificateFile    /etc/apache2/ssl/my-ca.crt

ora è necessario abilitare il sito (se non lo è già) con il comando:

# a2ensite default-ssl

successivamente riavviate Apache:

# /etc/init.d/apache2 restart

prima di collegarvi con il browser è necessario inserire una direttiva nel file hosts (/etc/hosts)

xxx.xxx.xxx.xxx    www.test.local

dove xxx.xxx.xxx.xxx è l’ip del server.

Ora digitando l’indirizzo https://www.test.local/ il browser vi risponderà con un avviso di sicurezza perchè non riconosce la C.A., ma sarà sufficiente consentire l’accesso al sito con le funzioni a disposizione del browser.

Generare un certificato client per l’autenticazione

A questo punto, vedremo come è possibile limitare l’accesso ad un sito ai solo utenti che hanno un certificato client. Questo metodo di autenticazione permette un alto livello di sicurezza.
Il certificato client deve essere necessariamente firmato dalla stessa CA del server.

Procederemo con i seguenti passi:
generazione della chiave e della richiesta di certificazione
firma del certificato
conversione del certificato nel formato PKCS#12
visualizzazione delle informazioni
importazione del certificato nel browser

# cd /root/ca
 
# openssl genrsa -des3 -out client.key 1024
Generating RSA private key, 1024 bit long modulus
.................................................++++++
..............................++++++
e is 65537 (0x10001)
Enter pass phrase for client.key:
Verifying - Enter pass phrase for client.key:
 
# openssl req -new -key client.key -out client.csr
Enter pass phrase for client.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [SM]:SM
State or Province Name (full name) [San Marino]:San Marino
Locality Name (eg, city) []:
Organization Name (eg, company) [VenCom]:VenCom
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:John Smith
Email Address []:john@example.com
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
 
# openssl x509 -req -in client.csr -out client.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 365
Signature ok
subject=/C=SM/ST=San Marino/O=VenCom/CN=John Smith/emailAddress=john@example.com
Getting CA Private Key
Enter pass phrase for my-ca.key:
 
# openssl pkcs12 -export -in client.crt -inkey client.key -name "John Smith Certificate" -out client.p12
Enter pass phrase for client.key:
Enter Export Password:
Verifying - Enter Export Password:
 
# openssl pkcs12 -in client.p12 -clcerts -nokeys -info

Come password di export dovrebbe essere scelta una diversa da quella della chiave privata.
L’utente finale deve solo ricevere il file client.p12 e la password di export.

È necessario importare il certificato nel browser per consentire il riconoscimento (per Firefox: strumenti -> opzioni -> avanzate -> cifratura -> mostra certificati -> certificati personali -> importa).

Configurare un sito per l’accesso esclusivo ai possessori di un certificato client

E’ sufficiente aprire il file con la configurazione del sito ssl (/etc/apache2/sites-available/default-ssl), cercate le seguenti direttive e modificate i valori:

SSLVerifyClient require
SSLVerifyDepth  10

successivamente riavviate Apache:

# /etc/init.d/apache2 restart

A questo punto dovrebbe essere tutto funzionante e connettendosi con il browser verrà richiesto di fornire il certificato client.

Configurazioni avanzate per la generazione di certificati

Nei passi precedenti abbiamo generato dei certificati con le impostazioni di default dell’utility OpenSSL. È possibile, però, aggiungere delle impostazioni avanzate per generare certificati che rispondano a maggiori criteri di sicurezza. Tra i dettagli che spiccano principalmente nei certificati precedentemente generati, è che hanno versione 1.
Per creare certificati di versione 3 è necessario apportare le seguenti modifiche:

per prima cosa bisogna aggiungere le seguenti righe al file /etc/ssl/openssl.cnf:

[ server_cert ]
 
basicConstraints=CA:FALSE
 
keyUsage=digitalSignature, keyEncipherment
 
extendedKeyUsage=serverAuth
 
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
 
[ client_cert ]
 
basicConstraints=CA:FALSE
 
keyUsage=digitalSignature, keyEncipherment
 
extendedKeyUsage=clientAuth
 
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

A questo punto bisogna rivedere i comandi con cui sono stati generati i certificati.
Per quello server, sostituire il comando:

# openssl x509 -req -in server.csr -out server.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 365

con:

# openssl x509 -req -in server.csr -out server.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 365 -extfile /etc/ssl/openssl.cnf -extensions server_cert

Per quello client, sostituire il comando:

# openssl x509 -req -in client.csr -out client.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 365

con:

#openssl x509 -req -in client.csr -out client.crt -sha1 -CA my-ca.crt -CAkey my-ca.key -CAcreateserial -days 365 -extfile /etc/ssl/openssl.cnf -extensions client_cert

Risorse

http://www.vanemery.com/Linux/Apache/apache-SSL.html
http://hausheer.osola.com/docs/9
http://www.openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS

2 thoughts to “Apache e SSL: configurazione https e creazione certificati”

Rispondi a Riccardo Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.