Apache e Certificati

Versione Debian/Ubuntu

Prerequisiti

Abilitare il modulo SSL

sudo a2enmod ssl

Se necessario editare il file mods-enabled/ssl.conf.

Il parametro SSLCipherSuite HIGH:!aNULL descrive gli algoritmi di firma del certificato che sono consentiti:

  • !aNULL - proibiti gli algoritmi senza autenticazione
  • HIGH - hash con almeno 256 bit, p.es. SNA256
  • MEDIUM - hash con almeno 128 bir, p.es. SHA1
  • LOW - hash con meno di 128 bit, p.es- MD5

La lista completa delle possibilità, come pure altri parametri di settaggio crittografici, fi trovano alla pagina di manuale: man ciphers.

Una sicurezza nulla si ottiene settando il parametro a: SSLCipherSuite DEFAULT:@SECLEVEL=0.

Nel nostro caso l'algoritmo di hash che firma il certificato è SHA256, quindi non vi è bisogno di alcun cambiamento.

Abilitare il sito con accesso SSL

sudo a2ensite default-ssl

Occorre fornire:

  • il nome del server
  • la risoluzione nome-indirizzo del server
  • la locazione del certificato e della chiave privata del soggetto

Nome del Server:

Inserire il parametro:

ServerName geekflare.com

Il nome del server deve essere lo stesso del campo CN del certificato fornito, nel nostro caso geekflare.com.

Risoluzione nome-indirizzo:

Editare il file /etc/hosts ed inserire la linea, p.es.:

10.0.2.15       geekflare.com

Locazioni:

Sono i parametri:

SSLCertificateFile      /etc/ssl/certs/certificate.pem
SSLCertificateKeyFile /etc/ssl/private/geekflare.key

Copia dei File

Il certificato del soggetto e la chiave privata del soggetto devono essere copiati nelle apposite directory.

Certificato del Soggetto:

sudo cp ~/ex/certs/certificate.pem /etc/ssl/certs

Chiave Privata del Soggetto:

sudo cp ~/ex/certs/geekflare.key /etc/ssl/private

Anche il certificato della CA che firma deve essere copiato nell'apposita directory:

sodo cp ~/ex/certs/gfcert.pem /etc/ssl/certs

Test della Configurazione

Col comando:

sudo apache2ctl -t

Restart del Server

Col comando:

sudo systemctl restart apache2

Verificare:

sudo systemctl status apache2

Se vi sono errori consultare il log:

sudo less /var/log/apache2/error.log

Test di Funzionamento

Aprire un browser e puntarlo a https://geekflare.com


Versione Unix in Docker già Pronto

Useremo l'immagine httpd:2.4-alpine, già disponibile a Docker Hub.

Lancio del container:

docker run -d --name htalp -v $HOME/ex/certs:/certs \
  -p 8888:80 -p 8443:443 httpd:2.4-alpine sleep 1000000

Vi è un bind mapping tra la nostra directory ~/ex/certs, che contiene i certificati che ci servono, e la directory del contenitore /certs. Quest'ultima non esiste e viene creata.

Per impedire collisioni con porte della macchina host compiamo due port mapping:

  • la porta locale 8888 per HTTP
  • la porta locale 8443 per HTTPS

Ci colleghiamo quindi al contenitore:

docker exec -ti htalp sh

Ci troviamo nella directory /usr/local/apache2.

Abilitazione dei Componenti

Editiamo il file di configurazione principale:

vi conf/httpd.conf

Scommentiamo le linee:

#LoadModule ssl_module modules/mod_ssl.so

#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

#Include conf/extra/httpd-ssl.conf

Modifichiamo i parametri:

ServerName geekflare.com

ServerAdmin admin@geekflare.com

Configurazione di SSL

Questa è nel file conf/extra/httpd-ssl.conf.

SSLRandomSeed startup file:/dev/urandom 512

SSLRandomSeed connect file:/dev/urandom 512

Non occorrono cambiamenti, ma notiamo i parametri del certificato soggetto:

SSLCertificateFile "/usr/local/apache2/conf/server.crt"

SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

Occorre il certificato CA. Scommentiamo la linea:

SSLCACertificateFile "/usr/local/apache2/conf/ssl.crt/ca-bundle.crt"

Copia dei File Necessari

cp /certs/certificate.pem conf/server.crt
cp /certs/geekflare.key conf/server.key
mkdir /usr/local/apache2/conf/ssl.crt
cp /certs/gfcert.pem conf/ssl.crt/ca-bundle.crt

Risoluzione Nomi Indirizzi

Verifichiamo l'indirizzo IP col comando:

ip a

Supponiamo di trovare l'indirizzo 172.17.0.2.

Editiamo il file /etc/hosts.

Se già esiste, modifichiamo la linea:

172.17.0.2      c59cc19e7178 geekflare.com

Altrimenti inseriamo la linea:

172.17.0.2      geekflare.com

Test della Nuova Configurazione

Col comando:

httpd -t

Potrebbe dare un warning, la prima volta, di disallineamento tra il campo CN del certificato e il nome del server.

Questo sembra essere un feature di questa versione di Apache e solitamente sparisce se si ripete il comando, una volta che il server è partito.

Attivazione del Server

Se non è ancora partito:

httpd

Se era già partito:

httpd -k restart

E verifichiamo con:

ps wax

Possiamo ora uscire dal contenitore del server:

exit

Test da Browser Esterno

Apriamo un browser e puntiamolo a https://localhost:8443.

Naturalmente compare un grosso WARNING.

Br-warning

Il CA non è configurato nel software del browser e quindi non è riconosciuto.

Accettiamo il rischio e funziona.


Versione Unix in Docker Configurato Manualmente

Run del Contenitore

Lanciamo un contenitore con semplice Alpine:

docker run -d --name htalp -v $HOME/ex/certs:/certs \
  -p 8888:80 -p 8443:443 alpine sleep 1000000

Colleghiamoci al contenitore:

docker exec -ti htalp sh

Installiamo il software:

apk add apache2 apache2-ssl apache2-utils

Andiamo nella directory di configurazione:

cd /etc/apache2

Configurazione di questo SSL

Modifichiamo il ServerName nella configurazione principale:

vi httpd.conf

Modifichiamo la linea:

ServerName geekflare.com:80

Editiamo il file di configurazione di SSL:

vi conf.d/ssl.conf

Modifichiamo i parametri:

ServerName geekflare.com:443

ServerAdmin admin@geekflare.com

Notiamo le linee:

SSLCertificateFile /etc/ssl/apache2/server.pem

SSLCertificateKeyFile /etc/ssl/apache2/server.key

Scommentiamo la linea:

SSLCACertificateFile /etc/ssl/apache2/ssl.crt/ca-bundle.pem

Copia dei Nostri File

cp /certs/certificate.pem /etc/ssl/apache2/server.pem
cp /certs/geekflare.key /etc/ssl/apache2/server.key
mkdir -p /etc/ssl/apache2/ssl.crt
cp /certs/gfcert.pem /etc/ssl/apache2/ssl.crt/ca-bundle.pem

Nostra Risoluzione Nomi Indirizzi

Verifichiamo l'indirizzo IP col comando:

ip a

Supponiamo di trovare l'indirizzo 172.17.0.2.

Editiamo il file /etc/hosts.

Se già esiste, modifichiamo la linea:

172.17.0.2      0cb3b32f54f7 geekflare

Altrimenti inseriamo la linea:

172.17.0.2      geekflare.com

Test della Nostra Configurazione

Col comando:

httpd -t

Lancio del Server

Se non è ancora partito:

httpd -k start

Se era già partito:

httpd -k restart

E verifichiamo con:

ps wax

Possiamo ora uscire dal contenitore:

exit

Test Esterno

Apriamo un browser e puntiamolo a https://localhost:8443.

Naturalmente ci compare il WARNING.

NOTA: Il warning compare solo se in un esercizio precedente NON abbiamo accettato la URL https://localhost:8443 come ecceezione.

Possiamo dal browser rimuovere questa eccezione e riprovare.

Accettiamo il rischio e funziona.