Il tuo problema è dal lato del cliente. In una connessione SSL, il client deve utilizzare la chiave pubblica del server e, pertanto, deve assicurarsi di conoscere la chiave corretta ; l'obiettivo di un utente malintenzionato sarebbe quello di indurre il cliente a utilizzare una chiave pubblica falsa. SSL definisce che il server invia la sua chiave pubblica come parte di una catena di certificati, che il client quindi convalida (il processo complesso di verificare le firme, le date, lo stato di revoca e molte estensioni). Ma un certificato valido non insegna molto al cliente come se stesso; il client deve assicurarsi di conoscere il certificato del server . Pertanto, il client deve cercare "l'identità del server prevista" nel certificato (valido).
Quindi hai due faccette importanti sull'argomento:
-
Il certificato del server deve essere valido rispetto a un determinato insieme di trust anchors (ovvero "certificati radice") che il client considera a priori .
-
Il certificato del server deve contenere la sua identità in modo da convincere il cliente.
Nel consueto contesto Web, il client è un browser Web e il fornitore del browser (o fornitore del sistema operativo) lo ha già fornito con un enorme set di "CA radice predefinita". La corrispondenza dell'identità è descritta in RFC 2818 : poiché il client tenta di connettersi a un URL che include un nome host , il client cercherà lo stesso nome host in un paio di punti del certificato (la parte CN del nome soggetto e nell'estensione Nome alt soggetto). Questo è dove "i nomi di dominio" hanno un impatto: il nome che il cliente cerca nel certificato è anche il nome che il client usa contro il DNS per sapere dove in realtà connettersi.
Se controlli sia il codice client sia il codice server , puoi scegliere il meccanismo che desideri. Il client potrebbe "conoscere" la chiave pubblica del server a priori (codificata nel codice o tramite un file di configurazione locale) e ignorare totalmente il certificato del server. Il client può convalidare il certificato per quanto riguarda qualsiasi set di CA che si ritiene opportuno, non necessariamente la stessa CA di quelli inclusi nei browser Web. Potresti mantenerlo tuo: se questo è solo per i tuoi server, la CA emetterà al massimo un paio di certificati all'anno, quindi può usare una tecnologia piuttosto rozza (vorrai tenerlo in una cassastrong, ma può usare software a basso costo e procedure manuali; vedere ad esempio EJBCA o anche OpenSSL ). E, ultimo ma non meno importante, non è necessario cercare l'identità del server negli stessi posti di quanto richiesto dalla RFC 2818. Pertanto, non vi è alcun obbligo di fare scherzi con i nomi di dominio .
Se non controlli il codice cliente (ad esempio il client è un browser Web o un codice di libreria esistente che insiste a utilizzare le stesse regole dei browser Web, ad es. RFC 2818), allora necessità, per definizione, di rispettare gli usi Web: collegamento con nomi di dominio, certificati da una CA "riconosciuta" (una che è considerata affidabile dal sistema client).