Automatische HTTPS met Apache

HTTPS is de dag van vandaag een must voor een website. Er zijn tools om certificaten automatisch aan te vragen (certbot etc), en webservers die gekend zijn om dit automatisch te doen (zoals Caddy), maar wist je dat je met Apache ook geen nood hebt voor Certbot? Met mod_md kan je apache automatisch HTTPS certificaten laten aanvragen via ACME (hetzelfde systeem dat Certbot en de caddy server gebruiken).

mod_md inschakelen is zeer eenvoudig, we beginnen met het inschakelen van de module:

sudo a2enmod md

Daarna moeten we een klein stukje configuratie toevoegen aan  /etc/apache2/apache2.conf, net boven waar de virtual hosts geïmporteerd worden

ServerAdmin your@email.example
MDCertificateAgreement accepted
MDPrivateKeys secp384r1
MDMessageCmd /usr/local/bin/apache-md-certs-hook.sh

Vervolgens kunnen we onze Vhost aanmaken zoals we gewend zijn, Enkel moeten we geen certificaat specifiëren.

# Tell Apache example.com is a managed domain
# we don't need to add MDomain entries for Aliases
MDomain example.com
<VirtualHost *:443>
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot /var/www/html
        SSLEngine on
</VirtualHost>

De volgende stap is een hook script dat Apache automatisch herlaad als een certificaat aangevraagd is (of verlengd word). Maak een bestand /usr/local/bin/apache-md-certs-hook.sh met de volgende inhoud:

EVENT="$1"
DOMAIN="$2"

echo "[$(date)] Event: $EVENT | Domain: $DOMAIN"

case "$EVENT" in
    installed|renewed)
        echo "[$(date)] Reloading Apache due to event '$EVENT' for $DOMAIN"
        sudo /bin/systemctl reload apache2
        ;;
    *)
        echo "[$(date)] No reload action for event '$EVENT'"
        ;;
esac

en zet de juiste rechten:

sudo chown root:root /usr/local/bin/apache-md-certs-hook.sh
sudo chmod 755 /usr/local/bin/apache-md-certs-hook.sh

Vervolgens moeten we nog een sudo regel toevoegen zodat apache zichzelf kan herladen. Maak het volgende bestand aan

sudo visudo -f /etc/sudoers.d/apache-reload

Met de volgende inhoud

www-data ALL=NOPASSWD: /bin/systemctl reload apache2

Nu hoeven we enkel Apache te herladen zodat onze nieuwe configuratie (en vhost) gebruikt worden

sudo service apache2 reload

Als we nu de site bezoeken, zien we een geldig certificaat. (het kan wel enkele seconden duren voordat het certificaat werkt). Apache zal dit ook vanzelf up to date houden.