26.6. Impostazione di un server Web sicuro con SSL

Ogni volta che dati riservati, quali informazioni su carte di credito, vengono trasferiti fra server Web e client, è opportuno disporre di una connessione protetta e cifrata con autenticazione. mod_ssl fornisce cifratura avanzata per mezzo di SSL (secure sockets layer) e TLS (transport layer security) per la comunicazione HTTP fra un client e il server Web. Utilizzando SSL/TSL, viene stabilita una connessione fra server Web e client. L'integrità dei dati viene garantita e client e server sono in grado di autenticarsi a vicenda.

A questo scopo, prima di rispondere a una richiesta di un URL, il server invia un certificato SSL con le informazioni che dimostrano la validità dell'identità del server. Ciò garantisce anche che il server rappresenti esclusivamente il punto finale corretto per la comunicazione. Inoltre, il certificato genera una connessione cifrata tra il client e il server che può trasportare le informazioni senza il rischio di esporre il contenuto in testo normale riservato.

mod_ssl non implementa i protocolli SSL/TSL, ma funziona come da interfaccia fra Apache e una libreria SSL. OpenSSL è la libreria utilizzata in SUSE Linux. OpenSSL viene installato automaticamente con Apache.

L'effetto più visibile derivante dall'utilizzo di mod_ssl con Apache è che gli URL presentano il prefisso https:// anziché http://.

26.6.1. Creazione di un certificato SSL

Per utilizzare SSL/TSL con il server Web, è necessario creare un certificato SSL. Questo certificato è necessario per l'autorizzazione fra server Web e client, in modo che ciascuna parte possa identificare chiaramente l'altra parte. Per garantire l'integrità del certificato, questo deve essere firmato da una parte che ogni utente ritiene attendibile.

È possibile creare tre tipi di certificato: un certificato "fittizio" per solo scopo di verifica, un certificato autofirmato per un gruppo di utenti che hanno accordato fiducia e un certificato firmato da un'autorità di certificazione (CA, Certificate Authority) indipendente e conosciuta.

La creazione di un certificato è, in pratica, un processo in due fasi. Prima viene generata una chiave privata per l'autorità di certificazione, quindi il certificato del server viene firmato con questa chiave.

[Tip]Ulteriori informazioni

Per ulteriori informazioni sui concetti e le definizioni di SSL/TSL, consultare http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html.

26.6.1.1. Creazione di un certificato "fittizio"

La creazione di un certificato fittizio è semplice: è sufficiente richiamare lo script /usr/bin/gensslcert, che crea o sovrascrive i seguenti file:

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

Viene inoltre inserita una copia di ca.crt in /srv/www/htdocs/CA.crt, dove è possibile scaricarla.

[Important]Importante

Non utilizzare un certificato fittizio in un sistema di produzione; utilizzare solo a scopo di verifica.

26.6.1.2. Creazione di un certificato autofirmato

Se si sta impostando un server Web sicuro per un'intranet o per un gruppo definito di utenti, è sufficiente firmare un certificato con la propria autorità di certificazione (CA, Certificate Authority).

La creazione di un certificato autofirmato è un processo interattivo in nove fasi. Passare alla directory /usr/share/doc/packages/apache2 ed eseguire il comando seguente: ./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom. Non eseguire questo comando all'esterno di questa directory. Il programma fornisce una serie di prompt, alcuni dei quali richiedono un input da parte dell'utente.

Procedura 26.1. Creazione di un certificato autofirmato con mkcert.sh

  1. Decidere l'algoritmo di firma utilizzato per i certificati

    Scegliere RSA (R, il valore predefinito), in quanto con browser meno recenti si potrebbero verificare problemi utilizzando DSA.

  2. Generazione di una chiave privata RSA per una CA (1024 bit)

    Non è necessaria alcuna interazione.

  3. Generazione di una richiesta di firma del certificato X.509 per la CA

    Creare qui il nome distinto della CA. Ciò richiede di rispondere ad alcune domande, quale nome del paese e dell'organizzazione. Immettere dati validi, in quanto tutto ciò che viene immesso a questo punto verrà visualizzato nel certificato. Non è necessario rispondere a tutte le domande: se una domanda non è rilevante o se si desidera non fornire una risposta utilizzare ".". Il nome comune è il nome della CA stessa; scegliere un nome significativo, quale CA Azienda.

  4. Generazione di un certificato x.509 per la CA firmato da sé stessi.

    Scegliere la versione 3 per il certificato (predefinita).

  5. Generazione di una chiave privata RSA per SERVER (1024 bit)

    Non è necessaria alcuna interazione.

  6. Generazione di una richiesta di firma del certificato X.509 per SERVER

    Creare qui il nome distinto per la chiave server. Le domande sono praticamente identiche a quelle alle quali si è risposto per il nome distinto della CA. I dati immessi qui si applicano al server Web e non devono necessariamente essere identici ai dati della CA (ad esempio, se il server si trova altrove).

    [Important]Selezione di un nome comune

    Il nome comune immesso qui deve essere il nome host completo del server sicuro (ad esempio, www.example.com). In caso contrario, quando si accede al server Web, il browser genera un avviso che informa che il certificato non corrisponde al server.

  7. Generazione di un certificato X.509 firmato dalla propria CA

    Scegliere la versione 3 per il certificato (predefinita).

  8. Cifratura di una chiave privata RSA della CA con una stringa di cifratura per sicurezza.

    Si consiglia di cifrare la chiave privata della CA con una password, scegliere quindi Y e immettere una password.

  9. Cifratura di una chiave privata RSA del SERVER con una stringa di cifratura per sicurezza.

    Cifrando la chiave server con una password, sarà necessario immettere questa password ogni volta che si avvia il server Web. Ciò rende difficile automatizzare l'avvio del server all'avvio del sistema o il riavvio del server Web. Pertanto, è consigliabile rispondere N a questa domanda. Tenere presente che la chiave non è protetta quando non è cifrata con una password; accertarsi quindi che solo personale autorizzato abbia accesso alla chiave.

    [Important]Codifica della chiave del server

    Se si sceglie di cifrare la chiave del server con una password, aumentare il valore di APACHE_TIMEOUT in /etc/sysconfig/apache2. In caso contrario non si disporrà di tempo sufficiente per immettere la stringa di cifratura prima che il tentativo di avvio del server sia interrotto.

La pagina dei risultati dello script presenta un elenco di certificati e chiavi generati da esso. Contrariamente agli output dello script, i file non vengono generati nella directory locale conf, ma nella posizione corretta in /etc/apache2/.

L'ultimo passo è copiare il certificato CA da /etc/apache2/ssl.crt/ca.crt ad una posizone dove gli utenti abbiano accesso, in modo da incorporarlo nell'elenco di CA note e sicure dei browser Web. In caso contrario il browser avviserà che il certificato è stato emesso da un'autorità sconosciuta. Il certificato è valido per un anno.

[Important]Certificati autofirmati

Utilizzare un certificato autofirmato solo su un server Web al quale accedono persone conosciute e dalle quali si è ricevuta fiducia come autorità di certificazione. Non è consigliato utilizzare questo tipo di certificato per, ad esempio, un negozio.

26.6.1.3. Conseguimento di certificato firmato ufficiale

Sono disponibili varie autorità di certificazione ufficiali per la firma dei certificati. Il certificato è firmato da terze parti attendibili, che sono quindi completamente fidate. I server Web pubblici sicuri dispongono, in genere, di un certificato firmato ufficialmente.

Le CA ufficiali più note sono Thawte (http://www.thawte.com/) o Verisign (www.verisign.com). Queste e altre CA sono già compilate in tutti i browser, pertanto i certificati firmati da queste autorità sono automaticamente accettati dal browser.

Quando si richiede un certificato firmato ufficialmente, non si invia un certificato alla CA. Emettere invece una richiesta di firma del certificato (CSR, Certificate Signing Request) Per creare una CSR, richiamare lo script /usr/share/ssl/misc/CA.sh -newreq.

Prima di tutto lo script richiede una password, con la quale verrà cifrata la CSR. Viene quindi chiesto di immettere un nome distinto. Ciò richiede di rispondere ad alcune domande, quale nome del paese e dell'organizzazione. Immettere dati validi, in quanto tutto ciò che viene immesso a questo punto verrà visualizzato nel certificato e verrà verificato. Non è necessario rispondere a tutte le domande: se una domanda non è rilevante o se si desidera non fornire una risposta utilizzare ".". Il nome comune è il nome della CA stessa; scegliere un nome significativo, quale CA Azienda. Infine, è necessario immettere una password di verifica e un nome alternativo per l'azienda.

La CSR si trova nella directory dalla quale è stato richiamato lo script. Il nome del file è newreq.pem.

26.6.2. Configurazione di Apache con SSL

La porta predefinita per le richieste SSL e TLS sul server Web è la 443. I dati possono essere ricevuti sia sulla porta "normale" 80, che sulla porta SSL/TLS 443, senza il rischio di conflitti. Infatti è possibile eseguire connessioni HTTP e HTTPS nella stessa istanza di Apache. Per inviare le richieste alle porte 80 e 443 su server virtuali separati, vengono generalmente utilizzati host virtuali separati.

[Important]Configurazione del firewall

Non dimenticare di aprire il firewall per la connessione Apache SSL sulla porta 443. Questa operazione può essere eseguita mediante YaST, come descritto riportato nella Sezione 4.1.4.1, "Configurazione con YaST".

Per utilizzare SSL, è necessario attivarlo nella configurazione globale del server. Aprire /etc/sysconfig/apache2 in un editor e cercare APACHE_MODULES. Aggiungere "ssl" all'elenco dei moduli, nel caso questo non fosse già presente (mod_ssl è attivato per impostazione predefinita). Quindi cercare APACHE_SERVER_FLAGS e aggiungere "SSL". Se si è scelto di cifrare il certificato del server con una password, aumentare il valore di APACHE_TIMEOUT, in modo di disporre di tempo sufficiente per l'immissione della stringa di cifratura all'avvio di Apache. Riavviare il server per attivare le modifiche. Non è sufficiente ricaricarlo.

La directory di configurazione dell'host virtuale contiene un modello /etc/apache2/vhosts.d/vhost-ssl.template con direttive specifiche SSL, descritte dettagliatamente. Per informazioni sulla configurazione generale dell'host virtuale, consultare la Sezione 26.2.1.2, "Configurazione dell'host virtuale".

Per iniziare è sufficiente modificare i valori per le direttive seguenti:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

[Important]SSL e host virtuali basati sui nomi

Non è possibile eseguire più host virtuali SSL su un server con un solo indirizzo IP. Gli utenti che tentano di collegarsi al server riceveranno un messaggio di avviso che indica che il certificato non corrisponde al nome del server ogni volta che visitano l'URL. Per il buon esito di una comunicazione basata su un certificato SSL valido, è necessaria una porta o un indirizzo IP distinto per ciascun dominio SSL.