Lasciami spiegare con un esempio.
Nella normale PKI basata su coppie di chiavi, ci sono chiave privata e chiave pubblica.
In un sistema basato su certificati, ci sono chiave privata e certificato. Il certificato contiene più informazioni della chiave pubblica.
Demo (è possibile generare un certificato e una chiave privata): http://www.selfsignedcertificate.com/
Puoi scaricare il file della chiave privata e il file del certificato, vedi che il file del certificato contiene molte informazioni come mostrato di seguito.
È possibile abbinare il certificato generato (apertura da un editor di testo) e la chiave privata (apertura da un editor di testo) da questo sito: https://www.sslshopper.com/certificate-key-matcher.html
Se il certificato corrisponde alla chiave privata del client, il client è sicuro che quel certificato viene fornito dal client o dall'agente di fiducia (CA) del client.
Tuttavia, ci sono problemi solo nella chiave privata e nella comunicazione basata su certificati .
Perché, chiunque può generare il proprio certificato e chiave privata, quindi una semplice stretta di mano non dimostra nulla sul server diverso da quello che il server conosce la chiave privata che corrisponde alla chiave pubblica del certificato. Un modo per risolvere questo problema è quello di avere il cliente ha un insieme di uno o più certificati si fida. Se il certificato non è nel set, il server non è attendibile .
Ci sono molti aspetti negativi di questo semplice approccio. I server dovrebbero essere in grado di passare a chiavi più potenti nel tempo ("rotazione delle chiavi"), che sostituisce la chiave pubblica nel certificato con una nuova. Sfortunatamente, ora l'app client deve essere aggiornata a causa di una modifica essenzialmente alla configurazione del server. Ciò è particolarmente problematico se il server non è sotto il controllo dello sviluppatore dell'app, ad esempio se si tratta di un servizio Web di terze parti. Questo approccio ha anche problemi se l'app deve comunicare con server arbitrari come un browser Web o un'app di posta elettronica.
Al fine di affrontare questi aspetti negativi, i server sono in genere configurati con certificati di emittenti noti chiamati autorità di certificazione (CA). La piattaforma host (client) generalmente contiene un elenco di CA note di cui si fida. Simile a un server, una CA ha un certificato e una chiave privata. Quando si emette un certificato per un server, la CA firma il certificato del server utilizzando la sua chiave privata. Il client può quindi verificare che il server disponga di un certificato emesso da un'autorità di certificazione nota alla piattaforma.
Tuttavia, risolvendo alcuni problemi, l'utilizzo delle CA ne introduce un altro. Poiché la CA emette certificati per molti server, è comunque necessario un modo per assicurarsi di comunicare con il server desiderato. Per risolvere questo problema, il certificato emesso dalla CA identifica il server con un nome specifico come gmail.com o un set di host con caratteri jolly come * .google.com.
L'esempio seguente renderà questi concetti un po 'più concreti. Nello snippet di seguito da una riga di comando, il comando s_client dello strumento openssl esamina le informazioni sul certificato del server di Wikipedia. Specifica la porta 443 perché è l'impostazione 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 richiede 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 server corrispondenti a * .wikipedia.org dalla CA RapidSSL.
Come puoi vedere, grazie a queste informazioni aggiuntive inviate da CA ai server, il client può facilmente sapere se sta comunicando con il suo server o meno.