Creare un certificato SSL per Apache su Ubuntu 16.04
Si crea il certificato:
1 |
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt |
- req -x509: indica quale certificato (CSR) utilizzare, in questo caso si usa lo standard X.509;
- nodes: dice a OpenSSL di non usare una password per il certificato;
- days 365: imposta la scadenza in giorni del certificato;
- newkey rsa:2048: indica la lunghezza della chiave del certificato;
- keyout: indica dove salvare la chiave privata;
- out: indica dove salvare il certificato;
Verranno ora richiesti i dati del certificato ( la parte più importante è la Common Name dove si deve mettere il nome host o l’ip con cui si raggiunge il webserver ):
- Country Name (2 letter code) [AU]:IT
- State or Province Name (full name) [Some-State]:Lazio
- Locality Name (eg, city) []:Roma
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:Blablabla S.p.a.
- Organizational Unit Name (eg, section) []:Reparto varie ed eventuali
- Common Name (e.g. server FQDN or YOUR name) []:nome-host-o-indirizzo-ip
- Email Address []:blabla@blablabla.bla
Si generano i parametri Diffie-Hellman:
1 |
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
Ora si deve configurare Apache ad usare le chiavi SSL appena create.
Si abilita l’utilizzo dei parametri Diffie-Hellman:
1 |
sudo nano /etc/apache2/conf-available/ssl-params.conf |
Inserire le seguenti righe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# from https://cipherli.st/ # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder On # Disable preloading HSTS for now. You can use the commented out header line that includes # the "preload" directive if you understand the implications. #Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off SSLSessionTickets Off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem" |
Si modifica il Virtualhost o la configurazione base SSL di Apache impostando i parametri creati, ad esempio:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin blabla@blablabla.bla ServerName nome-host-o-indirizzo-ip DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost> </IfModule> |
Eventualmente forzare tutto il traffico sulla porta sicura:
1 |
sudo nano /etc/apache2/sites-available/000-default.conf |
E impostare:
1 2 3 4 5 6 7 |
<VirtualHost *:80> . . . Redirect "/" "https://nome-host-o-indirizzo-ip/" . . . </VirtualHost> |
Abilitare le modifiche in Apache:
1 2 3 4 |
sudo a2enmod ssl sudo a2enmod headers sudo a2ensite default-ssl sudo a2enconf ssl-params |
Controlliamo che non ci siano errori nella configurazione:
1 |
sudo apache2ctl configtest |
Nel caso sia tutto a posto dovrebbe restituire un messaggio tipo:
1 2 |
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK |
Applichiamo le modifiche:
1 |
sudo systemctl restart apache2 |
Testiamo che funzioni tutto andando su https://nome-host-o-inddirizzo-ip/ ( ci sarà ovviamente un avviso che il certificato non è sicuro, basta autorizzarlo ).