HTTPS van begin tot eind
Je tikt een adres in, je duwt op enter, en voor je het scherm ziet staat er links van het adres al een pictogram dat zegt: de verbinding is beveiligd. Daar zat een gesprek tussen. In die paar honderd milliseconden hebben je browser en de server een geheim afgesproken, een bewijsstuk uitgewisseld en gecontroleerd, en zijn ze overgeschakeld op versleuteling. Dit hoofdstuk telt af wat er gebeurt — en er komt geen nieuwe wiskunde bij. Alles wat je nodig hebt, staat al in de vorige hoofdstukken. Hier zie je ze samen aan het werk.
Woorden die je zo nodig hebt
- HTTPS
- Het gewone web (HTTP) met een versleutelde laag eronder. Die laag heet
TLS.
https://in de adresbalk betekent niets anders dan: hier zit TLS onder. - TLS
- Transport Layer Security. De huidige versie is TLS 1.3, en die staat beschreven in RFC 8446, uit augustus 2018. Een RFC is het openbare document waarin een internetstandaard staat; iedereen kan het lezen.
- Handshake
- Letterlijk: het handen schudden. De eerste paar berichten waarin browser en server afspreken hoe ze verder praten. Daarna begint het echte verkeer.
- Rondreis
- Eén keer heen en één keer terug over het netwerk. In het Engels round trip, afgekort RTT. Dat is de eenheid waarin snelheid hier telt: niet in rekenwerk, maar in hoe vaak je op de ander moet wachten.
- Cijfersuite
- Het pakketje afspraken over wélke algoritmes gebruikt worden: welke versleuteling, welke hashfunctie. Browser en server hebben er allebei een lijstje van, en ze kiezen er samen één uit.
- SNI
- Server Name Indication. Het veldje waarin je browser meteen zegt wélke site hij wil. Op één IP-adres staan vaak honderden sites, dus de server moet dat weten voor hij het juiste certificaat kan opsturen.
- Man-in-the-middle
- Iemand die tussen jou en de server gaat zitten en tegen allebei doet alsof hij de ander is. Hij leest en verandert dan alles, zonder dat een van beiden het merkt.
De handshake, stap voor stap
- ClientHello. Je browser stuurt als eerste een bericht met: welke TLS-versies hij kan, welke cijfersuites hij kent, welke site hij wil (dat is de SNI) — en meteen al zijn helft van de sleuteluitwisseling. Hij wacht dus niet tot de server gekozen heeft; hij gokt op wat de server waarschijnlijk zal willen en stuurt zijn publieke helft alvast mee.
- ServerHello. De server kiest een versie en een cijfersuite, en stuurt zijn eigen helft terug. Op dat moment kunnen ze allebei, elk apart, hetzelfde getal uitrekenen: het gedeelde geheim. Dat is exact het verf-trucje uit hoofdstuk 5, meestal op een elliptische kromme. Er is nu een sleutel, en die is nooit over de lijn gegaan.
- Het certificaat en een handtekening. Vanaf hier is alles al versleuteld — ook wat nu komt. De server stuurt zijn certificaat (hoofdstuk 7.2) en daarbovenop een handtekening over het hele gesprek tot hier. Die handtekening is het punt: iedereen kan een certificaat kopiëren, maar alleen wie de bijbehorende private sleutel heeft, kan er eentje zetten. Zo weet je dat je met de echte server praat en niet met een man-in-the-middle.
- Je browser controleert. Drie dingen, en alle drie moeten kloppen. Is de handtekeningenketen van dit certificaat te volgen tot aan een wortelcertificaat dat hij vertrouwt? Staat de naam in het certificaat gelijk aan wat jij intikte? Vallen we binnen de geldigheidsdatums? Eén nee en je krijgt geen slotje maar een waarschuwingsscherm.
- Verder symmetrisch. Vanaf nu gaat alles — de pagina, de beelden, je wachtwoord, elk klikje — symmetrisch versleuteld met AES-GCM. Dat is hoofdstuk 4, en dat de zware wiskunde alleen voor het begin dient en de rest snel gaat, is hoofdstuk 7.3.
Welk hoofdstuk zit in welke stap
| Stap | Wat er gebeurt | Dat kende je al uit |
|---|---|---|
| 1–2 | Allebei een helft sturen, allebei hetzelfde geheim uitrekenen | hoofdstuk 5, op de krommen van hoofdstuk 6.2 |
| 3 | Een handtekening over het gesprek, zodat je weet wie er praat | hoofdstuk 7.1 |
| 3–4 | Het certificaat en de keten tot aan een vertrouwde wortel | hoofdstuk 7.2 |
| 5 | De hele rest van het bezoek, snel versleuteld met AES-GCM | hoofdstuk 4 |
| 1–5 | Trage wiskunde voor de sleutel, snelle voor de data | hoofdstuk 7.3 |
Eén rondreis in plaats van twee
Dat de browser zijn helft van de sleuteluitwisseling al in zijn állereerste bericht meestuurt, klinkt als een detail. Het is de grootste verandering van TLS 1.3 ten opzichte van zijn voorganger TLS 1.2. Daar ging het zo: eerst vroeg de browser wat de server kon, dan antwoordde de server, en pás daarna begon de sleuteluitwisseling. Twee keer heen en weer voor er één letter inhoud over de lijn ging. TLS 1.3 doet het in één keer heen en weer.
| TLS 1.2 | TLS 1.3 | |
|---|---|---|
| Rondreizen voor de handshake | 2 | 1 |
| Aanpak | eerst overleggen, dan sleutelen | gokken en meteen sleutelen; klopt de gok niet, dan pas overleggen |
| Certificaat van de server | gaat onversleuteld over de lijn | gaat versleuteld, want er is al een sleutel |
Op een verbinding waarbij één rondreis 50 milliseconden kost, scheelt dat dus 50 milliseconden per nieuwe verbinding — en een pagina haalt zijn beelden, lettertypes en scripts vaak van een handvol verschillende domeinen, elk met een eigen verbinding. Zo werd de nieuwere versie tegelijk zwaarder beveiligd én sneller.
Wat het slotje wél en niet betekent
| Wél | Niet |
|---|---|
| Alles wat je stuurt en krijgt is versleuteld. Wie meeluistert op de wifi van school of van de trein leest niets mee. | Dat de site deugt. Het slotje zegt niets over wie erachter zit of wat ze met je gegevens doen. |
| De naam in het certificaat is dezelfde naam als die je intikte, en een certificaatuitgever heeft daarvoor getekend. | Dat de naam die je intikte de naam is die je bedoelde. Tik je één letter verkeerd, dan klopt het certificaat van die andere site keurig. |
Dat tweede is geen theoretisch probleem. Een certificaat kost tegenwoordig niets en is in minuten geregeld, ook voor wie een nepversie van een inlogpagina bouwt. Meer dan negen op de tien phishingsites hebben een geldig certificaat en dus een slotje — in 2019 was dat nog ongeveer zes op de tien. Het slotje bewijst dat niemand onderweg meeleest — niet dat de bestemming te vertrouwen is.
Google onderzocht in 2021 wat mensen dachten dat het slotje betekende. 11 procent had het juist; de rest las het als een keurmerk. Daarom is het slotje in Chrome sinds versie 117, uit september 2023, vervangen door een neutraal pictogram met twee schuifjes. Niet omdat er iets veranderd is aan de beveiliging, maar omdat het symbool het verkeerde beloofde.
Doe het zelf, nu meteen. Klik op het pictogram links van het webadres hierboven — in Chrome en Edge de twee schuifjes, in Firefox nog een slotje. Zoek je een weg naar Verbinding is beveiligd en dan naar het certificaat, dan zie je precies de dingen uit stap 4: voor welke naam het geldig is, wie het uitgaf, tussen welke twee datums het geldt, en de keten erboven tot aan de wortel. Dit is het certificaat van de site die je nu leest.
Wat een afluisteraar nog wél ziet
Versleuteld wil niet zeggen onzichtbaar. Iemand die het verkeer op jouw netwerk kan lezen — je internetprovider, de beheerder van de wifi — weet nog steeds een paar dingen.
| Ziet hij wel | Ziet hij niet |
|---|---|
| Welk domein je bezoekt. Twee keer zelfs: in de DNS-vraag waarmee je browser het IP-adres opzoekt, en in de SNI in de ClientHello, die onversleuteld moet omdat de server anders niet weet welk certificaat hij moet sturen. | Welke pagina van dat domein. Dat je op een site was, ja; dat je daar dit artikel las, nee. |
| Hoeveel data er heen en weer gaat, en wanneer. Uit een patroon van pakketgroottes en pauzes valt soms verrassend veel te raden. | De inhoud. Je zoekopdracht, je wachtwoord, je bericht, de pagina zelf. Daar komt hij niet bij. |
Aan dat eerste lek wordt gewerkt. Encrypted Client Hello (ECH) verpakt de echte ClientHello — met de echte SNI erin — versleuteld in een onschuldig ogende buitenkant. De sleutel daarvoor haalt je browser uit DNS. Chrome zet het sinds versie 117 (september 2023) standaard aan, Firefox sinds versie 119 (oktober 2023), en sinds maart 2026 is het een officiële internetstandaard: RFC 9849.
Half dicht dus, niet helemaal. Het werkt alleen als de site zelf meedoet en zijn sleutel in DNS publiceert, en dat doet lang niet iedereen. En je DNS-vraag blijft zichtbaar tenzij die ook versleuteld gaat (DNS over HTTPS). Het IP-adres waar je verbinding naartoe loopt, ziet hij hoe dan ook: zonder adres komt er geen pakketje aan.
HSTS: kom nooit meer over http
Er is één moment waarop het misgaat. Tik je site.be zonder
https:// ervoor, dan probeert je browser het van oudsher eerst
over gewone http — onversleuteld. Die ene eerste vraag kan een
man-in-the-middle onderscheppen en omleiden naar zijn eigen kopie, en dan is
de rest van je bezoek van hem. Daarom kan een site in zijn antwoord een
regel meesturen die zegt: onthoud dat je bij mij alleen nog over https
mag komen, met een vervaldatum erbij. Dat heet HSTS, beschreven in
RFC 6797 uit november 2012. Je browser onthoudt het, en probeert het daarna
zelfs niet meer over http — ook niet als jij het tikt, en ook niet als
je op "toch doorgaan" wil klikken. Het gat blijft alleen dat aller-allereerste
bezoek, en daarvoor houden browsers een ingebakken lijst bij van domeinen die
altijd al https zijn.
Dit is wiskunde: een protocol bewijzen in plaats van uitproberen
Een handshake is geen som maar een gesprek: wie zegt wat, in welke volgorde, en wat mag je daaruit besluiten. De vraag "kan een aanvaller, door berichten te onderscheppen, te herhalen of om te wisselen, ooit eindigen met een sleutel die hij niet zou mogen hebben?" kan je niet beantwoorden door het te proberen. Er zijn te veel volgordes. Je moet het bewijzen.
Dat is precies wat er met TLS 1.3 gebeurd is, en het was een primeur: het ontwerp is nagerekend terwijl het nog een klad was, niet achteraf. Cas Cremers en vier collega's goten versie 21 van het klad in de bewijsassistent Tamarin en lieten die de aanvalsmogelijkheden aflopen — het werk verscheen op de CCS-conferentie van 2017, bijna een jaar voor RFC 8446 er in augustus 2018 was. Vroegere TLS-versies waren niet zo ontstaan, en daar zijn ze jarenlang gaten in blijven vinden.
Dat vak heet formele verificatie, en het zit op de grens van wiskunde en informatica: je schrijft een protocol op in logica en laat een programma alle mogelijke gevallen nagaan. Niet "we hebben het getest en het lijkt te werken", maar "we hebben bewezen dat het andere niet kan". Het wordt ook gebruikt voor treinbeveiliging, chips en vliegtuigsoftware — overal waar "we hebben het een tijdje geprobeerd" geen antwoord is.