Cómo probar una URL HTTPS con una dirección IP dada

77

Digamos que un sitio web tiene equilibrio de carga entre varios servidores. Quiero ejecutar un comando para probar si está funcionando, como curl DOMAIN.TLD. Entonces, para aislar cada dirección IP, especifico la IP manualmente. Sin embargo, muchos sitios web pueden ser alojados en el servidor, por lo que todavía proporcionan un encabezado de host, como esto: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. Según tengo entendido, estos dos comandos crean exactamente la misma solicitud HTTP. La única diferencia es que en este último saco la parte de búsqueda de DNS de cURL y lo hago manualmente (corríjame si me equivoco).

Todo bien hasta ahora. Pero ahora quiero hacer lo mismo para una URL HTTPS. De nuevo, podría probarlo así curl https://DOMAIN.TLD. Pero quiero especificar la IP manualmente, así que ejecuto curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Ahora recibo un error de cURL:

curl: (51) SSL: certificate subject name 'DOMAIN.TLD' does not match target host name 'IP_ADDRESS'.

Por supuesto, puedo evitar esto diciéndole a cURL que no le importe el certificado (la opción "-k"), pero no es lo ideal.

¿Hay alguna manera de aislar la dirección IP a la que está conectado desde el host que está certificado por SSL?

Martín
fuente
¿Es su equilibrador de carga el punto de terminación SSL, o son las instancias individuales?
rikola
¿Alguien puede explicar por qué el encabezado Host no selecciona el VHost y el certificado correctos en el back-end para HTTPS, pero esto solo para HTTP funciona bien? ¿El cliente pasa información al back-end (usando el protocolo HTTPS) si se usó IP o dominio?
NeverEndingQueue
@NeverEndingQueue Para comprender esto, necesita conocer la relación entre TLS y HTTP. El servidor debe mostrar el certificado antes de tener acceso al Hostencabezado, por lo que --resolvees la forma correcta de anclar una dirección IP.
Franklin Yu

Respuestas:

118

Creo que encontré una solución en el manual de cURL:

curl https://DOMAIN.EXAMPLE --resolve 'DOMAIN.EXAMPLE:443:192.0.2.17'

Añadido en [curl] 7.21.3. Soporte de eliminación agregado en 7.42.0.

de CURLOPT_RESOLVE explicado

Martín
fuente
1
DOE --resolve no existe en rizo ...
JustAGuy
77
El rizo en mi máquina (7.27.0) tiene --resolve.
Theron Luhn
Puede ver que funciona usando curl -vy puede ver que curl agrega la opción de resolución a la memoria caché DNS temporalmente y agrega la dirección IP que especificó.
CMCDragonkai
CentOS 6.8 curl: opción --resolve: es desconocido curl: intente 'curl --help' o 'curl --manual' para obtener más información root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 Basic ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Protocolos: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp Características: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
Jose Nobile
Tenga en cuenta que si usa un nombre de host para IP_ADDRESS, ignorará silenciosamente la opción.
Xiong Chiamiov
11

Puede cambiar en / etc / hosts para hacer que el servidor piense que el dominio se encuentra en una determinada IP.

Esta es la sintaxis:

192.168.10.20 www.domain.tld

Esto hará que cURL use la dirección IP que desea sin que se rompa el certificado SSL.

miono
fuente
44
Eso funciona, pero estoy buscando algún método que no requiera modificar el sistema operativo en su conjunto
Martin
Sinceramente, no creo que haya otra manera. Debe obtener cURL para acceder al nombre de dominio correcto para que el certificado funcione, y la forma de asignar un determinado dominio a una IP es mediante DNS o mediante el archivo hosts.
miono
7

Aquí está la manentrada para la respuesta más votada actualmente, ya que solo incluyeron un enlace al componente programático:

--resolve <host:port:address>

    Provide  a  custom  address  for  a specific host and port pair. Using
    this, you can make the curl requests(s) use a specified address and 
    prevent the otherwise normally resolved address to be used. Consider 
    it a sort of /etc/hosts alternative provided on the command line. 
    The port number should be the number used for the specific protocol 
    the host will be used for. It means you need several entries if you 
    want to provide address for the same host but different ports.

    The provided address set by this option will be used even if -4, 
    --ipv4 or -6, --ipv6 is set to make curl use another IP version.

    This option can be used many times to add many host names to resolve.

    Added in 7.21.3.

Pero debido a la limitación dada ("Significa que necesita varias entradas si desea proporcionar la dirección para el mismo host pero diferentes puertos"), consideraría otra opción más nueva que puede traducir ambas al mismo tiempo:

--connect-to <HOST1:PORT1:HOST2:PORT2>

    For  a request to the given HOST:PORT pair, connect to 
    CONNECT-TO-HOST:CONNECT-TO-PORT instead. This option is suitable 
    to direct requests at a specific server, e.g. at a specific cluster 
    node in a cluster of servers. This option is only used to establish 
    the network connection. It does NOT affect the hostname/port that 
    is used for TLS/SSL (e.g. SNI, certificate verification) or for 
    the application protocols. "host" and "port" may be the empty string, 
    meaning "any host/port". "connect-to-host" and "connect-to-port" 
    may also be the empty string, meaning "use the request's original host/port".

    This option can be used many times to add many connect rules.

    See also --resolve and -H, --header. 
    Added in 7.49.0.
peedee
fuente
4

Si está ejecutando curl en Windows, use comillas dobles

curl https://DOMAIN.TLD --resolve "DOMAIN.TLD:443:IP_ADDRESS"

curl DOMAIN.TLD --resolve "DOMAIN.TLD:80:IP_ADDRESS"

Puede omitir el esquema / protocolo por adelantado, pero no puede omitir el número de puerto en la cadena --resolve.

davidcsloane
fuente