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 autenticazioneHIGH
- hash con almeno 256 bit, p.es. SNA256MEDIUM
- hash con almeno 128 bir, p.es. SHA1LOW
- 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.
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.