Suppongo che il modello di minaccia sia che potrebbe esserci un aggressore man-in-the-middle tra Alice e Bob, e che Alice e Bob non si trovano nella stessa sub-rete di fiducia. Questo è ciò per cui SSL / TLS è progettato per la protezione, ed è per questo che Alice dovrebbe controllare il certificato di Bob nel tuo esempio (almeno).
Dal punto di vista di Bob, controllare che la richiesta di Alice provenga da un indirizzo IP conosciuto non è di grande utilità. Gli aggressori potrebbero forgiare e modificare i pacchetti per farli apparire come provengono dall'indirizzo IP che desiderano. In seguito, anche le ricerche DNS sono inutili: tutto ciò che serve è assicurarsi di forgiare i pacchetti per utilizzare un indirizzo IP con la voce DNS corretta.
Quando Bob richiede un certificato client da Alice durante l'handshake SSL / TLS, questo farà sì che Alice invii il suo certificato e utilizzi la sua chiave privata durante l'handshake SSL / TLS per affermare la sua identità. Quando l'handshake è stato completato con successo, Bob saprà che Alice ha la chiave privata per quel certificato e dovrà verificare che si fidi di questo certificato.
Indipendentemente dal fatto che la richiesta provenga o meno da un proxy o meno, non importa quando si utilizza SSL / TLS. Un proxy HTTP si limita a tunnelare la connessione SSL / TLS dal client originale al server di destinazione.
Ciò che importa a Bob è come verificherà il certificato di Alice. In genere, questo verrà eseguito utilizzando un PKI nello stesso modo in cui Alice ha verificato il certificato di Bob, anche se questo non deve essere la stessa CA di Bob (deve essere qualcosa che si fida di Bob). Nota che non è necessario che si stia utilizzando una PKI. È possibile verificare il certificato rispetto a un determinato elenco (se Alice e Bob si sono incontrati prima, ad esempio), ma questo può essere un po 'più complesso poiché Bob potrebbe dover modificare l'elenco degli emittenti accettati che invia (ad esempio, inviare uno vuoto, che è esplicitamente consentito da TLS 1.1, ma non specificato in alcun modo nelle versioni precedenti, vedere Messaggio richiesta certificato ) e utilizzare un codice personalizzato per verificare quel certificato. (Ho implementato questo tipo di schema in passato e funziona bene.)
C'è un'eccezione a questo quando si usano quelli che chiamerei "server proxy MITM", cioè i server proxy che sono configurati per falsificare l'effettivo server SSL / TLS inserendo il proprio certificato (vedi Squid's SSL Bump ). In questo caso il certificato che Alice vede non proviene da Diginotar, ma da un'altra CA (in genere una CA aziendale quando viene eseguita su una LAN aziendale).
Anche se Alice potrebbe permettersi di fidarsi di un simile proxy MITM, l'utilizzo dell'autenticazione con certificato client SSL / TLS farebbe capire a Bob che esiste un MITM e che la connessione fallirebbe. Questo perché Alice dovrebbe firmare l'intero handshake SSL / TLS (come visto sia da Alice che da Bob) nel suo CertificateVerify
messaggio per l'autenticazione con un certificato client. Poiché il proxy MITM avrebbe sostituito il certificato di Bob, le firme inviate da Alice e Bob non corrispondevano.