Marvin Pascale

[B.Log]

13 Giugno 2020

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: