Effettuare una connessione HTTPS ad un sito è fondamentalmente fatto in questo modo:
- ottieni l'indirizzo IP per il nome host di destinazione utilizzando DNS
- connettersi con TCP a questo indirizzo IP
- fai l'handshake SSL su questa connessione TCP, che include
- opzionalmente include il nome host di destinazione con l'estensione SNI all'inizio dell'handshake (ClientHello). Questo è necessario se più server con diversi certificati condividono lo stesso indirizzo IP e la stessa porta.
- verifica il certificato ricevuto dal server nell'handshake per vedere se è attendibile e anche se è valido per il nome host di destinazione
- una volta terminato l'handshake SSL invia la richiesta HTTP all'interno di questa connessione SSL, che include tra l'altro l'intestazione Host
Ciò che si desidera in realtà è saltare la ricerca DNS (passaggio 1) perché si conosce già l'indirizzo IP della destinazione. Hai ancora bisogno di tutti gli altri passaggi, in particolare 3.1 (SNI) e 3.2 (convalida dell'hostname nel certificato).
Questo è possibile ma il modo in cui questo viene fatto dipende dal linguaggio di programmazione e dalle librerie. La maggior parte delle lingue semplifica per te solo il caso più comune (ovvero la connessione per nome host) e casi non comuni come i tuoi sono più complessi da implementare. Ad esempio in Perl puoi semplicemente utilizzare il seguente codice per collegarti a un sito tramite indirizzo IP, ma includere l'estensione SNI appropriata per il nome host di destinazione e anche controllare il certificato con il nome host:
use IO::Socket::SSL 1.971;
my $socket = IO::Socket::SSL->new(
PeerAddr => '1.2.3.4:443',
SSL_hostname => 'www.example.com'
);
Come è fatto nella lingua che hai scelto è off-topic qui e on-topic su stackoverflow.com.