Позвольте мне объяснить на примере.
В нормальной паре ключей PKI, основанной на закрытом и открытом ключах, существуют закрытый и открытый ключи.
В системе, основанной на сертификатах, есть закрытый ключ и сертификат. Сертификат содержит больше информации, чем открытый ключ.
Демонстрация (Вы можете сгенерировать сертификат и закрытый ключ): http://www.selfsignedcertificate.com/
Вы можете загрузить открытый файл приватного ключа и файл сертификата, файл сертификата содержит много информации, как показано ниже.
Вы можете сопоставить сгенерированный вами сертификат (открываемый текстовым редактором) и частный ключ (открываемый текстовым редактором) с этого сайта: https://www.sslshopper.com/certificate-key-matcher.html
Если сертификат соответствует личному ключу клиента, клиент уверен, что этот сертификат предоставлен клиентом или выдан доверенным агентом (CA) клиента.
Как бы то ни было, существуют проблемы только с личным ключом и взаимодействием на основе сертификатов.
Потому что любой может сгенерировать свой сертификат и личный ключ, поэтому простое рукопожатие ничего не доказывает о сервере, кроме того, что сервер знает личный ключ, который соответствует публичному ключу сертификата. Одним из способов решения этой проблемы является наличие у клиента набора одного или нескольких сертификатов, которым он доверяет. Если сертификата нет в наборе, серверу нельзя доверять.
Есть несколько недостатков этого простого подхода. Со временем серверы должны иметь возможность апгрейда до более сильных ключей (“ротация ключей”), которая заменяет публичный ключ в сертификате на новый. К сожалению, теперь клиентское приложение приходится обновлять из-за того, что по сути представляет собой изменение конфигурации сервера. Это особенно проблематично, если сервер не находится под контролем разработчика приложения, например, если это веб-служба стороннего производителя. Такой подход также имеет проблемы, если приложению приходится общаться с произвольными серверами, такими как веб-браузер или почтовое приложение.
Чтобы устранить эти недостатки, серверы обычно настраиваются с помощью сертификатов от известных эмитентов под названием Certificate Authorities (CAs). он хост-платформа (клиент) обычно содержит список хорошо известных CA, которым он доверяет. Подобно серверу, CA имеет сертификат и частный ключ. При выпуске сертификата для сервера, CA подписывает сертификат сервера, используя свой закрытый ключ. Затем клиент может проверить, что сервер имеет сертификат, выданный известным ему центром сертификации.
Однако при решении некоторых проблем использование CA приводит к появлению еще одной. Так как CA выпускает сертификаты для многих серверов, вам все равно нужен какой-то способ убедиться, что вы говорите с нужным вам сервером. Для решения этой проблемы сертификат, выданный центром сертификации, идентифицирует сервер либо с определенным именем, таким как gmail.com, либо с набором узлов подстановки, таких как *.google.com.
Следующий пример сделает эти понятия немного более конкретными. В фрагменте ниже из командной строки, команда openssl инструмент s_client смотрит на информацию о сертификатах сервера Википедии. Она указывает порт 443, потому что это порт по умолчанию для HTTPS. Команда отправляет вывод openssl s_client на openssl x509, который форматирует информацию о сертификатах в соответствии со стандартом X.509. В частности, команда запрашивает субъекта, который содержит информацию об имени сервера, и издателя, который идентифицирует ЦС.
$ 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
Вы можете видеть, что сертификат был выпущен RapidSSL CA для серверов, соответствующих *.wikipedia.org.
Как вы видите, благодаря этой дополнительной информации, отправленной ЦС на серверы, клиент может легко узнать, общается ли он со своим сервером или нет.