Lasciatemi spiegare con un esempio.
In una normale PKI basata su coppie di chiavi, ci sono la chiave privata e la chiave pubblica.
In un sistema basato sul certificato, ci sono la chiave privata e il certificato. Il certificato contiene più informazioni della chiave pubblica.
Demo (Puoi generare un certificato e una chiave privata): http://www.selfsignedcertificate.com/
Puoi scaricare il file della chiave privata e il file del certificato, vedrai che il file del certificato contiene molte informazioni come mostrato sotto.
Puoi abbinare il tuo certificato generato (aprendo con un editor di testo), e la chiave privata (aprendo con un editor di testo) da questo sito: https://www.sslshopper.com/certificate-key-matcher.html
Se il certificato corrisponde alla chiave privata del cliente, il cliente è sicuro, che il certificato è dato dal cliente o dato dall'agente di fiducia del cliente (CA).
Tuttavia, ci sono problemi nella comunicazione basata solo sulla chiave privata e sul certificato.
Perché, chiunque può generare il proprio certificato e la propria chiave privata, quindi un semplice handshake non prova nulla sul server se non che il server conosce la chiave privata che corrisponde alla chiave pubblica del certificato. Un modo per risolvere questo problema è che il client abbia un insieme di uno o più certificati di cui si fida. Se il certificato non è nell'insieme, il server non è affidabile.
Ci sono diversi lati negativi in questo semplice approccio. I server dovrebbero essere in grado di aggiornarsi a chiavi più forti nel tempo (“rotazione delle chiavi”), che sostituisce la chiave pubblica nel certificato con una nuova. Sfortunatamente, ora l'applicazione client deve essere aggiornata a causa di quello che è essenzialmente un cambiamento di configurazione del server. Questo è particolarmente problematico se il server non è sotto il controllo dello sviluppatore dell'app, per esempio, se è un servizio web di terze parti. Questo approccio ha anche problemi se l'app deve parlare con server arbitrari come un browser web o un'app di posta elettronica.
Al fine di affrontare questi aspetti negativi, i server sono tipicamente configurati con certificati da emittenti ben noti chiamati Autorità di Certificazione (CA). a piattaforma ospite (client) generalmente contiene una lista di CA ben note di cui si fida. Come un server, una CA ha un certificato e una chiave privata. Quando emette un certificato per un server, la CA firma il certificato del server usando la sua chiave privata. Il client può quindi verificare che il server abbia un certificato emesso da una CA nota alla piattaforma.
Tuttavia, pur risolvendo alcuni problemi, l'uso delle CA ne introduce un altro. Poiché la CA emette certificati per molti server, avete ancora bisogno di un modo per assicurarvi che state parlando con il server che volete. Per risolvere questo problema, il certificato emesso dalla CA identifica il server o con un nome specifico come gmail.com o con un insieme di host con caratteri jolly come *.google.com.
L'esempio seguente renderà questi concetti un po’ più concreti. Nello snippet qui sotto da una linea di comando, il comando s\client dello strumento openssl guarda le informazioni sul certificato del server di Wikipedia. Specifica la porta 443 perché è quella predefinita per HTTPS. Il comando invia l'output di openssl s_client a openssl x509, che formatta le informazioni sui certificati secondo lo standard X.509. In particolare, il comando chiede l'oggetto, che contiene le informazioni sul nome del server, e l'emittente, che 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
Puoi vedere che il certificato è stato emesso per i server corrispondenti a *.wikipedia.org dalla CA RapidSSL.
Come puoi vedere, grazie a queste informazioni aggiuntive inviate dalla CA ai server, il client può facilmente sapere se sta comunicando con il suo server o meno.