Een webservercertificaat is onbruikbaar als clientcertificaat - "tenzij".
Eerst enkele achtergronden (ik laat de tekst inspringen, sla maar over als het je niet interesseert).
Een certificaat wordt niet gebruikt voor authenticatie, maar voor identificatie. Als jouw browser verbinding maakt met https://www.security.nl/, stuurt die site een perfecte kopie van haar webservercertificaat naar jouw browser. Daarna heb jij dat certificaat in jouw bezit en kun je daar oneindig veel perfecte kopïën van maken en aan derden geven. Maar gelukkig betekent dat niet dat jij een webserver kunt opzetten die zich voordoet als security.nl, en die vertrouwd wordt omdat deze dat webservercertificaat naar bezoekers stuurt.
Identificatie van een webserver (ook http) beslaat overigens meerdere stappen. Als jij https://www.security.nl/ als URL in jouw webbrowser intikt en Enter drukt, zal jouw browser een DNS lookup doen van www.security.nl en met het zo verkregen IP-adres verbinding proberen te maken. Dat laatste vereist dat netwerkpakketjes op LAN en WAN (internet) werkelijk naar het bedoelde IP-adres worden gerouteerd en dat anwoorden daarop bij jouw browser aankomen. Zodra de verbinding met dat IP-adres er is, zal jouw browser vragen om met www.security.nl te worden "doorverbonden" (op, of achter, 1 IP-adres kunnen namelijk meerdere websites -met verschillende domeinnamen- draaien). Dit zijn allemaal stappen waar aanvallers, afhankelijk van de omstandigheden, soms relatief eenvoudig op kunnen ingrijpen. Denk daarbij aan gehackte modem/routers met DNS-changer malware, DNS spoofing attacks, hacken van DNS-admin accounts bij DNS registrars, MITM (Man In The Middle) aanvallen bij public WiFi verbindingen, WPAD/NBNS of ARP spoofing attacks op LAN niveau en/of BGP hijack attacks op WAN niveau.
Authenticatie (identiteit bewijzen) bij https vindt plaats doordat de server bewijst dat deze een private key in haar bezit heeft - zonder die private key ooit met iemand te hoeven delen. Wat die server wel deelt is de bijpassende public key, een soort complementaire sleutel die onderdeel is van elk digitaal certificaat. Aangezien jij de private key van security.nl niet in jouw bezit hebt (hoop ik), kan jouw server zich niet voordoen als https://www.security.nl/, ook al heeft de browser van de bezoeker een IP-verbinding met een webserver die dat claimt te zijn.
Een webservercertificaat wordt tegenwoordig ook niet meer gebruikt voor de versleuteling van de verbinding (vroeger werd een symmetrische sleutel door de client versleuteld met de public key uit het certificaat, waardoor uitsluitend de bezitter van de private key die versleutelds symmetrische sleutel kan ontsleutelen en inzetten voor het versleutelen van de verbinding). Tegenwoordig gebeurt dat meestal met de Diffie-Hellman key agreement (zie bijv. Wikipedia voor meer info).
De belangrijkste functie van een webservercertificaat is het koppelen van een public key aan haar identiteit, de webserver-domeinnaam. We gebruiken de term "certificaat" omdat genoemde koppeling digitaal is ondertekend, meestal door een derde partij die -als het goed is- heeft vastgesteld dat de aanvrager van het certificaat inderdaad de eigenaar is van de identiteit plus de public key. Van fundamenteel belang is dat een bezoeker van een webserver de CA (certificate authority = certificaatuitgever) vertrouwt, in de zin van dat die CA nooit certificaten aan anderen dan de rechtmatige eigenaar van een identiteit (zoals een webserver domeinnaam) zal verstrekken (d.w.z. een vals CSR = certificate signing request zal ondertekenen).
Kortom, identificatie van een https website zoals https://www.security.nl/ bestaat uit de volgende stappen:
1) DNS lookup: meestal betrouwbaar, maar je weet het nooit zeker,
2) Routering op LAN en internet: minder of meer lastig aan te vallen, maar eenvoudig op public WiFi;
3) Verbinding met de juiste website bij meerdere op 1 IP-adres (www.security.nl maakt hier overigens geen gebruik van, maar goedkope webhosters en sommige CDN providers wel): configuratiefouten, bugs en compromittering kunnen ertoe leiden dat je niet bij de gewenste bestemming uitkomt;
4) Jouw browser ontvangt een webservercertificaat van de gevraagde domeinnaam en stelt vast dat de domeinnaam in de URL balk overeenkomt met één van de in het certificaat genoemde domeinnamen.
Die laatste stap vervalsen is het eenvoudigst voor aanvallers, want iedereen die https://www.security.nl/ bezoekt, ontvangt het webservercertificaat van die site. Het fraaie van https is dat je in één keer alle bovengenoemde aanvalsscenario's onmogelijk maakt, doordat de server moet bewijzen over de private key te beschikken die past bij de public key in het certificaat.
Certificaten en TLS verbindingen zijn helaas ook niet perfect veilig, maar aanvallers zullen zowel over een vals certificaat + private key moeten beschikken als één van bovengenoemde aanvallen moeten uitvoeren, en daarmee maken wij hen het zo lastig mogelijk. Als de betrouwbaarheid van de certificaataanvraag uitsluitend afhankelijk is van bovengenoemde 3 stappen -zoals bij DV (Domain Validated) certificaten- is die natuurlijk ver te zoeken (en daarom noem ik ze speelgoedcertificaten).
Het eeste probleem bij het gebruik van een web
servercertificaat als
clientcertificaat is dat de server de client op dat moment niet bezoekt (maar andersom). De validatie is dus minder sterk dan de andere kant op; voor een aanvaller volstaat het om ongeautoriseerd een private key in handen te krijgen, of een certificaatuitgever te bewegen onterecht een certificaat af te geven. En wat de server
sowieso moet doen, is een lijst bijhouden van welke clients toegang mogen hebben (immers ik denk zomaar dat het niet de bedoeling is dat elke client met een willekeurig geldig webservercertificaat plus bijbehorende private key toegang zou moeten krijgen, zoals nu.nl).
Daarnaast is het goed gebruik om de toepassingsmogelijkheden van certificaten te beperken door, in het certificaat, het gebruiksdoel op te nemen. Mocht de private key van een webserver in verkeerde handen vallen, dan kan daar bijv. geen code digitaal mee worden ondertekend, want dat gebruiksdoel is -normaal gesproken- uitgesloten. Hetzelfde kan gelden voor een clientcertificaat: als de certificaat-controlerende software de in het certificaat opgenomen beperkingen respecteert, zal een clientcertificaat (tenzij is aangegeven dat het
ook als servercertificaat mag worden gebruikt) onbruikbaar zijn als servercertificaat en vice versa.
In de praktijk is het verstandig om zelf clientcertificaten uit te geven, en het rootcertificaat daarvoor op de server te zetten. Dat betekent wel dat je die clientcertificaten moet kunnen "intrekken" (mocht de private key "gelekt" worden of een slechte random number zijn gebruikt voor het genereren van het sleutelpaar) door ze op de een of andere manier te blacklisten. Omdat je nooit 100% kunt uitsluiten dat een leidinggevende of jouw opvolger besluit om dat rootcertificaat ook voor andere doeleinden in te zetten (en omdat het waarschijnlijk in de trusted root certificate store van de webserver staat, en je daar alleen trusted code op wilt uitvoeren), raad ik aan om het gebruiksdoel van clientcertificaten zoveel mogelijk tot dat doel te beperken. En als je zelf certificaten "uitgeeft", is het natuurlijk jouw verantwoording om te checken dat de aanvrager is wie zij zegt dat zij is...
Succes!