Via Let’s Encrypt kun je geautomatiseerd HTTPS-certificaten aanvragen en installeren. In twee posts laat ik zien dat je dat ook voor TOPdesk kunt inregelen, binnen Linux. Je hoeft dan nooit meer na te denken over het vervangen van je certificaat!
In de vorige post heb ik kort uitgelegd hoe je TOPdesk op een Linux-server in de cloud kunt draaien. In deze post laat ik zien hoe je de firewall en de webserver van TOPdesk configureert, zodat je via Let’s Encrypt je certificaten kunt opvragen en installeren. Daarna laat ik zien hoe je je certificaten automatisch kunt laten vervangen wanneer ze gaan verlopen.
Stappenplan
Het plan is om TOPdesk alleen via poort 443 te ontsluiten, voor een versleutelde verbinding. De gewone poort 80, voor onversleuteld verkeer over HTTP, zetten we standaard uit. We zetten ook geen http-naar-https-redirect in.
Let’s Encrypt gebruikt echter wel poort 80, namelijk voor de controle of de domeinnaam die je opgeeft daadwerkelijk verwijst naar de server waarop de software draait. Dit bewijst dat je de eigenaar bent van het domein, en dus dat je geautoriseerd bent om een certificaat aan te vragen. Poort 80 zetten we dus alleen open op het moment dat er een certificaat moet worden aangevraagd.
Het stappenplan is dus als volgt:
- DNS-verwijzing aanmaken
- Poort 80 openen met commando ufw (documentatie)
- Certificaat aanvragen met commando certbot (documentatie)
- Poort 80 dichtzetten met commando ufw
- Certificaat omzetten naar formaat dat TOPdesk accepteert (pkcs12) met commando openssl
- TOPdesk starten
Uncomplicated firewall
Met Uncomplicated firewall of ufw stel je heel eenvoudig firewallregels in. Met het volgende commando maak je verkeer over poort 80 mogelijk. Dit is dus nodig om je certificaat te kunnen aanvragen.
ufw allow 80
Met het volgende commando zet je poort 80 weer dicht.
ufw delete allow 80
Je gebruikt dezelfde syntax om poort 443 te openen of te sluiten.
Certbot
Certbot is het tooltje dat de magic doet. Wat certbot doet, is een webserver op poort 80 opzetten die een bepaalde sleutel publiceert. Vervolgens doet certbot een HTTPrequest via het internet naar de url die je opgeeft. Als de webserver het HTTPrequest registreert en als de sleutels matchen, dan is de url gevalideerd en dat je dus eigenaar bent van het domein. Vervolgens krijg je je certificaatbestanden van de certificate authority van Let’s Encrypt. Die worden in een mapje geplaatst.
Als je DNS-verwijzing is verwerkt, en als je poort 80 open hebt, dan kun je het certificaat aanvragen met het volgende commando:
certbot certonly --standalone --preferred-challenges http -d locatietopdesk.com.net
Gaat alles goed, dan krijg je de certificaatbestanden van Let’s Encrypt in het mapje /etc/letsencrypt/live/locatietopdesk.com.net/.
Certificaatbestanden omzetten naar PKCS12
De bestanden die je van de CA van Let’s Encrypt ontvangt zijn nog niet in een formaat dat TOPdesk accepteert. Je moet er dus voor zorgen dat je ze converteert naar PKCS12-formaat. Het volgende script doet precies dat. Het script maakt een pfx-keystore /opt/TOPdesk-data/certificaat/letsencrypt/letsencrypt.pfx met behulp van het commando openssl. Ook zet je er een wachtwoord op, in dit geval G3h31mW@chtw00rd.
/opt/TOPdesk-data/certificaat/letsencrypt/renewpfx
#!/bin/bash
URL="locatietopdesk.com.net"
openssl pkcs12 -export -out /opt/TOPdesk-data/certificaat/letsencrypt/letsencrypt.pfx \
-inkey /etc/letsencrypt/live/$URL/privkey.pem \
-in /etc/letsencrypt/live/$URL/cert.pem \
-certfile /etc/letsencrypt/live/$URL/chain.pem \
-password pass:G3h31mW@chtw00rd
Daarna pas je het configuratiebestand van TOPdesk aan, webserver.properties. Hierin roep je de juiste pfx-keystore aan, en je voert het goede wachtwoord op:
webserver.properties
webserver.http.enabled = false
webserver.https.enabled = true
webserver.https.host = locatietopdesk.com.net
webserver.https.port = 443
webserver.https.keystorePath = /opt/TOPdesk-data/certificaat/letsencrypt/
webserver.https.keystore = letsencrypt.pfx
webserver.https.keystoreType = pkcs12
webserver.https.keystorePassword = G3h31mW@chtw00rd
webserver.https.keyPassword = G3h31mW@chtw00rd
webserver.https.confidentialRedirect = false
Check check doublecheck, en start daarna TOPdesk met het commando systemctl start topdesk
. Als alles goed is gegaan, dan kun je TOPdesk via HTTPS benaderen, via de url.
Alles samenvoegen
De certificaten van Let’s Encrypt hebben standaard een geldigheidsduur van maar 3 maanden. Gelukkig kun je het vernieuwen van een certificaat ook helemaal automatiseren met de eerder genoemde scripts en commandos. Dit doe je met cronjobs, en ik gebruik er drie:
05 3 * * 5 /usr/bin/systemctl stop topdesk.service
08 3 * * 5 /opt/TOPdesk-data/certificaat/letsencrypt/renewscript
10 3 * * 5 /usr/bin/systemctl start topdesk.service
Je ziet hier dat TOPdesk elke vrijdagochtend om 3:05u stopt. Drie minuten later controleert certbot of het certificaat vervangen moet worden. Dat doet het script /opt/TOPdesk-data/certificaat/letsencrypt/renewscript. Om 3:10u start TOPdesk weer. Het certificaat wordt overigens daadwerkelijk vervangen wanneer het certificaat binnen 30 dagen verloopt.
Het script /opt/TOPdesk-data/certificaat/letsencrypt/renewscript is belangrijk
/opt/TOPdesk-data/certificaat/letsencrypt/renewscript
#!/bin/bash
certbot renew --quiet --agree-tos \
--pre-hook "ufw allow 80" \
--deploy-hook "/opt/TOPdesk-data/certificaat/letsencrypt/renewpfx"
--post-hook "ufw delete allow 80"
- De optie –pre-hook schrijft voor wat er moet gebeuren voordat het certificaat moet worden vervangen. Hier is dat: poort 80 openen.
- De optie –deploy-hook schrijft voor wat er moet gebeuren direct na het downloaden van de nieuwe certificaten. Hier is dat: de bestanden omzetten naar PKCS12-formaat. Het script /opt/TOPdesk-data/certificaat/letsencrypt/renewpfx is hierboven overigens al weergegeven, onder Certificaatbestanden omzetten naar PKCS12.
- De optie –post-hook schrijft voor wat er moet gebeuren nadat alle eerdere stappen zijn uitgevoerd. Hier is dat: poort 80 weer dichtzetten.
Appeltje eitje!?
Is dit voor jou niet appeltje eitje? Neem dan contact op om de mogelijkheden te bespreken!