Pozwól, że wyjaśnię to na przykładzie.
W normalnym PKI opartym na parze kluczy istnieją klucz prywatny i klucz publiczny.
W systemie opartym na certyfikatach mamy do czynienia z kluczem prywatnym i certyfikatem. Certyfikat zawiera więcej informacji niż klucz publiczny.
Demo (Można wygenerować certyfikat i klucz prywatny): http://www.selfsignedcertificate.com/
Możesz pobrać otwarty plik klucza prywatnego i plik certyfikatu, widzisz, że plik certyfikatu zawiera wiele informacji, jak pokazano poniżej.
Możesz dopasować swój wygenerowany certyfikat (otwierając go za pomocą edytora tekstu), oraz klucz prywatny (otwierając go za pomocą edytora tekstu) z tej strony: https://www.sslshopper.com/certificate-key-matcher.html
Jeśli certyfikat pasuje do klucza prywatnego klienta, klient jest pewien, że certyfikat jest wystawiony przez klienta lub przez zaufanego agenta klienta (CA).
Jednakże istnieją problemy w komunikacji opartej tylko na kluczu prywatnym i certyfikacie.
Ponieważ każdy może wygenerować swój własny certyfikat i klucz prywatny, więc zwykły handshake nie udowadnia niczego o serwerze poza tym, że serwer zna klucz prywatny, który pasuje do klucza publicznego certyfikatu. Jednym ze sposobów rozwiązania tego problemu jest posiadanie przez klienta zestawu jednego lub więcej certyfikatów, którym ufa. Jeśli certyfikat nie znajduje się w tym zestawie, serwer nie jest godny zaufania.
Jest kilka minusów tego prostego podejścia. Serwery powinny mieć możliwość aktualizacji kluczy do silniejszych z czasem (“key rotation”), co powoduje zastąpienie klucza publicznego w certyfikacie nowym. Niestety, teraz aplikacja kliencka musi być aktualizowana z powodu tego, co jest w zasadzie zmianą konfiguracji serwera. Jest to szczególnie problematyczne, jeśli serwer nie jest pod kontrolą twórcy aplikacji, na przykład jeśli jest to usługa sieciowa strony trzeciej. To podejście ma również problemy, jeśli aplikacja musi rozmawiać z arbitralnymi serwerami, takimi jak przeglądarka internetowa lub aplikacja poczty elektronicznej.
W celu rozwiązania tych problemów, serwery są zazwyczaj skonfigurowane z certyfikatami od dobrze znanych wystawców zwanych Certificate Authorities (CA). Podobnie jak serwer, CA posiada certyfikat i klucz prywatny. Podczas wystawiania certyfikatu dla serwera, CA podpisuje certyfikat serwera przy użyciu swojego klucza prywatnego. Klient może wtedy zweryfikować, czy serwer posiada certyfikat wydany przez CA znany platformie.
Jednak użycie CA rozwiązuje pewne problemy, ale wprowadza kolejne. Ponieważ CA wystawia certyfikaty dla wielu serwerów, nadal potrzebujesz jakiegoś sposobu, aby upewnić się, że rozmawiasz z tym serwerem, z którym chcesz. Aby rozwiązać ten problem, certyfikat wydany przez CA identyfikuje serwer albo za pomocą konkretnej nazwy, takiej jak gmail.com, albo za pomocą wieloznacznego zestawu hostów, np.
Poniższy przykład pozwoli nieco bardziej skonkretyzować te pojęcia. W poniższym fragmencie z wiersza poleceń polecenie sclient narzędzia openssl przegląda informacje o certyfikacie serwera Wikipedii. Podaje port 443, ponieważ jest to port domyślny dla HTTPS. Polecenie wysyła wynik działania openssl sclclient do openssl x509, który formatuje informacje o certyfikatach zgodnie ze standardem X.509. W szczególności, polecenie prosi o podanie tematu (subject), który zawiera informacje o nazwie serwera, oraz wystawcy (issuer), który identyfikuje CA.
$ 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
Widać, że certyfikat został wydany przez RapidSSL CA dla serwerów pasujących do adresu wikipedia.org.
Jak widać, dzięki tym dodatkowym informacjom wysyłanym przez CA do serwerów, klient może łatwo zorientować się, czy komunikuje się ze swoim serwerem, czy nie.