Deixem-me explicar com um exemplo.
Em PKI normal baseado em pares de chaves, existem chaves privadas e chaves públicas.
Num sistema baseado em certificado, há chave privada e certificado. O certificado detém mais informação do que a chave pública.
Demo (É possível gerar um certificado e uma chave privada): http://www.selfsignedcertificate.com/
Pode descarregar o ficheiro de chave privada e o ficheiro de certificado, verá que o ficheiro de certificado contém muita informação como se mostra abaixo.
Pode combinar o certificado gerado (abertura por um editor de texto), e a chave privada (abertura por um editor de texto) a partir deste sítio: https://www.sslshopper.com/certificate-key-matcher.html
Se o certificado corresponder à chave privada do cliente, o cliente tem a certeza, esse certificado é dado pelo cliente ou dado pelo agente de confiança do cliente (CA).
No entanto, existem problemas apenas na comunicação baseada em chave privada e certificado*.
Porque, qualquer pessoa pode gerar o seu próprio certificado e chave privada, por isso um simples aperto de mão não prova nada sobre o servidor a não ser que o servidor conhece a chave privada que corresponde à chave pública do certificado. Uma forma de resolver este problema é o cliente ter um conjunto* de um ou mais certificados em que confia. Se o certificado não estiver no conjunto, o servidor não é de confiança*.
Há várias desvantagens nesta abordagem simples. Os servidores devem ser capazes de actualizar para chaves mais fortes ao longo do tempo (“rotação de chaves”), o que substitui a chave pública no certificado por uma nova. Infelizmente, agora a aplicação cliente tem de ser actualizada devido ao que é essencialmente uma mudança na configuração do servidor. Isto é especialmente problemático se o servidor não estiver sob o controlo do desenvolvedor da aplicação, por exemplo, se for um serviço web de terceiros. Esta abordagem também tem problemas se a aplicação tiver de falar com servidores arbitrários, tais como um navegador web ou uma aplicação de correio electrónico.
A fim de resolver estas desvantagens, os servidores são tipicamente configurados com certificados de emissores bem conhecidos chamados Autoridades Certificadoras (AC). a plataforma anfitriã (cliente) contém geralmente uma lista de ACs bem conhecidas em que confia. Semelhante a um servidor, uma AC tem um certificado e uma chave privada. Ao emitir um certificado para um servidor, a AC assina o certificado do servidor utilizando a sua chave privada. O cliente pode então verificar que o servidor tem um certificado emitido por uma AC conhecida da plataforma.
Contudo, ao resolver alguns problemas, a utilização de AC introduz outra. Como a AC emite certificados para muitos servidores, ainda é necessário alguma forma de se certificar de que está a falar com o servidor que pretende. Para resolver isto, o certificado emitido pela AC identifica o servidor ou com um nome específico como gmail.com ou um conjunto de hosts wildcarded como *.google.com.
O exemplo seguinte tornará estes conceitos um pouco mais concretos. No snippet abaixo, a partir de uma linha de comando, o comando openssl s_client da ferramenta s_client examina a informação do certificado do servidor da Wikipedia. Especifica a porta 443 porque essa é a predefinição para HTTPS. O comando envia a saída do openssl s_client para openssl x509, que formata informação sobre certificados de acordo com a norma X.509. Especificamente, o comando pede o assunto, que contém a informação do nome do servidor, e o emissor, que identifica a AC.
$ 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
Pode ver que o certificado foi emitido para servidores correspondentes a *.wikipedia.org pela RapidSSL CA.
Como pode ver, devido a esta informação adicional enviada pela CA aos Servidores, o cliente pode facilmente saber se está ou não a comunicar com o seu servidor.