HTTPS & TLS
Klik in je adresbalk op het slotje en je ziet "Verbinding is beveiligd". Bezoek een site zonder slotje en je browser zet er Niet veilig naast, in het rood. Deze pagina legt uit wat er precies achter dat verschil zit.
HTTPS is geen apart protocol. Het is gewoon HTTP, verpakt in TLS (Transport Layer Security, de opvolger van SSL). De requests en responses blijven exact dezelfde; ze worden alleen versleuteld verstuurd, over poort 443 in plaats van 80.
Waarom een browser waarschuwt bij HTTP
Een HTTP-request is leesbare tekst die ongewijzigd over tientallen routers reist:
POST /login HTTP/1.1
Host: voorbeeld.be
Content-Type: application/x-www-form-urlencoded
gebruiker=jan&wachtwoord=Zomer2026!
Iedereen die dat verkeer onderweg kan opvangen, leest dit mee: de beheerder van de publieke wifi in het station, iemand anders op datzelfde netwerk, elke tussenliggende provider. In Wireshark heb je er geen enkele truc voor nodig, het staat er gewoon.
Het gaat bovendien verder dan meelezen. Zonder TLS heb je drie problemen:
| Probleem | Wat er kan gebeuren |
|---|---|
| Geen vertrouwelijkheid | Wachtwoorden, cookies en formuliergegevens zijn leesbaar onderweg |
| Geen integriteit | Een tussenpersoon kan de pagina aanpassen: advertenties injecteren, een download vervangen |
| Geen authenticiteit | Je hebt geen enkel bewijs dat je met de échte server praat en niet met een namaakserver |
TLS lost die drie tegelijk op. Dát is wat de browser bedoelt met "beveiligd", en waarom hij de afwezigheid ervan als een waarschuwing toont, ook op een gewone informatieve pagina: je weet anders niet of wat je ziet echt van die site komt.
"Niet veilig" betekent niet dat de site kwaadaardig is. Het betekent dat de verbinding niet beveiligd is. Omgekeerd geldt hetzelfde: een slotje bewijst dat je versleuteld praat met de server die bij die domeinnaam hoort, niet dat de eigenaar te vertrouwen is. Ook een phishingsite kan een geldig certificaat hebben.
De TLS-handdruk
Voor het eerste HTTP-request vertrekt, onderhandelen client en server. Klik door de stappen.
Stap 1. ClientHello
De browser stelt zich voor en zegt wat hij aankan.
De browser opent het gesprek met een lijst van de TLS-versies en de versleutelingsmethodes die hij ondersteunt, een willekeurig getal, en de naam van de server die hij wil bereiken. Die naam is nodig omdat één IP-adres honderden sites kan bedienen: de server moet weten welk certificaat hij bovenhaalt.
TLS 1.3 · ciphers: ... · servernaam (SNI): www.ap.be
Die hele uitwisseling gebeurt na de TCP-handdruk en voor het HTTP-request. In DevTools zie je ze terug als de fase SSL in het tabblad Timing.
Certificaten en wie ze uitgeeft
Versleutelen is het makkelijke deel. De moeilijke vraag is: met wie ben je versleuteld aan het praten? Daarvoor dienen certificaten.
Een certificaat is een ondertekend document dat zegt: "de sleutel hieronder hoort bij www.ap.be". Wie tekent, is een certificaatautoriteit (CA). Je browser en besturingssysteem dragen een lijst van CA's die ze vertrouwen; die lijst is de basis van het hele systeem.
Root-CA (in je besturingssysteem)
└── Intermediate-CA (van de uitgever)
└── Certificaat van www.ap.be
Bij elke verbinding controleert je browser drie dingen:
| Controle | Faalt ze, dan |
|---|---|
| Staat de domeinnaam in het certificaat? | NET::ERR_CERT_COMMON_NAME_INVALID |
| Is het nog geldig? | NET::ERR_CERT_DATE_INVALID |
| Loopt de keten tot een vertrouwde root? | NET::ERR_CERT_AUTHORITY_INVALID |
Veelvoorkomende oorzaken:
| Melding | Wat er meestal aan de hand is |
|---|---|
| Verlopen certificaat | De automatische vernieuwing is stilgevallen |
| Verkeerde naam | Certificaat voor voorbeeld.be, maar je surft naar www.voorbeeld.be |
| Onbekende uitgever | Een self-signed certificaat: iemand tekende zijn eigen bewijs |
| Onvolledige keten | Het tussenliggende certificaat ontbreekt op de server |
Klik op het slotje in je adresbalk en ga naar de certificaatgegevens. Kijk naar drie dingen: voor welke namen het geldig is, tot wanneer, en wie het uitgaf. Vergelijk daarna een grote site met deze cursussite.
Let's Encrypt: certificaten zijn gratis geworden
Vroeger kostte een certificaat geld en moest je het jaarlijks handmatig vernieuwen. Dat is de belangrijkste reden waarom het web zo lang op HTTP bleef hangen.
Let's Encrypt is een CA zonder winstoogmerk die certificaten gratis en volledig automatisch uitgeeft. Dat werkt zo:
- Je vraagt een certificaat aan voor
voorbeeld.be. - Let's Encrypt geeft je een uitdaging: bewijs dat het domein van jou is. Dat kan door een bestand op je webserver te plaatsen (HTTP-01) of door een TXT-record in je DNS te zetten (DNS-01, zie DNS).
- Hun servers controleren die uitdaging.
- Je krijgt een certificaat dat 90 dagen geldig is.
Die korte geldigheidsduur is opzet: ze dwingt automatisering af. Met certbot is de hele opzet één commando, inclusief het vernieuwen:
sudo certbot --nginx -d voorbeeld.be -d www.voorbeeld.be
Certbot vraagt het certificaat aan, past je nginx-configuratie aan, zet een omleiding van poort 80 naar 443, en installeert een taak die twee keer per dag nakijkt of vernieuwen nodig is. Host je bij Netlify, Vercel of GitHub Pages, dan gebeurt dit onzichtbaar voor jou.
Wat je in de praktijk nog tegenkomt
| Onderwerp | Wat het betekent |
|---|---|
| Omleiding 80 → 443 | Elke goede server beantwoordt HTTP met een 301 naar de HTTPS-versie |
| HSTS | Een header die de browser laat onthouden dat deze site enkel via HTTPS bereikbaar mag zijn, ook bij een volgend bezoek |
| Mixed content | Een HTTPS-pagina die een afbeelding of script via HTTP laadt. De browser blokkeert dat of waarschuwt: één onbeveiligd script volstaat om de hele pagina te compromitteren |
localhost als uitzondering | Browsers behandelen http://localhost als veilige context. Je dev server heeft dus geen certificaat nodig |
| Self-signed op een testserver | Werkt technisch, maar geeft altijd een waarschuwing. Prima om te testen, nooit in productie |
Test jezelf
1. Wat verandert HTTPS aan een HTTP-request?
2. Je logt in op een `http://`-site op de wifi van het station. Wat is het grootste risico?
3. Een bezoeker krijgt `NET::ERR_CERT_DATE_INVALID`. Wat is er aan de hand?
4. Wat kan iemand die je HTTPS-verkeer opvangt nog altijd zien?
- HTTPS is HTTP in TLS, over poort 443. De berichten zelf veranderen niet.
- TLS levert drie garanties: vertrouwelijkheid, integriteit en authenticiteit.
- De handdruk loopt na TCP en voor het HTTP-request: hello, certificaat, controle, gedeelde sleutel, versleuteld kanaal.
- Een certificaat koppelt een sleutel aan een domeinnaam en wordt ondertekend door een CA die je browser vertrouwt.
- Let's Encrypt geeft gratis certificaten uit met een geldigheid van 90 dagen; met certbot verloopt vernieuwen automatisch.
- Versleuteld is niet onzichtbaar: adressen, poort en de bezochte domeinnaam blijven zichtbaar.