Deixe-me explicar com um exemplo.
Na PKI baseada em pares de chaves normais, 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 do que a chave pública.
Demo (Você pode gerar um certificado e uma chave privada): link
Você pode fazer o download do arquivo de chave privada e do arquivo de certificado. Você verá que o arquivo de certificado contém muitas informações, conforme mostrado abaixo.
Vocêpodecombinarseucertificadogerado(aberturaporumeditordetexto)echaveprivada(aberturaporumeditordetexto)destesite: link
Se o certificado corresponder à chave privada do cliente, o cliente tem certeza de que o certificado é fornecido pelo cliente ou fornecido pelo agente confiável do cliente (CA).
No entanto, existem problemas apenas na comunicação por chave privada e por 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 confiáveis. 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 strongs 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 tem problemas se o aplicativo tiver que conversar com servidores arbitrários, como um navegador da Web ou um aplicativo de e-mail.
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 bem conhecidas nas quais ele confia. Semelhante a um servidor, uma CA tem 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 na 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 para se certificar de que está falando 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 curingas, como * .google.com.
O exemplo a seguir fará com que esses conceitos sejam um pouco mais concretos. No trecho abaixo de uma linha de comando, o comando s_client da ferramenta openssl examina as informações sobre o certificado do servidor da Wikipedia. Especifica a porta 443 porque esse é o padrão para HTTPS. O comando envia a saída do openssl s_client para o openssl x509, que formata informações sobre os certificados de acordo com o padrão X.509. Especificamente, o comando solicita o assunto, que contém as informações sobre o nome do servidor, e o emissor, que identifica a autoridade de certificação.
$ 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 que correspondem 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 com facilidade se está se comunicando com o servidor ou não.