Blogs

Blogs

Certificaatvrijheid met Let’s Encrypt

13-05-2024 10:13:20

Certificaatvrijheid met Let’s Encrypt

Nu nog eenvoudiger!

We zijn inmiddels waarschijnlijk allemaal wel bekend met Let's Encrypt, de gratis en geautomatiseerde TLS-certificaatverstrekker, ons kostenloos aangeboden door de Internet Security Research Group (ISRG).

Let's Encrypt zorgt met meer dan 4 miljoen uitgegeven TLS-certificaten per dag voor een nóg veiliger internet. En dat de TLS-certificaten van Let's Encrypt gratis zijn, doet niets af aan de betrouwaarheid van de versleuteling van het internetverkeer!

Ze hebben het bij Let's Encrypt dan ook onwijs eenvoudig gemaakt om je website van een 'slotje' te voorzien; maar voor je een gratis TLS-certificaat van ze krijgt wil Let's Encrypt natuurlijk wel graag weten dat de website waar je een TLS-certificaat voor aanvraagt ook echt van jou is.

HTTP-01 challenge

Om dat te bewijzen wordt doorgaans gebruik gemaakt van de HTTP-01 challenge.

Dit houdt in dat je een unieke code dient te publiceren op je website, op een 'well-known' plek, waarna Let's Encrypt kan controleren dat jij inderdaad die unieke code op die plek op die website hebt weten te krijgen: Succes! Hier is je glimmende TLS-certificaat!

Het gebruik van deze HTTP-01 challenge betekent echter dus wel dat je website voor Let's Encrypt bereikbaar moet zijn: zij moeten immers een HTTP-request naar de website kunnen sturen om te controleren dat de unieke code op de juiste plek staat.

Let's Encrypt certificaten zijn drie maanden geldig waarna ze opnieuw moeten worden aangevraagd. Dit proces van opnieuw aanvragen is goed geautomatiseerd. Als je website bereikbaar is voor Let's Encrypt merk je van dit vernieuw-proces doorgaans niks.

Maar soms wil je je website liever niet publiek bereikbaar hebben of soms gaat dat praktisch gewoonweg niet. En toch zou je op die plekken natuurlijk graag een vertrouwd TLS-certificaat gebruiken.

Je kon dan eigenlijk alleen nog terugvallen op de stoffige TLS-certificaatverkopers, - die recent hun prijzen weer eens hebben verhoogd -, om na een lang handmatig traject TLS-certificaten te verkrijgen voor je interne webservice zoals bijvoorbeeld de beheer-interface van je thuiswifi of je Home Assistant installatie.

DNS-01 challenge

Let's Encrypt ondersteunt ook (al een poosje) een DNS-01 challenge. In plaats van de unieke code op je website te plaatsen, plaats je voor deze 'challenge' de code in de DNS van de domeinnaam waar je een TLS-certificaat voor aan wil vragen.

Zo kan Let's Encrypt nog beter verifiëren dat jij 'beheerder' bent van die domeinnaam en na deze verificatie-stap stelt Let's Encrypt je zelfs in staat om 'wildcard' certificaten aan te vragen!

Maar niet iedereen kan eenvoudig, geautomatiseerd, de DNS-instellingen van hun domeinen beheren. Niet alle DNS-aanbieders hebben uberhaupt eigen API's om tegen aan te programmeren en vaak kan je met die API véél meer dan nodig is voor de DNS-01 challenge van Let's Encrypt. Die DNS-API-gegevens zet je dus liever niet op diverse systemen, die hou je liever beperkt benaderbaar.

Enter ACME-DNS

Een slimme kop op het internet genaamd Joona Hoikkala zag dit probleem ook en heeft daar ACME DNS voor ontwikkeld.

ACME DNS is een heel simpele DNS-server met een heel eenvoudige API, waarmee je alleen de gegevens kan beheren die nodig zijn voor de DNS-01 challenge van Let's Encrypt.

Joona heeft naast de ACME DNS-server software ook een bijpassend script geschreven dat goed samenwerkt met de Let's Encrypt client, certbot.

Dit script zorgt voor de volledige automatisering van de DNS-01 challenges, zodat jij als beheerder maar éénmaal een wijziging in je DNS moet doen en het een en ander in het vervolg geheel automatisch voor je wordt verzorgd.

En dat werkt bijzonder goed!

BIT biedt het gebruik van deze ACME DNS-server nu ook kostenloos aan voor klanten. Dus maak je gebruik van IP-adressen van BIT, dan kan je bij de BIT ACME DNS-server: acme-dns.bit.nl.

Hoe dan?

Hieronder omschrijf ik één manier om hier gebruik van te maken. Naast de hier benoemde oplossing is er bijvoorbeeld ook een add-on voor pfSense Firewall en zijn er andere Let's Encrypt clients zoals LEGO.

Maar het kan dus ook zo:

Op een Linux server met de standaard certbot-client geïnstalleerd, plaats je het ACME DNS certbot-script ergens op een logische plek op de server, bijvoorbeeld in /etc/letsencrypt/:

root@bokhard:~# cd /etc/letsencrypt/
root@bokhard:/etc/letsencrypt# wget https://raw.githubusercontent.com/joohoi/acme-dns-certbot-joohoi/master/acme-dns-auth.py
root@bokhard:/etc/letsencrypt# chmod 700 acme-dns-auth.py

Controleer de inhoud van het script dat je zojuist van internet hebt gedownload goed en pas in de regels boven in het script twee instellingen aan:

ACMEDNS_URL = "https://acme-dns.bit.nl"
STORAGE_PATH = "/etc/letsencrypt/acmedns.json"

Vervolgens kun je met de standaard certbot-client een certificaataanvraag starten. Door wat extra opties mee te geven vertel je certbot dat je gebruik wil maken van de DNS-01 challenge methode, en dat het zojuist gedownloade script gebruikt moet worden als authenticatie hook. De authenticatie hook is wat certbot zal gebruiken om het verzoek om een TLS-certificaat aan te vragen te authenticeren. Zonder hier expliciet voor naar het ACME-DNS-script te wijzen zal dit standaard dus de HTTP-01 challenge gebruiken.

root@bokhard:~# certbot certonly \
      --manual \
      --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py \
      --preferred-challenges dns \
      --debug-challenges \
      -d www.bokhard.nl

De client vraagt je eenmalig een wijziging in de DNS van het domein, in dit geval bokhard.nl, toe te passen:

Please add the following CNAME record to your main DNS zone:
_acme-challenge.www.bokhard.nl CNAME 64992foo-9bar-4baz-quux-587363c9036b.acme-dns.bit.nl.

De client wacht rustig af terwijl je in een andere terminal eenmalig deze CNAME in de DNS-instellingen van het domein bokhard.nl toevoegt. Daarna druk ik op <ENTER> in de certbot-client terminal. Die kan weer verder en enkele seconden later heb je een TLS-certificaat!

De CNAME in de DNS van je domein moet je laten staan! Die zal certbot, of eigenlijk het ACME DNS certbot-script, weer gebruiken als het certificaat automatisch vernieuwd moet worden.

Het ACME DNS certbot-script maakt een bestand acmedns.json aan op de plek die je in de STORAGE_PATH-setting heb ingesteld.

Dit bestand bevat de gegevens benodigd om tegen de ACME DNS-server te praten. Zorg ervoor dat je dit veilig back-upt!

Zoals je ziet is het met de ACME-DNS server en de DNS-01 challenge bijna net zo eenvoudig om Let's Encrypt TLS-certificaten aan te vragen als met een publiek bereikbare webserver en de HTTP-01 challenge. Of je nu één keer je webserver configureert voor Let's Encrypt of één keer je DNS wijzigt, met de DNS-methode ben je in elk geval een stuk flexibeler.

Door: Sander Smeenk

TL;DR
Let's Encrypt biedt gratis en geautomatiseerde TLS-certificaten aan, maar vereist normaal gesproken dat je website publiek toegankelijk is voor de HTTP-01 challenge. Voor privéwebsites of niet-toegankelijke servers introduceert ACME-DNS een oplossing. Met ACME-DNS kun je de DNS-01 challenge gebruiken, waarbij je een unieke code in de DNS van je domein plaatst. BIT biedt nu gratis toegang tot de ACME DNS-server voor klanten. Door een script te gebruiken met certbot, kun je automatisch TLS-certificaten aanvragen met de DNS-01 challenge.