Como testar um URL HTTPS com um determinado endereço IP

77

Digamos que um site tenha balanceamento de carga entre vários servidores. Quero executar um comando para testar se está funcionando, como curl DOMAIN.TLD. Portanto, para isolar cada endereço IP, eu especifico o IP manualmente. Mas muitos sites podem ser hospedados no servidor, então eu ainda fornecer um cabeçalho de host, como este: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. No meu entendimento, esses dois comandos criam exatamente a mesma solicitação HTTP. A única diferença é que, no último, retiro a parte de pesquisa de DNS do cURL e faço isso manualmente (por favor, corrija-me se estiver errado).

Tudo bem até agora. Mas agora eu quero fazer o mesmo para um URL HTTPS. Mais uma vez, eu poderia testá-lo assim curl https://DOMAIN.TLD. Mas eu quero especificar o IP manualmente, então eu corro curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Agora, recebo um erro cURL:

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

É claro que posso contornar isso dizendo ao cURL para não se importar com o certificado (a opção "-k"), mas não é o ideal.

Existe uma maneira de isolar o endereço IP que está sendo conectado do host que está sendo certificado por SSL?

Martin
fonte
O seu balanceador de carga é o ponto de terminação SSL ou são as instâncias individuais?
Rikola
Alguém pode explicar por que o cabeçalho Host não seleciona o VHost e o certificado corretos no back-end para HTTPS, mas somente isso para HTTP funciona bem. O cliente passa as informações para o back-end (usando o protocolo HTTPS), se o IP foi usado ou o domínio?
NeverEndingQueue
@NeverEndingQueue Para entender isso, você precisa conhecer o relacionamento entre TLS e HTTP. O servidor precisa mostrar o certificado antes de ter acesso ao Hostcabeçalho, assim --resolveé a maneira correta de fixar um endereço IP.
Franklin Yu

Respostas:

118

Acho que encontrei uma solução passando pelo manual do cURL:

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

Adicionado em [curl] 7.21.3. Suporte de remoção adicionado em 7.42.0.

de CURLOPT_RESOLVE explicado

Martin
fonte
1
doe --resolve não existe em onda ...
JustAGuy
7
A curvatura na minha máquina (7.27.0) tem --resolve.
Theron Luhn
Você pode vê-lo funcionar curl -ve pode ver que o curl adiciona a opção de resolução ao cache do DNS temporariamente e adiciona o endereço IP especificado.
CMCDragonkai
CentOS 6.8 curl: opção --resolve: é desconhecido curl: tente 'curl --help' ou 'curl --manual' para obter mais informações root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 Protocolos básicos do ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2: tftp ftp telnet dict ldap ldap ldaps arquivo http https ftps scp sftp libz
Jose Nobile
Observe que, se você usar um nome de host IP_ADDRESS, ele ignorará silenciosamente a opção.
Xiong Chiamiov
11

Você pode alterar o arquivo / etc / hosts para fazer o servidor pensar que o domínio está localizado em um determinado IP.

Esta é a sintaxe:

192.168.10.20 www.domain.tld

Isso fará com que o cURL use o endereço IP desejado, sem que o certificado SSL seja quebrado.

miono
fonte
4
Isso funciona, mas estou procurando algum método que não exija a modificação do sistema operacional como um todo.
Martin
Sinceramente, acho que não há outra maneira. Você deve obter o cURL para acessar o nome de domínio correto para o certificado funcionar, e a maneira de mapear um determinado domínio para um IP é pelo DNS ou pelo arquivo hosts.
Miono 31/10/12
7

Aqui está a manentrada para a resposta mais votada no momento, uma vez que eles incluíram apenas um link para o 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.

Porém, devido à limitação fornecida ("Significa que você precisa de várias entradas se desejar fornecer endereço para o mesmo host, mas com portas diferentes."), Consideraria outra opção mais nova que pode traduzir as duas ao mesmo tempo:

--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
fonte
4

Se você estiver executando curl no Windows, use aspas duplas

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

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

Você pode pular o esquema / protocolo antecipadamente, mas não pode pular o número da porta na string --resolve.

davidcsloane
fonte