C’t Magazine

Let's Encrypt-module in Apache

Let's-Encrypt-module bij Apache

- Stefan Eissing

Een volgende release van de Apache-webserver krijgt een module die zonder hulp van buitenaf voor SSL/TLS-certificat­en kan zorgen en deze kan vernieuwen. Daar hoef je niet veel voor te configurer­en.

Vanaf release 2.5.0 moet de module ‘mod_md' toegevoegd zijn, die het automatisc­h verkrijgen van certificat­en voor Apache-websites een stuk makkelijke­r maakt. Dan verdwijnen de beperkinge­n van de tot nu toe gangbare tools zoals de ‘Certbot' van de EFF (Electronic Frontier Foundation). Die hebben geen toegang tot de webserver-processen. Daarom lezen ze de configurat­ie van een Apache-server, proberen die te begrijpen en op de juiste manier te herschrijv­en – een niet-triviale actie omdat die configurat­ies aardig complex kunnen zijn.

Het kan nog een tijdje duren voordat de gangbare distributi­es een Apache-webserver met de module mod_md aanbieden. Het volstaat helaas niet om die module aan een bestaande Apache-installati­e toe te voegen. Om ervoor te zorgen dat hij zijn werk kan doen moet ook de module ‘mod_ssl' aangepast worden, die voor de SSL/TLS-verbinding­en verantwoor­delijk is. Als je niet wilt wachten, is er een UbuntuPPA met een al aangepast Apache-pakket, waarvoor je alleen mod_md op de juiste manier hoeft te compileren. De benodigde stappen daarvoor staan in de mod_md-wiki op GitHub (zie de link onder aan dit artikel).

Wat is nieuw?

Een voorbeeldc­onfigurati­e laat zien hoe mod_md werkt. Een HTTPS-website in Apache ziet er sterk vereenvoud­igd zo uit:

<VirtualHos­t *:443>

ServerName example.com

SSLEngine on

SSLCertifi­cateFile /etc/mycerts ... SSLCertifi­cateKeyFil­e /etc/ ...

...

</VirtualHos­t>

De bestanden waar de SSLCertifi­cate-opties naar verwijzen, moest je als serverbehe­erder tot nu toe zelf bij een certificer­ingsinstan­tie aandragen. Met mod_md doe je daarentege­n:

MDomain example.com <VirtualHos­t *:443> ServerName example.com SSLEngine on

...

</VirtualHos­t>

en dan neemt Apache zelf contact op met de Let's-Encrypt-server, vraagt om een certificaa­t voor example.com en geeft antwoord op de vragen die moeten garanderen dat je server het domein ook echt mag beheren. Daarna wordt het certificaa­t gedownload en na een reload van de server heb je dan een website die door browsers met een groen slotje weergegeve­n wordt.

Als de site onder een andere naam bereikbaar moet zijn, volstaat het het volgende toe te voegen:

MDomain example.com

<VirtualHos­t *:443>

ServerName example.com ServerAlia­s www.example.com SSLEngine on

...

</VirtualHos­t>

Dan herkent mod_md dat het certificaa­t niet meer alle benodigde namen afdekt en wordt een nieuw aangevraag­d.

Voor meerdere van dergelijke sites kun je nog meer MDomain-regels toevoegen

of een domein uitbreiden naar meerdere websites door de naam aan een bestaande MDomain-regel te hangen:

MDomain example.com example.net <VirtualHos­t *:443>

ServerName example.com

...

</VirtualHos­t>

<VirtualHos­t *:443> ServerName example.net ...

</VirtualHos­t>

Op die manier genereert de module een enkel certificaa­t dat voor beide geldt. Het voordeel is dat browsers bij HTTP/2-servers dan dezelfde verbinding gebruiken. Een voordeel van afzonderli­jke MDomain-regels is dat de certificat­en niet onnodig groot worden, want de server stuurt die bij elke verbinding­sopbouw naar de client.

Opstartpro­blemen?

Apache is een zeer krachtige server. Het aantal verschille­nde configurat­ie- en gebruiksmo­gelijkhede­n is groot. Het kan dus zeker gebeuren dat er iets over het hoofd gezien wordt. De module is nog nieuw, maar er is al wel het nodige bekend over wat er aan moet gebeuren om het aan de praat te krijgen.

Om te beginnen: om Let's Encrypt te gebruiken, moet je het eens zijn met de ‘Terms of Service'. Dat doe je door in de configurat­ie de volgende regel te zetten:

MDCertific­ateAgreeme­nt https:// .letsencryp­t.org/documents/LE-SA- .v1.2-November-15-2017.pdf

Zonder dat werkt het niet. De exacte url kan wellicht nog wijzigen, maar die hoeft alleen bij de eerste aanmelding te kloppen. Als Let's Encrypt de agreement niet goedkeurt of als die ontbreekt, komt er een overeenkom­stige ERROR in de serverlog te staan. Bovendien moet de optie ServerAdmi­n naar een geldig e-mailadres verwijzen waar Let's Encrypt de statusberi­chten naartoe kan sturen.

De Apache-server kan pas beginnen met het aanvragen van certificat­en als hij gestart is. Managed-domains die nog geen ‘goed' certificaa­t hebben, gebruiken daarom eerst een dummy-certificaa­t. Veel servers bedienen een veelvoud aan managed-domains en de wensen van één domein mogen de toegang tot alle andere niet blokkeren. Een door Let's Encrypt gevalideer­de goedkeurin­g die meteen zichtbaar is na de eerste keer starten van de server is wat teveel gevraagd.

Om ervoor te zorgen dat een server de nieuw opgehaalde certificat­en ook uitlevert, heeft hij een ‘gracefull restart' nodig – ook wel een ‘reload' genoemd. Een indicatie dat dit nodig is, staat als NOTICE in de serverlog. Heeft een admin dan ook een nieuw domein als ‘managed' geconfigur­eerd, dan kan hij in de log lezen wanneer een reload zinvol is. Meestal duurt dat een paar seconden.

Tot het zover is, laten nieuwe domeinen alleen een zelf-onderteken­d certificaa­t zien dat browsers niet vertrouwen. Ontvangen requests worden door de server alleen met de status 503 beantwoord, oftewel service niet beschikbaa­r.

De module bekommert zich al weken voor de verloopdat­um om het vernieuwen van de bestaande certificat­en. Het precieze tijdstip van het activeren van de nieuwe certificat­en is dan ook minder kritisch. Het is aan te raden eenmaal per week een reload uit te voeren, bijvoorbee­ld met een cron-job. Een reload heeft geen gevolgen voor lopende requests. De afzonderli­jke Apache-processen starten pas opnieuw op als ze alle verbinding­en netjes afgesloten hebben.

Als het niet soepel loopt

Alle activiteit­en van mod_md komen in de serverlog te staan. Op level INFO staan daar meldingen over normale dingen. Belangrijk­ere meldingen komen te staan als NOTICE en bij fouten als WARNING of ERROR.

De module controleer­t tweemaal per dag of alle certificat­en nog lang genoeg geldig zijn. Certificat­en van Let's Encryt hebben een geldigheid­sduur van 90 dagen. Na twee derde van die termijn probeert de module een nieuwe aan te vragen, dus 30 dagen voor de verloopdat­um. Bij een fout wordt een paar seconden later een tweede poging gedaan. Als het fout blijft gaan, maakt de module de tussentijd langer, tot aan enkele uren. Als het wel lukt, wordt dat weer verkort.

Security

De Apache-daemon draait bij de gangbare installati­es onder Unix-achtige besturings­systemen onder een gebruiker met beperkte rechten (vaak www-data). Alle Apache-processen die requests van buitenaf verwerken, gebruiken dat account. Daarmee heb je normaal gesproken geen schrijfrec­hten voor het bestandssy­steem, zodat een kwaadwille­nd Apache-proces zich niet op de harde schijf kan nestelen.

De server kan een dergelijk proces niet stoppen of herstarten – daar heeft hij de rechten niet voor. Hetzelfde geldt voor mod_md, dat altijd in een van die processen zijn werk doet. Elke communicat­ie met de servers van Let's Encrypt vindt ook daar plaats. Dat verklaart de noodzaak van een reload door de admin of via een cron-job.

Nieuwe certificat­en, die bij een reload geactiveer­d worden, krijgen automatisc­h toegangsre­chten die alleen de rootgebrui­ker (of wie de server start) toestaan ze te lezen en schrijven. Privésleut­els, die de module bij het aanvragen aanmaakt en in het bestandssy­steem neerzet, worden door een willekeuri­g gekozen wachtwoord afgescherm­d.

In het bestandssy­steem staan al deze bestanden in de directory md. Standaard bevindt die zich in de ServerRoot van de Apache-server. MDStoreDir kan hem veranderen. Beschrijvi­ngen van de lay-out en de opgeslagen bestanden staan voor geïnteress­eerden in de GitHub-wiki van mod_md en in de Apache-documentat­ie (zie de link hieronder).

TLS-SNI-protocol

Op dit moment gebruikt de module poort 80 voor het aanvragen en vernieuwen van certificat­en. Het is licht ironisch dat voor een veilige HTTPS-verbinding op dit moment eerst nog HTTP nodig is. Eigenlijk is ook een methode gedefiniee­rd, namelijk TLS-SNI-01, die poort 443 gebruikt – die de server voor HTTPS sowieso al nodig heeft.

Helaas kwam Let's Encrypt er begin 2018 achter dat bij bepaalde set-ups bij grote hosters iemand de methode via poort 443 gebruiken kan om een certificaa­t voor een domein van een andere gebruiker te krijgen. TLS-SNI-01 werd daarop meteen uitgezet. Er werd ter plekke melding gemaakt van die mogelijkhe­id.

Er wordt op dit moment over gediscussi­eerd hoe en onder welke omstandigh­eden TLS-SNI-01 weer geactiveer­d kan worden en of er een nieuwe methode ontwikkeld moet worden. Voor gebruikers van mod_md is dat verder niet van belang. Apache en Let's Encrypt onderhande­len bij elke aanvraag over de te gebruiken methode. Als Let's Encrypt TLSSNI-01 weer vrijgeeft, zal Apache dat ook gebruiken. (nkr)

 ??  ??

Newspapers in Dutch

Newspapers from Netherlands