Prima di tutto penso che la cosa più importante che OP abbia mancato è che la negoziazione SSL / TLS avvenga prima. Solo AFTER connessione sicura è negoziata e convalidata, ci può essere qualsiasi comunicazione HTTP. HTTPS è un termine improprio, è solo il tuo semplice vecchio HTTP inviato solo su SSL / TLS completamente indipendenti.
If the real site has an SSL/TLS certificate, would that stop the
hacker from redirecting let's say google.com to their own server?
I certificati vengono controllati e TLS viene stabilito prima che avvenga qualsiasi HTTP. Con il certificato errato, la connessione non verrà mai stabilita in primo luogo. Nessuno spazio per i reindirizzamenti.
Doesn't the web server determine whether to connect via HTTP or HTTPS?
No, il client lo fa. Aprendo socket e inviando richieste HTTP in testo normale o aprendo socket, eseguendo la negoziazione SSL / TLS completa e quindi inviando la richiesta HTTP.
And DNS lookup is done before they connect to the server.
Sì, ma il client controlla il certificato rispetto al nome DNS. Quindi posso DNS spoofarti per venire da me invece di Google, ma mi servirà comunque un certificato emesso a google.com
Couldn't they just tell the client to connect via HTTP instead of HTTPS?
No. Non hanno mai la possibilità di farlo.