Básicamente, hacer una conexión HTTPS a algún sitio se hace de esta manera:
- obtenga la dirección IP para el nombre de host de destino utilizando DNS
- conecte con TCP a esta dirección IP
- haga el protocolo de enlace SSL sobre esta conexión TCP, que incluye
- incluya opcionalmente el nombre de host de destino con la extensión SNI al comienzo del protocolo de enlace (ClientHello). Esto es necesario si varios servidores con certificados diferentes comparten la misma dirección IP y puerto.
- verifique el certificado recibido del servidor dentro del protocolo de enlace para ver si es de confianza y también si es válido para el nombre de host de destino
- una vez que se haya realizado el protocolo de enlace SSL, envíe la solicitud HTTP dentro de esta conexión SSL, que incluye, entre otras cosas, el encabezado del Host
Lo que realmente desea es omitir la búsqueda de DNS (paso 1) porque ya conoce la dirección IP del destino. Aún necesita todos los otros pasos, en particular 3.1 (SNI) y 3.2 (validación del nombre de host dentro del certificado).
Esto es posible, pero cómo se hace depende de su lenguaje de programación y bibliotecas. La mayoría de los idiomas solo le facilitan el caso común (es decir, conectarse por nombre de host) y los casos poco comunes como el suyo son más complejos de implementar. Por ejemplo, en Perl, simplemente puede usar el siguiente código para conectarse a un sitio por dirección IP, pero incluya la extensión SNI adecuada para el nombre de host de destino y también compare el certificado con el nombre de host:
use IO::Socket::SSL 1.971;
my $socket = IO::Socket::SSL->new(
PeerAddr => '1.2.3.4:443',
SSL_hostname => 'www.example.com'
);
La forma en que se hace esto en el idioma de su elección no es un tema aquí y es otro tema en stackoverflow.com.