Dejame explicarte con un ejemplo.
En la PKI normal basada en pares de claves, hay clave privada y clave pública.
En un sistema basado en certificados, hay clave privada y certificado. El certificado contiene más información que la clave pública.
Demostración (puede generar un certificado y una clave privada): http://www.selfsignedcertificate.com/
Puede descargar el archivo de clave privada y el archivo de certificado, verá que el archivo de certificado contiene mucha información como se muestra a continuación.
Puede hacer coincidir su certificado generado (abierto por un editor de texto) y la clave privada (abierto por un editor de texto) desde este sitio: https://www.sslshopper.com/certificate-key-matcher.html
Si el certificado coincide con la clave privada del cliente, el cliente está seguro de que el certificado lo otorga el cliente o el agente de confianza (CA) del cliente.
Sin embargo, solo hay problemas con la clave privada y la comunicación basada en certificados .
Porque cualquiera puede generar su propio certificado y clave privada, por lo que un simple apretón de manos no prueba nada sobre el servidor, aparte de que el servidor conoce la clave privada que coincide con la clave pública del certificado. Una forma de resolver este problema es hacer que el cliente tenga un conjunto de uno o más certificados de confianza. Si el certificado no está en el conjunto, no se puede confiar en el servidor .
Hay varios inconvenientes en este enfoque simple. Los servidores deberían poder actualizarse a claves más seguras con el tiempo ("rotación de claves"), que reemplaza la clave pública en el certificado por una nueva. Desafortunadamente, ahora la aplicación cliente debe actualizarse debido a lo que es esencialmente un cambio de configuración del servidor. Esto es especialmente problemático si el servidor no está bajo el control del desarrollador de la aplicación, por ejemplo, si es un servicio web de terceros. Este enfoque también tiene problemas si la aplicación tiene que hablar con servidores arbitrarios como un navegador web o una aplicación de correo electrónico.
Para abordar estas desventajas, los servidores generalmente se configuran con certificados de emisores conocidos llamados Autoridades de certificación (CA). La plataforma host (cliente) generalmente contiene una lista de CA bien conocidas en las que confía. Similar a un servidor, una CA tiene un certificado y una clave privada. Al emitir un certificado para un servidor, la CA firma el certificado del servidor utilizando su clave privada. El cliente puede verificar que el servidor tenga un certificado emitido por una CA conocida por la plataforma.
Sin embargo, al resolver algunos problemas, el uso de CA introduce otro. Debido a que la CA emite certificados para muchos servidores, aún necesita alguna forma de asegurarse de estar hablando con el servidor que desea. Para solucionar esto, el certificado emitido por la CA identifica al servidor con un nombre específico como gmail.com o un conjunto de hosts con comodín como * .google.com.
El siguiente ejemplo hará que estos conceptos sean un poco más concretos. En el fragmento de abajo de una línea de comando, el comando s_client de la herramienta openssl analiza la información del certificado del servidor de Wikipedia. Especifica el puerto 443 porque ese es el valor predeterminado para HTTPS. El comando envía la salida de openssl s_client a openssl x509, que formatea la información sobre los certificados de acuerdo con el estándar X.509. Específicamente, el comando solicita el asunto, que contiene la información del nombre del servidor, y el emisor, que identifica la 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
Puede ver que el certificado fue emitido para servidores que coinciden con * .wikipedia.org por RapidSSL CA.
Como puede ver, debido a esta información adicional enviada por CA a los servidores, el cliente puede saber fácilmente si se está comunicando con su servidor o no.