¿Es posible que SSL compruebe el nombre de host del certificado con el encabezado HTTP del "host" en lugar de la URL?

0

Esta es una pequeña pregunta de seguimiento para verificación SSL del nombre de host del servidor https

Estoy intentando solicitar una página a través de HTTPS directamente desde una IP en lugar de un nombre de host. Con respecto a las respuestas a la pregunta anterior, entiendo por qué el certificado se basa en el nombre de host en lugar de IP. Sin embargo, todavía quiero solicitar la página directamente desde la IP en lugar de un nombre de host, básicamente omitiendo la búsqueda de DNS.

Por lo que sé, la única forma de hacerlo es evitar la validación del certificado. Obviamente no es el método más seguro. ¿Hay alguna manera de hacer que SSL verifique el certificado con el nombre de host (conocido por el cliente) mientras sigue solicitando una IP directamente?

    
pregunta Jad S 28.10.2016 - 17:32
fuente

2 respuestas

3

Básicamente, hacer una conexión HTTPS a algún sitio se hace de esta manera:

  1. obtenga la dirección IP para el nombre de host de destino utilizando DNS
  2. conecte con TCP a esta dirección IP
  3. haga el protocolo de enlace SSL sobre esta conexión TCP, que incluye
    1. 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.
    2. 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
  4. 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.

    
respondido por el Steffen Ullrich 28.10.2016 - 20:09
fuente
0

Los certificados se emiten para nombres de dominio completos y no para direcciones IP. No puede cambiar la lógica solo para validar el encabezado Host: Sin embargo, siempre puedes ignorar el error que es 'Common Name doesn't match FQDN'

    
respondido por el hax 28.10.2016 - 20:23
fuente

Lea otras preguntas en las etiquetas