Deixe-me explicar com um exemplo.
Na PKI normal baseada em par de chaves, há chave privada e chave pública.
Em um sistema baseado em certificado, há chave privada e certificado. O certificado contém mais informações que a chave pública.
Demonstração (você pode gerar um certificado e uma chave privada): http://www.selfsignedcertificate.com/
Você pode fazer o download, abrir o arquivo de chave privada e o arquivo de certificado. Você verá que o arquivo de certificado contém muitas informações, como mostrado abaixo.
Você pode combinar seu certificado gerado (abrindo por um editor de texto) e a chave privada (abrindo por um editor de texto) neste site: https://www.sslshopper.com/certificate-key-matcher.html
Se o certificado corresponder à chave privada do cliente, ele terá certeza de que esse certificado é fornecido pelo cliente ou fornecido pelo CA (agente confiável) do cliente.
No entanto, existem problemas apenas na chave privada e na comunicação baseada em certificado .
Como qualquer pessoa pode gerar seu próprio certificado e chave privada, um simples handshake não prova nada sobre o servidor, exceto que o servidor conhece a chave privada que corresponde à chave pública do certificado. Uma maneira de resolver esse problema é fazer com que o cliente tenha um conjunto de um ou mais certificados nos quais confia. Se o certificado não estiver no conjunto, o servidor não é confiável .
Existem várias desvantagens nessa abordagem simples. Os servidores devem poder atualizar para chaves mais fortes ao longo do tempo ("rotação de chaves"), que substitui a chave pública no certificado por uma nova. Infelizmente, agora o aplicativo cliente precisa ser atualizado devido ao que é essencialmente uma alteração na configuração do servidor. Isso é especialmente problemático se o servidor não estiver sob o controle do desenvolvedor do aplicativo, por exemplo, se for um serviço da web de terceiros. Essa abordagem também apresenta problemas se o aplicativo precisar conversar com servidores arbitrários, como um navegador da Web ou um aplicativo de email.
Para resolver essas desvantagens, os servidores geralmente são configurados com certificados de emissores conhecidos chamados Autoridades de Certificação (CAs). A plataforma host (cliente) geralmente contém uma lista de CAs conhecidas em que confia. Semelhante a um servidor, uma CA possui um certificado e uma chave privada. Ao emitir um certificado para um servidor, a CA assina o certificado do servidor usando sua chave privada. O cliente pode então verificar se o servidor possui um certificado emitido por uma autoridade de certificação conhecida pela plataforma.
No entanto, ao resolver alguns problemas, o uso de CAs introduz outro. Como a CA emite certificados para muitos servidores, você ainda precisa de alguma maneira de verificar se está conversando com o servidor que deseja. Para resolver isso, o certificado emitido pela CA identifica o servidor com um nome específico, como gmail.com, ou um conjunto de hosts com caracteres curinga, como * .google.com.
O exemplo a seguir tornará esses conceitos um pouco mais concretos. No fragmento abaixo de uma linha de comando, o comando s_client da ferramenta openssl examina as informações de certificado do servidor da Wikipedia. Ele especifica a porta 443 porque esse é o padrão para HTTPS. O comando envia a saída de openssl s_client para openssl x509, que formata informações sobre certificados de acordo com o padrão X.509. Especificamente, o comando solicita o assunto, que contém as informações do nome do servidor, e o emissor, que identifica a 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
Você pode ver que o certificado foi emitido para servidores correspondentes a * .wikipedia.org pela CA RapidSSL.
Como você pode ver, devido a essas informações adicionais enviadas pela CA aos servidores, o cliente pode saber facilmente se está se comunicando com o servidor ou não.