Let’s Encrypt: Simpel een gratis certificaat
- October 27, 2017
- 0
Letsencrypt.org is een nieuwe, open certificate authority, die gratis en zonder moeilijk gedoe certificaten voor je webserver verstrekt. Hierdoor kun je nu je persoonlijke website of blog voorzien van een vertrouwd certificaat.
We maken met zijn allen steeds meer gebruik van internet. We bankieren over het internet, kopen onze koelkast, kleding en schoenen over het internet, de gemeentes bieden diensten aan via het internet, enzovoorts. Anno 2016 kan dat niet meer onversleuteld. We wisselen vaak creditcardgegevens, gebruikersnamen, wachtwoorden en andere gevoelige informatie uit en teveel pottenkijkers hebben belangstelling voor die informatie. Cybercriminaliteit blijft maar groeien. Een tweede probleem waar encryptie iets aan kan doen, is dat van authenticiteit: weet je wel zeker dat je echt inlogt op de server van de bank of geef je je inloggegevens door aan een malafide server van een crimineel die doet alsof. Een certificaat geeft meer zekerheid en vertrouwen dat je inderdaad met de goede server praat.
Onversleuteld
Ondanks dat het belangrijk is dat al het verkeer versleuteld is, bieden veel websites uitsluitend een onversleutelde verbinding aan, zelfs wanneer je op zo’n website met een gebruikersnaam en wachtwoord moet inloggen. De reden hiervoor is tweeledig: het kost geld en het is ingewikkeld. Het kost geld, omdat je een certificaat moet kopen en periodiek moet verlengen. Het is ingewikkeld om zo’n certificaat aan te vragen en het is ingewikkeld om het certificaat in de configuratie van je webserver op te nemen.
Deze twee oorzaken, kosten en complexiteit, wilde de ISRG, de organisatie achter letsencrypt.org, oplossen. De ISRG, een samenwerkingsverband zonder winstoogmerk, richtte het project Letsencrypt op en stelde zich als doel om gratis certificaten te gaan uitgeven. Verder wilde ze het aanvraagproces en de configuratie van de webserver simpel maken. In december 2015 waren deze doelen grotendeels bereikt. Vanaf dat moment kon iedereen met een domeinnaam gratis een certificaat aanvragen. Alle belangrijke browsers erkennen letsencrypt als valide certificate autority, iedereen die je website bezoekt ziet netjes een groen hangslotje in de browser.
Automatisch
Verder biedt letsencrypt een script aan dat het aanvraagproces volledig automatisch voor je afhandelt en helpt bij de configuratie van de Apache webserver. Er moeten nog wat scherpe kantjes worden gladgestreken, maar voor Linux gebruikers is het nu al prima te doen, vooral omdat je geen gedoe meer hebt met het maken van een CSR en dergelijke. Een certificaat voor je domein van letsencrypt is drie maanden geldig, je dient dus geregeld je certificaat te vernieuwen. Gelukkig gaat ook dat gemakkelijk.
Officieel is letsencrypt nog in beta-stadium, wat betekent dat bijvoorbeeld de werking van het script en de gebruikersinterface niet in graniet gebeiteld zijn en nog volop kunnen veranderen. De ontwikkeling staat voorlopig nog niet stil, wellicht dat in de toekomst bijvoorbeeld ook het migreren van een domein naar een andere server eenvoudig via de scripts opgelost gaat worden.
Uitgangspunten
Het ontwerp van Letsencrypt gaat uit van een aantal uitgangspunten. De eerste twee uitgangspunten zijn hierboven al genoemd; gratis certificaat verstrekking en vereenvoudiging van de implementatie op de server. Andere uitgangspunten zijn het inrichten van een veilige certifcate authority en een veilige configuratie van webservers waar het certificaat gebruikt wordt, transparantie door openbaar vast te leggen welke certificaten zijn uitgegeven of ingetrokken en de ontwikkeling en gebruik van open standaarden.
De ISRG heeft specifiek voor het Letsencrypt-project een nieuw protocol ontworpen, het Automatic Certificate Management Environment (ACME) protocol en dit vastgelegd in een soort RFC, wellicht dat dit op termijn een officiële open standaard wordt.
Globale werking
Je start met het downloaden van de software, dit doe je door het uitchecken (clonen) van een git repository. Je haalt daarmee de shell- en pythonscripts binnen die het werk voor je doen. Wanneer je het script aan het werk zet, dan controleert het eerst of alle benodigde software aan boord en up-to-date is. Vervolgens genereert het een RSA publiek/privaat-sleutelpaar en registreert de publieke sleutel bij de certificate authority (CA). Hierna vraagt het script om validatie van je server. De CA controleert wat zaken en vraagt om bepaalde informatie op een bepaalde plek op de webserver te zetten, zodat deze kan controleren of je inderdaad gerechtigd bent voor het specifieke domein.
Het script zet de betreffende gegevens op de betreffende plaats (in de subdirectory “.well-known” in de document-root) en vraagt de CA dit te checken. Nadat de CA de juiste verwerking heeft bevestigd, maakt het script een Certificate Signing Request (CSR) aan op basis van een nieuw gegenereerd publiek/privaat-sleutelpaar en communiceert dit weer met de CA. De CA genereert nu een certificaat, tekent dit en geeft dit aan het script, dat het voor je installeert in de etc directory. Vervolgens kan het script desgewenst nog Apache configureren voor het gebruik van TLS met het certificaat.
Zoals je ziet, gebeurt er heel wat. Er wordt zo nodig software geïnstalleerd of geüpdatet. Er vinden meerdere sessies met gegevensuitwisseling plaats en twee keer wordt een sleutelpaar gegenereerd. Wanneer je webserver op een minder krachtige machine draait, zoals bijvoorbeeld een Rapsberry Pi of een Beaglebone Black, dan neemt dit alles behoorlijk wat tijd in beslag. Aangezien het script weinig interactie vereist, is dat niet zo’n ramp, het is maar dat je er op voorbereid bent. Verder hoef je in principe niet zo veel te weten over wat er zich allemaal op de achtergrond afspeelt, letsencrypt heeft de scripts juist ontwikkeld om het allemaal simpel te houden.
Sterke Diffie-Hellman parameters
Nadat je vol trots je nieuwe certificaat op je server hebt draaien en je in je browser een mooi groen hangslotje te zien krijgt, ben je er nog niet. Je kunt dan het beste even controleren hoe sterk je TLS configuratie is. Hiervoor ga je naar ssllabs.com en klik op ‘test your server’. Je krijgt nu een invulveld waarin je de URL van je server opgeeft. Vervolgens controleert ssllabs.com hoe een en ander geconfigureerd is en of je wel voldoende sterke versleutelingsmethoden (ciphers) gebruikt. Dit duurt enkele minuutjes, na afloop krijg je een rapportcijfer en een rapport met de uitkomsten van het onderzoek.
Het rapportcijfer is op zijn Amerikaans, van A (geslaagd) t/m F (fail). Wanneer je geen A krijgt, moet je dus nog wat werk doen. Op een Raspberry Pi waarop Raspbian draait met lighttpd als webserver, kregen wij met ons nieuwe letsencrypt certificaat een B. De reden hiervoor was dat de Diffie-Hellman versleuteling van lighttpd onder de maat was. Het bleek dat een te kleine Diffie-Hellman sleutel gebruikt werd. Bij het zoeken op internet zagen wij dat dit een vaker voorkomend euvel is, ook bij andere webservers. Het was gemakkelijk op te lossen door een nieuwe, grotere sleutel te genereren (zie listing 1a, kies zelf het goed pad) en daarna de verwijzing naar de sleutel in de configuratie van de webserver op te nemen. Na het restarten van lighttpd kregen wij vervolgens netjes een groene A van ssllabs.com.
Certificaat aanvragen
Je begint met het ophalen van de scripts op vanaf github.com, zie listing 1b. Wij vinden het geen prettig idee om het script de configuratie van de Apache webserver voor ons te laten aanpassen, bovendien heb je meestal meer dan een enkel domein op je webserver draaien en wil je kunnen aangeven voor welke van die domeinen je een letsencrypt certificaat wilt aanvragen.
Dit is niet ingewikkeld, je geeft per domein de naam van het domein en het pad naar de document-root van dit domein op. Dat doe je met de switches -d en -w, zie het voorbeeld in listing 2, hier voor de domeinen www.linuxmag.nl en www.mijndomein.nl. Nadat je dit script op deze manier gestart hebt, installeert het geheel automatisch een certificaat voor de betreffende domeinen. Houd er rekening mee dat dit wat tijd kost. Verder moet het script in de document-root en in de etc-directory kunnen schrijven. Wij deden dit daarom als root, maar je kunt natuurlijk ook een gebruiker aanmaken met de betreffende rechten. Dit is zeker straks bij het automatisch vernieuwen van je certificaten van belang.
Nadat het proces klaar is, heb je in de etc directory een nieuwe directory met de naam letsencrypt, hieronder vind je o.a. een subdirectory met de naam ‘live’, met weer een subdirectory met daarin symbolic links naar je nieuwe key-paar, privkey.pem en cert.pem. plus de chain.pem, die benodigd is om de relatie naar de CA te maken. Ook wanneer je voor meer dan één domein een certificaat hebt aangevraagd, heb je deze drie bestanden gekregen. Het key-paar bevat dan een certificaat dat geldig is voor elk van die domeinen. Bezoekers van de website kunnen dit ook zien, bijvoorbeeld door in de Chrome webbrowser met de rechtermuisknop op het hangslotje te klikken en de verbindings-gegevens op te vragen.
Sommige webservers, zoals bijvoorbeeld lighttpd en ngix, willen een bestand waarin de publieke en de private key zijn samengevoegd, dit doe je met:
cat privkey.pem cert.pem > combined.pem
Nu kun je de configuratie van de webserver aanpassen, namelijk het enabelen van port 443 voor de versleutelde verbinding, meestal door het activeren van een bepaalde module, en het opnemen van de verwijzing naar de chain.pem en je nieuwe key-paar in de webserver-configuratie. Zie hiervoor de documentatie van de betreffende webserver. Na de aanpassing van de configuratie moet je de webserver de configuratie opnieuw laten inlezen. Dit kan door bijvoorbeeld door een reload- of een restart-commando.
Vernieuwen van je certificaten
Het letsencrypt-certificaat is drie maanden geldig. Vernieuwen doe je met hetzelfde commando als de eerdere aanvraag, alleen met de toevoeging van de switch –renew. Ook nu begint het script met de dependencies te updaten, dus ook dat duurt even. Je zou dit bijvoorbeeld via cron in elke eerste nacht van de maand kunnen laten doen. In dat geval is het beter om hiervoor een gebruiker te maken die uitsluitend schrijfrechten heeft in de letsencrypt directory met de scripts, de etc-letsencrypt directory en in de .well-known subdirectory in de betreffende document-roots.
Je oude keys zijn na een vernieuwing niet weg, je nieuwe key-paar heet cert2.pem en privkey2.pem in de archive directory, in de live directory wijzen de symbolic links meteen naar het nieuwe key-paar.
Aan de slag
Je kunt nu zelf aan de slag met letsencrypt, begin bijvoorbeeld met die servers waar je nu self-signed certificaten gebruikt. Door deze te vervangen met letsencrypt certificaten scheelt dat weer vragen van je browser of je wel zeker weet dat je naar je eigen server wilt, ook worden je bezoekers niet meer afgeschrikt door dit soort vragen. Verder ga je natuurlijk elke publieke server, waar nog geen TLS draait, voorzien van een certificaat, zodat we inderdaad met zijn allen kunnen helpen het internetverkeer meer te encrypten. Je krijgt geen garantie dat je er de NSA en andere boosaardige pottenkijkers mee buiten de deur houdt, maar het helpt zeker het internet wat veiliger te maken en de privacy van ons allemaal beter te beschermen.