Een Let's Encrypt SSL Certificaat installeren in Apache2

  •  
  •  

Het komt helaas nog veel te vaak voor dat starters een webshop lanceren die via een platte — niet versleutelde — http-verbinding functioneert, bijvoorbeeld omdat zij zich geen certificaat kunnen veroorloven, of de technische kennis niet hebben. Wanneer je gevoelige data verstuurt via een website, bijvoorbeeld als je op een website inlogt of een betaling doet, wordt deze data 'door de lucht' vanaf jouw computer naar de servers van de betreffende website verzonden. Maak gebruik van een wifi verbinding, dan zou een kwaadwillend persoon deze data letterlijk uit de lucht kunnen halen en naar eigen inzicht kunnen gebruiken. Via een kabelverbinding kan dit bijvoorbeeld via een 'Man In The Middle'-attack, waarbij de data bijvoorbeeld op een router of switch alsnog wordt uitgelezen.

Kortom, deze gevoelige data mag nooit als platte, makkelijk leesbare tekst worden verzonden en dat heeft de Internet Security Research Group (ISRG) begrepen. Let's Encrypt is geboren uit dit inzicht van de ISRG en heeft als voornaamste doel om alle mogelijke smoesjes om geen certificaat te gebruiken weg te nemen:

  1. Het is gratis;
  2. Je kunt het zodanig opzetten dat je certificaten automatisch worden verlengt (voor altijd);
  3. Zeer grote bedrijven zijn sponsor en houden op die manier het concept in leven.

Waarom een certificaat geld kost

SSL certificaten worden normaliter verstrekt door een Certificate Authority (CA). Met de juiste technische kennis kan eigenlijk iedereen een CA worden, het wordt pas lastig om aan alle voorwaarden te voldoen om een Trusted Authority (vert. Vertrouwde Autoriteit) te worden. De organisatie, technische infrastructuur en werknemers moeten aan allerlei strenge voorwaarden voldoen die de nodige kosten met zich meebrengen.

Deze voorwaarden worden vervolgens jaarlijks gecontroleerd door bedrijven als WebTrust of ETSI. Deze audits zijn behalve uitzonderlijk streng, ook uitzonderlijk prijzig (CAcert spreekt over eenmalig $75.000 en $10.000 op jaarbasis). Deze bedrijven controleren elkaar vervolgens ook onderling

Alle Trusted CA's worden op een centrale lijst — de 'List Of Trusted Lists' (LOTL) — geplaatst. De CA's in deze lijst leveren allemaal een Root-Certificate waarmee ze zich kunnen identificeren. Deze Root-Certificates worden standaard in besturingssystemen en webbrowsers geïnstalleerd. Wanneer jij vervolgens een certificaat aanvraagt, wordt dit certificaat ondertekent met het Root-Certificaat van de door jou gekozen CA. Kortom, je wil er als Trusted Authority alles aan doen om op deze lijst terecht te komen en te blijven staan.

Als laatste zijn er certificaten die bij het aanvragen alleen een technische verificatie vragen — Domain Validation (DV) — certificaten die worden gecontroleerd door een fysiek persoon — Organisation Validation (OV) — of certificaten waar je bedrijf wordt doorgelicht — Extended Validation (EV). Omdat de eerste variant volledig automatisch door een CA kan worden uitgegeven, ligt de prijs veel lager dan een certificaat dat handmatig wordt gevalideerd. De tweede variatie heeft als voordeel dat jouw bedrijfsnaam in het certificaat wordt toegevoegd en bij de derde extreme variatie wordt jouw bedrijfsnaam naast het groene slotje in webbrowsers getoond.

Is een betaald Certificaat beter?

Een certificaat van Let's Encrypt wordt alleen technisch geverifieerd — Domain Validation —, qua techniek maakt dit weinig verschil (Organisation Validation en Extended Validation certificaten zijn net luxe wagens: ziet er kek uit, maar brengt je nog steeds van A naar B). De techniek die de beveiliging bepaalt is voor alle smaken hetzelfde — de data wordt op dezelfde manier versleuteld.

Het nadeel is dus dat jouw bedrijfsnaam en/of -gegevens niet in het certificaat staan en dat jouw bedrijfsnaam niet naast het groene slotje wordt getoond als iemand naar jouw website gaat. Zo lang je geen bank runt verschilt het alleen in cachet.

In de beginperiode van Let's Encrypt was een plausibel argument dat het bedrijf nog erg jong en instabiel was, waardoor het bedrijf er mee zou kunnen stoppen. In dat gevel zou het Root Certificate teruggetrokken worden en zouden alle door Let's Encrypt uitgegeven certificaten ongeldig worden. Let's Encrypt is echter al op 18 november 2014 aangekondigd, is sinds 12 april 2016 officieel live gegaan en heeft sindsdien al meer dan 35 miljoen certificaten uitgegeven. Tevens worden zij gesponsord door zeer grote partijen die tezamen erg veel stabiliteit aan het bedrijf geven.

Als laatste bestaat er wellicht de angst dat Let's Encrypt kwade bedoelingen heeft en probeert gevoelige data uit te lezen. Vergeet echter niet dat ook Let's Encrypt een Trusted Authority is, welke dezelfde audits heeft doorstaan als instanties die betaalde certificaten leveren. Er vindt alleen communicatie plaats tussen jouw website/server en de CA wanneer er een certificaat wordt aangevraagd — middels een Certificate Signing Request (CSR) — een techniek waarbij alleen een Public Key (vert. Publieke Sleutel) wordt gecommuniceerd, welke ook wordt gecommuniceerd bij verkeer tussen de websitebezoeker en jouw webserver. Afluisteren is hierdoor onmogelijk (of in ieder geval level eindbaas moeilijk en minstens net zo moeilijk als met een betaald certificaat).

Certificaat Installeren

Je bent overtuigd? Mooi.

Let's Encrypt heeft Certbot ontwikkeld om haar certificaten zo gemakkelijk mogelijk uit te geven, je hoeft alleen maar even webserver-software en OS te kiezen en de stappen te volgen.

Debian 7 (Wheezy)

Waar het installatieproces van Certbot voorheen alles behalve soepel verliep (onze ervaring), is dit nu grotendeels opgelost met certbot-auto, welke je zoals de instructies als volgt installeert:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Je hoeft in de installatiestappen voor Apache zoals onderstaand omschreven alleen steeds certbot voor certbot-auto te vervangen.

Debian 8 (Jessie)

Voor Debian 8 dien je, zoals de instructies ook aangeven eerst de backports repository toe te voegen om Certbot te installeren:

echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list
apt-get update
apt-get install python-certbot-apache -t jessie-backports

Refereer voor overige systemen naar de instructiepagina's op de website van Certbot.

Debian 9 (Stretch)

Vanaf Debian 9 is Certbot beschikbaar in de package-manager, dus installeren kun je met je ogen dicht:

apt-get install python-certbot-apache -y

Stap voor stap installatie in Apache

Genereer een nieuw certificaat voor de domeinen die jij in gebruik wenst te nemen. Er wordt je gevraagd om een admin-e-mailadres, kies hiervoor een centraal adres dat eventueel doorgegeven kan worden in het geval jij geen admin meer bent. Gezien Let's Encrypt geen wildcard-certificaten ondersteund, dien je elk (sub)domain apart op te geven:

certbot certonly --apache --rsa-key-size 4096 --domains domain.tld,www.domain.tld,cdn.domain.tld

Foutmelding Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.

Sinds 9 januari 2018 heeft Certbot de TLS-SNI-01 challenge permanent uitgeschakeld als gevolg van een beveiligingslek. Hierdoor werkt bovenstaande opdracht alleen als je gebruik maakt van de meest recente versie van Certbot. Mocht jouw Linux distributie nog niet de laatste versie van Certbot leveren, dan kun je er tijdelijk omheen werken met de volgende opdracht:

certbot certonly --authenticator standalone --installer apache --pre-hook "service apache2 stop" --post-hook "service apache2 start" \
--rsa-key-size 4096 --domains domain.tld,www.domain.tld,cdn.domain.tld

Het certificaat dat wordt gegenereerd zal vervolgens voor alle subdomeinen die je hebt opgegeven gelden. Wanneer je je domein alleen voor www.domain.tld wilt laten gelden kan dat natuurlijk ook. Het certificaat kun je vervolgens terugvinden in de map /etc/letsencrypt, gegroepeerd per 'hoofddomein' zie je daar de bestanden die nodig zijn voor installatie:

# Command below should return 'cert.pem chain.pem fullchain.pem privkey.pem'
ls /etc/letsencrypt/live/domain.tld

Vervolgens kun je de bestanden toevoegen aan de apache Virtualhost(s):

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.tld/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/domain.tld/chain.pem

Wanneer je deze wijzigingen hebt doorgevoerd kun je de configuratie controleren en apache herstarten:

# Check and reload apache
apachectl configtest
apachectl graceful

Automatisch vernieuwen

Ook al lijkt het op het eerste gezicht een nadeel dat de certificaten slechts 90 dagen geldig zijn, maar dit komt de beveiliging sterk ten goede (elk volgende certificaat gebruikt namelijk nieuwe sleutels om de data te versleutelen). Om vervolgens te zorgen dat de certificaten automatisch vernieuwd worden kun je simpele regel aan /etc/crontab toevoegen:

m h,h2	* * *	root	certbot renew -q >> /var/log/letsencrypt/letsencrypt.log

Kies voor m, h en h2 willekeurige waarden zodat het script twee keer per dag wordt uitgevoerd (Dit adviseert Let's Encrypt, in geval dat een certificaat wordt teruggetrokken).

Oude logs opruimen met Logrotate

Alle output van Certbot wordt gelogd in de map /var/log/letsencrypt. Helaas worden de oude logs standaard niet opgeruimd, maar dit kunnen we oplossen door een nieuwe bestand /etc/logrotate.d/letsencrypt aan te maken met de volgende inhoud[1]:

/var/log/letsencrypt/*.log {
daily
missingok
rotate 12
compress
delaycompress
notifempty
}

Vervolgens kun je controleren of dit juist functioneert door logrotate handmatig te laten lopen:

logrotate -vf /etc/logrotate.d/letsencrypt

Werking controleren

Eigenlijk ben je na bovenstaande stappenplan zo goed als klaar. Wanneer je naar je website navigeert zie je namelijk direct of het heeft gewerkt of niet. Eventueel kun je in Chrome het certificaat controleren via F12 > Security > View certificate.

SSL/TLS beveiliging testen en verbeteren

Gebruik de instructies "Hoe je een SSL/TLS verbinding test op kwetsbaarheden" voor een diepere analyse waarmee je het beste uit jouw beveiligde verbinding haalt.

Bronnen

  1. Configuratie voor Logrotate:
    https://github.com/lgg/letsencrypt-config/blob/master/etc/logrotate.d/letsencrypt