Apache mod_md e Let's Encrypt
Let’s Encrypt
Let’s Encrypt è un progetto molto interessante che nasce nel 2012 da parte di due impiegati di Mozilla. E’ una certification authority (CA) che automatizza gratuitamente la creazione, la validazione, il rilascio ed il rinnovo di certificati X.509.
L’obiettivo di Let’s Encrypt è quello di riuscire a cifrare tutte le comunicazioni sul World Wide Web azzerando il costo dei certificati, andando ad automatizzare il processo di configurazione del web server compreso il rinnovo.
Il client di Let’s Encrypt è incluso nei repository ufficiali di Debian.
Let’s Encrypt rilascia solamente certificati di tipo Domain Validated e dal 13 marzo 2018 sono supportati ufficialmente anche i certificati wildcard usati per mettere in sicurezza, con lo stesso certificato di dominio, anche i sottodomini.
NB: Il certificato ha validità 90gg.
Apache HTTP Server
Apache HTTP Server, o più comunemente Apache, è il nome di un server web libero sviluppato dalla Apache Software Foundation.
È la piattaforma server Web modulare più diffusa, in grado di operare su una grande varietà di sistemi operativi, tra cui UNIX/Linux, Microsoft Windows e OpenVMS.
Installazione e conficurazione
Per comodità prenderò come sistema di riferimento un sistema Debian based.
Installiamo e abilitiamo il modulo md e gli altri moduli necessari.
# apt install libapache2-mod-md
# a2enmod md
# a2enmod ssl
# a2enmod rewrite
# a2enmod headers
# systemctl reload apache2.service
Creiamo il file di configurazione per il dominio /etc/apache2/sites-available/www.esempio.it.conf.
## Secure Apache with mod_md Let's Encrypt directives ##
ServerAdmin [email protected]
MDCertificateAgreement accepted
MDomain www.esempio.it
MDPrivateKeys RSA 4096
<VirtualHost *:80>
ServerName www.esempio.it
DocumentRoot /var/www/html/www.esempio.it
ErrorLog ${APACHE_LOG_DIR}/www.esempio.it-error.log
CustomLog ${APACHE_LOG_DIR}/www.esempio.it-access.log combined
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
<Directory /var/www/html/www.esempio.it>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
Protocols h2 http/1.1
ServerName www.esempio.it
Header always set Strict-Transport-Security "max-age=63072000"
DocumentRoot /var/www/html/www.esempio.it
DirectoryIndex index.html
ErrorLog ${APACHE_LOG_DIR}/www.esempio.it-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/www.esempio.it-ssl-access.log combined
# Set HTTP Strict Transport Security
Header always set Strict-Transport-Security "max-age=63072000"
<Directory /var/www/html/www.esempio.it>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
## Only enable TLS v1.3 and avoid older protocols ##
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLHonorCipherOrder off
SSLSessionTickets off
## Turn on OCSP Stapling ##
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
Lanciamo il test di configurazione e nel caso non vengano evidenziati errori riavviare Apache.
# apache2ctl configtest
# systemctl restart apache2.service
Al riavvio verrà automaticamente richiesto il certificato TLS/SSL per il dominio www.esempio.it .
Testiamo.
curl -I https://www.esempio.it
Rinnovo automatico
Il modulo md utilizza il modulo watchdog e di conseguenza bisogna verificare che sia attivo.
# apache2ctl -M | grep mod_watchdog
watchdog_module (static)
Per verificare lo stato dei certificati dobbiamo configurare il modulo md.
Aggiungiere le seguenti tre righe in coda al file di configurazione del dominio (es: /etc/apache2/sites-available/www.esempio.it.conf):
<Location "/md-status">
SetHandler md-status
</Location>
Riavviare e verificare la corretta configurazione.
# systemctl restart apache2.service
# curl https://www.esempio.it/md-status
Otteremo una risposta simile a questa:
{
"version": "2.0.10",
"managed-domains": [
{
"name": "www.esempio.it",
"domains": [
"www.esempio.it"
],
"contacts": [
"mailto:[email protected]"
],
"transitive": 1,
"ca": {
"proto": "ACME",
"url": "https://acme-v02.api.letsencrypt.org/directory",
"agreement": "accepted"
},
"state": 2,
"renew-mode": 1,
"renew-window": "33%",
"warn-window": "10%",
"must-staple": false,
"cert": {
"valid-from": "Wed, 13 Jun 2020 00:17:37 CET",
"valid-until": "Tue, 11 Sep 2020 00:17:37 CET",
"serial": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"sha256-fingerprint": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"renew": false
}
]
}
Per avere maggiori informazioni visita le pagine dei relativi progetti.
Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.
Risorse: