Ik zal het met een voorbeeld uitleggen.
In een normale PKI, gebaseerd op sleutelparen, zijn er een private sleutel en een publieke sleutel.
In een op certificaten gebaseerd systeem zijn er een privésleutel en een certificaat. Het certificaat bevat meer informatie dan de openbare sleutel.
Demo (U kunt een certificaat en privésleutel genereren): http://www.selfsignedcertificate.com/
U kunt het privésleutelbestand en het certificaatbestand downloaden, u ziet dat het certificaatbestand veel informatie bevat, zoals hieronder weergegeven.
U kunt uw gegenereerd certificaat (openen met een teksteditor), en privésleutel (openen met een teksteditor) van deze site vergelijken: https://www.sslshopper.com/certificate-key-matcher.html ](https://www.sslshopper.com/certificate-key-matcher.html)
Als het certificaat overeenkomt met de private sleutel van de client, is de client er zeker van, dat het certificaat is gegeven door de client of gegeven door de vertrouwde agent van de client (CA).
Echter, er zijn problemen bij communicatie op basis van alleen de particuliere sleutel en het certificaat.
Omdat iedereen zijn eigen certificaat en privésleutel kan genereren, bewijst een eenvoudige handshake niets over de server, behalve dat de server de privésleutel kent die overeenkomt met de publieke sleutel van het certificaat. Een manier om dit probleem op te lossen is om de client een set van een of meer certificaten te laten hebben die hij vertrouwt. Als het certificaat niet in de set zit, is de server niet te vertrouwen.
Er zijn verschillende nadelen aan deze eenvoudige aanpak. Servers zouden na verloop van tijd moeten kunnen upgraden naar sterkere sleutels (“sleutelrotatie”), waardoor de publieke sleutel in het certificaat wordt vervangen door een nieuwe. Helaas moet nu de client-app worden bijgewerkt vanwege wat in wezen een wijziging van de serverconfiguratie is. Dit is vooral problematisch als de server niet onder controle staat van de ontwikkelaar van de app, bijvoorbeeld als het een webdienst van een derde partij is. Deze aanpak heeft ook problemen als de app moet praten met willekeurige servers, zoals een webbrowser of e-mail app.
Om deze nadelen te ondervangen, worden servers doorgaans geconfigureerd met certificaten van bekende uitgevers, Certificate Authorities (CA’s) genaamd. et host-platform (client) bevat doorgaans een lijst van bekende CA’s die het vertrouwt. Net als een server heeft een CA een certificaat en een private sleutel. Wanneer de CA een certificaat voor een server afgeeft, ondertekent hij het servercertificaat met zijn private sleutel. De client kan dan verifiëren dat de server een certificaat heeft dat is uitgegeven door een CA die bekend is bij het platform.
Hoewel het gebruik van CA’s enkele problemen oplost, introduceert het een ander. Omdat de CA certificaten uitgeeft voor veel servers, is er nog steeds een manier nodig om er zeker van te zijn dat je praat met de server die je wilt. Om dit op te lossen identificeert het certificaat dat door de CA is uitgegeven de server met een specifieke naam zoals gmail.com of een wildcarded set van hosts zoals *.google.com.
Het volgende voorbeeld zal deze concepten wat concreter maken. In het onderstaande fragment van een commandoregel, kijkt het commando openssl tool’s s_client naar Wikipedia’s server certificaat informatie. Het specificeert poort 443 omdat dat de standaard is voor HTTPS. Het commando stuurt de uitvoer van openssl s_client naar openssl x509, dat informatie over certificaten opmaakt volgens de X.509 standaard. Meer bepaald vraagt het commando naar het onderwerp, dat de servernaaminformatie bevat, en de emittent, die de CA identificeert.
$ openssl s_client -connect wikipedia.org:443 | openssl x509 -noout -subject -issuer
subject= /serialNumber=sOrr2rKpMVP70Z6E9BT5reY008SJEdYv/C=US/O=*.wikipedia.org/OU=GT03314600/OU=See www.rapidssl.com/resources/cps (c)11/OU=Domain Control Validated - RapidSSL(R)/CN=*.wikipedia.org
issuer= /C=US/O=GeoTrust, Inc./CN=RapidSSL CA
U kunt zien dat het certificaat is uitgegeven voor servers die overeenkomen met *.wikipedia.org door de RapidSSL CA.
Zoals u kunt zien, kan de client door deze extra informatie die door de CA naar de servers wordt gestuurd, gemakkelijk weten of hij met zijn server communiceert of niet.