Pozwól mi wyjaśnić przykładem.
W zwykłej PKI opartej na parach kluczy istnieje klucz prywatny i klucz publiczny.
W systemie opartym na certyfikatach istnieje klucz prywatny i certyfikat. Certyfikat zawiera więcej informacji niż klucz publiczny.
Demo (Możesz wygenerować certyfikat i klucz prywatny): http://www.selfsignedcertificate.com/
Możesz pobrać otwórz plik klucza prywatnego i plik certyfikatu, zobaczysz, że plik certyfikatu zawiera wiele informacji, jak pokazano poniżej.
Możesz dopasować wygenerowany certyfikat (otwieranie przez edytor tekstowy) i klucz prywatny (otwieranie przez edytor tekstowy) z tej strony: https://www.sslshopper.com/certificate-key-matcher.html
Jeśli certyfikat jest zgodny z kluczem prywatnym klienta, klient jest pewien, że certyfikat ten jest nadawany przez klienta lub przez zaufanego agenta klienta (CA).
Występują jednak problemy tylko z komunikacją opartą na kluczu prywatnym i certyfikacie .
Ponieważ każdy może wygenerować własny certyfikat i klucz prywatny, więc prosty uścisk dłoni nie dowodzi niczego o serwerze poza tym, że serwer zna klucz prywatny pasujący do klucza publicznego certyfikatu. Jednym ze sposobów rozwiązania tego problemu jest posiadanie przez klienta zestawu co najmniej jednego certyfikatu, któremu ufa. Jeśli certyfikatu nie ma w zestawie, serwerowi nie można ufać .
To proste podejście ma kilka wad. Z czasem serwery powinny mieć możliwość aktualizacji do silniejszych kluczy („rotacja kluczy”), która zastępuje klucz publiczny w certyfikacie nowym. Niestety, teraz aplikacja kliencka musi zostać zaktualizowana z powodu zmiany konfiguracji serwera. Jest to szczególnie problematyczne, jeśli serwer nie znajduje się pod kontrolą dewelopera aplikacji, na przykład, jeśli jest to usługa internetowa innej firmy. Takie podejście ma również problemy, jeśli aplikacja musi rozmawiać z dowolnymi serwerami, takimi jak przeglądarka internetowa lub aplikacja e-mail.
Aby zaradzić tym wadom, serwery są zwykle konfigurowane za pomocą certyfikatów od znanych wydawców zwanych urzędami certyfikacji. Platforma hosta (klient) zazwyczaj zawiera listę dobrze znanych urzędów certyfikacji, którym ufa. Podobnie jak serwer, urząd certyfikacji ma certyfikat i klucz prywatny. Wydając certyfikat dla serwera, urząd certyfikacji podpisuje certyfikat serwera za pomocą swojego klucza prywatnego. Klient może następnie sprawdzić, czy serwer ma certyfikat wydany przez urząd certyfikacji znany platformie.
Jednak podczas rozwiązywania niektórych problemów korzystanie z urzędów certyfikacji wprowadza inne. Ponieważ urząd certyfikacji wystawia certyfikaty dla wielu serwerów, nadal potrzebujesz sposobu, aby upewnić się, że rozmawiasz z wybranym serwerem. Aby rozwiązać ten problem, certyfikat wydany przez urząd certyfikacji identyfikuje serwer za pomocą konkretnej nazwy, takiej jak gmail.com lub zestawu hostów z symbolami wieloznacznymi, takich jak * .google.com.
Poniższy przykład uczyni te pojęcia nieco bardziej konkretnymi. W poniższym fragmencie z wiersza polecenia polecenie s_client narzędzia openssl sprawdza informacje o certyfikacie serwera Wikipedii. Określa port 443, ponieważ jest to domyślny port HTTPS. Polecenie wysyła dane wyjściowe openssl s_client do openssl x509, który formatuje informacje o certyfikatach zgodnie ze standardem X.509. W szczególności polecenie pyta o podmiot, który zawiera informacje o nazwie serwera, oraz wystawcę, który identyfikuje urząd certyfikacji.
$ 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
Możesz zobaczyć, że certyfikat został wydany dla serwerów pasujących do * .wikipedia.org przez RapidSSL CA.
Jak widać, dzięki tym dodatkowym informacjom wysyłanym przez CA do serwerów, klient może łatwo wiedzieć, czy komunikuje się ze swoim serwerem, czy nie.