Creare un certificato SSL per Apache su Debian 10 “Buster”
Si crea il certificato:
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:
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:
nano /etc/apache2/conf-available/ssl-params.conf
Inserire le seguenti righe:
# 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 ( /etc/apache2/sites-available/default-ssl.conf ) impostando i parametri creati:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin blabla@blablabla.bla
ServerName nome-host-o-indirizzo-ip
ServerAlias alias-1 alias-2
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:
nano /etc/apache2/sites-available/000-default.conf
E impostare:
<VirtualHost *:80>
. . .
Redirect "/" "https://nome-host-o-indirizzo-ip/"
. . .
</VirtualHost>
Abilitare le modifiche in Apache:
a2enmod ssl a2enmod headers a2ensite default-ssl a2enconf ssl-params
Controlliamo che non ci siano errori nella configurazione:
sudo apache2ctl configtest
Nel caso sia tutto a posto dovrebbe restituire un messaggio tipo:
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:
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 ).